[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"projectName\": \"prisma-appsync\",\n  \"projectOwner\": \"maoosi\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": true,\n  \"types\": {\n    \"creator\": {\n      \"symbol\": \"🐙\",\n      \"description\": \"Creator & maintainer\"\n    }\n  },\n  \"contributors\": [\n    {\n      \"login\": \"maoosi\",\n      \"name\": \"Sylvain\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4679377?v=4\",\n      \"profile\": \"https://sylvainsimao.fr\",\n      \"contributions\": [\n        \"creator\",\n        \"code\",\n        \"ideas\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"Tenrys\",\n      \"name\": \"Bell\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3979239?v=4\",\n      \"profile\": \"http://bell.moe\",\n      \"contributions\": [\n        \"code\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"cipriancaba\",\n      \"name\": \"Ciprian Caba\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/695515?v=4\",\n      \"profile\": \"http://www.cipriancaba.com\",\n      \"contributions\": [\n        \"code\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"tomschut\",\n      \"name\": \"Tom\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4933446?v=4\",\n      \"profile\": \"https://github.com/tomschut\",\n      \"contributions\": [\n        \"code\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"ryparker\",\n      \"name\": \"Ryan Parker\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/17558268?v=4\",\n      \"profile\": \"http://ryanparker.dev\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"cjjenkinson\",\n      \"name\": \"Cameron Jenkinson\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/5429478?v=4\",\n      \"profile\": \"https://www.cameronjjenkinson.com\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jeremy-white\",\n      \"name\": \"jeremy-white\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/42325631?v=4\",\n      \"profile\": \"https://github.com/jeremy-white\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"max-konin\",\n      \"name\": \"Max Konin\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1570356?v=4\",\n      \"profile\": \"https://github.com/max-konin\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"michachan\",\n      \"name\": \"Michael Chan\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/27760344?v=4\",\n      \"profile\": \"https://github.com/michachan\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"nhu-mai-101\",\n      \"name\": \"Nhu Mai\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/84061316?v=4\",\n      \"profile\": \"https://www.linkedin.com/in/nhu-mai/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    }\n  ],\n  \"commitConvention\": \"angular\",\n  \"contributorsPerLine\": 7,\n  \"commitType\": \"docs\"\n}\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n    \"root\": true,\n    \"extends\": \"@antfu\",\n    \"rules\": {\n        \"jsonc/indent\": [\"error\", 4, {}],\n        \"@typescript-eslint/indent\": [\n            \"error\",\n            4,\n            {\n                \"offsetTernaryExpressions\": true,\n                \"ignoredNodes\": [\"TemplateLiteral *\", \"TSTypeParameterInstantiation\"],\n                \"SwitchCase\": 1\n            }\n        ],\n        \"@typescript-eslint/consistent-type-definitions\": [\"error\", \"type\"]\n    },\n    \"globals\": {\n        \"$\": true,\n        \"chalk\": true,\n        \"cd\": true,\n        \"argv\": true,\n        \"fs\": true,\n        \"nothrow\": true\n    }\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [maoosi]\n"
  },
  {
    "path": ".github/workflows/unit-tests.yml",
    "content": "name: Unit Tests\n\non:\n  pull_request:\n    branches: [main]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout repo\n        uses: actions/checkout@v3\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v2.2.4\n        with:\n          version: 7\n\n      - name: Use Node.js 16\n        uses: actions/setup-node@v3\n        with:\n          node-version: 16\n          cache: \"pnpm\"\n\n      - name: Install global dependencies\n        run: \"pnpm add -g zx\"\n\n      - name: Install project dependencies\n        run: \"pnpm install\"\n\n      - name: Run tests\n        run: \"pnpm run test\"\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\nnode_modules/\n*/**/node_modules/\n\n# Testing\ntests/prisma/generated/\nplayground/\ndebug/\n\n# Dist folder\ndist/\n\n# Docs\ndocs/.vitepress/dist/\ndocs/.vitepress/cache/\ntmp.md\n\n# Boilerplate files\npackages/boilerplate/cdk/*.lock\npackages/boilerplate/cdk/cdk.out\n\n# Log files\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Editor directories and files\n.idea\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw*\n"
  },
  {
    "path": ".markdownlint.json",
    "content": "{\n    \"default\": true,\n    \"no-inline-html\": false,\n    \"line-length\": false,\n    \"no-trailing-punctuation\": false\n}\n"
  },
  {
    "path": ".npmignore",
    "content": ".DS_Store\nnode_modules/\n*/**/node_modules/\n\n# Source files\npackages/\nbin/\ntests/\nplayground/\ndocs/\n.editorconfig\n.eslintrc\n.markdownlint.json\n.prettierignore\n.prettierrc.cjs\ntsconfig.json\n\n# Package cache files\npackage-*.json\npnpm-*.yaml\n\n# Log files\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# Workspace\npnpm-workspace.yaml\nvite.config.ts\n\n# Installer\ndist/installer\n\n# Editor directories and files\n.idea\n.vscode\n.github\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw*\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n    \"recommendations\": [\n        \"dbaeumer.vscode-eslint\",\n        \"johnpapa.vscode-peacock\"\n    ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    // Visuals\n    \"peacock.color\": \"#1f08f6\",\n    \"workbench.colorCustomizations\": {\n        \"activityBar.activeBackground\": \"#4b38f9\",\n        \"activityBar.activeBorder\": \"#f95745\",\n        \"activityBar.background\": \"#4b38f9\",\n        \"activityBar.foreground\": \"#e7e7e7\",\n        \"activityBar.inactiveForeground\": \"#e7e7e799\",\n        \"activityBarBadge.background\": \"#f95745\",\n        \"activityBarBadge.foreground\": \"#15202b\",\n        \"sash.hoverBorder\": \"#4b38f9\",\n        \"statusBar.background\": \"#1f08f6\",\n        \"statusBar.foreground\": \"#e7e7e7\",\n        \"statusBarItem.hoverBackground\": \"#4b38f9\",\n        \"statusBarItem.remoteBackground\": \"#1f08f6\",\n        \"statusBarItem.remoteForeground\": \"#e7e7e7\",\n        \"titleBar.activeBackground\": \"#1f08f6\",\n        \"titleBar.activeForeground\": \"#e7e7e7\",\n        \"titleBar.inactiveBackground\": \"#1f08f699\",\n        \"titleBar.inactiveForeground\": \"#e7e7e799\",\n        \"commandCenter.border\": \"#e7e7e799\"\n    },\n\n    // ESLint config\n    \"eslint.codeAction.showDocumentation\": {\n        \"enable\": true\n    },\n    \"eslint.probe\": [\n        \"javascript\",\n        \"typescript\",\n        \"javascriptreact\",\n        \"typescriptreact\",\n        \"vue\",\n        \"html\",\n        \"markdown\",\n        \"json\",\n        \"jsonc\",\n        \"json5\"\n    ],\n    \"prettier.enable\": false,\n\n    // Editor\n    \"editor.formatOnSave\": false,\n    \"editor.accessibilitySupport\": \"off\",\n    \"editor.cursorSmoothCaretAnimation\": \"on\",\n    \"editor.find.addExtraSpaceOnTop\": false,\n    \"editor.guides.bracketPairs\": \"active\",\n    \"editor.inlineSuggest.enabled\": true,\n    \"editor.lineNumbers\": \"interval\",\n    \"editor.multiCursorModifier\": \"ctrlCmd\",\n    \"editor.renderWhitespace\": \"boundary\",\n    \"editor.suggestSelection\": \"first\",\n    \"editor.tabSize\": 4,\n    \"editor.unicodeHighlight.invisibleCharacters\": false,\n    \"editor.codeActionsOnSave\": {\n        \"source.fixAll\": \"never\",\n        \"source.fixAll.eslint\": \"explicit\",\n        \"source.organizeImports\": \"never\"\n    },\n    \"[markdown]\": {\n        \"editor.formatOnSave\": false\n    },\n    \"[prisma]\": {\n        \"editor.defaultFormatter\": \"Prisma.prisma\",\n        \"editor.formatOnSave\": true\n    },\n    \"files.eol\": \"\\n\",\n    \"typescript.tsdk\": \"node_modules/typescript/lib\",\n\n    // Grammarly\n    \"grammarly.selectors\": [\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/changelog/1.0.0-rc.1.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/contributing.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/essentials/concept.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/essentials/getting-started.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/advanced/securing-api.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/advanced/extending-api.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"README.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/advanced/hooks.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/changelog/1.0.0-rc.4.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/changelog/1.0.0-rc.5.md\"\n        },\n        {\n            \"language\": \"markdown\",\n            \"scheme\": \"file\",\n            \"pattern\": \"docs/changelog/1.0.0-rc.6.md\"\n        }\n    ]\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n[prisma-appsync.vercel.app/changelog/](https://prisma-appsync.vercel.app/changelog/)"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n[prisma-appsync.vercel.app/contributing.html](https://prisma-appsync.vercel.app/contributing.html)"
  },
  {
    "path": "LICENSE.txt",
    "content": "BSD 2-Clause License\n\nCopyright (c) 2024, Sylvain Simao <hello@sylvainsimao.fr>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n    <img width=\"250\" height=\"250\" src=\"https://prisma-appsync.vercel.app/logo.png\" alt=\"Prisma-AppSync\" />\n</p>\n\n# Prisma-AppSync &middot; [![TypeScript](https://img.shields.io/badge/-TypeScript-2D3748?logo=typescript&colorA=0096ff&logoColor=fff)](/packages/client/src/) [![AWS AppSync](https://img.shields.io/badge/-AWS%20AppSync-2D3748?logo=amazon-aws&colorA=EB5F05&logoColor=fff)](https://aws.amazon.com/appsync/) [![Prisma](https://img.shields.io/badge/-Prisma%20Generator-2D3748?logo=prisma&colorA=5B67D8&logoColor=fff)](https://www.prisma.io)\n\n**Prisma-AppSync** turns your [Prisma&#160;Schema](https://www.prisma.io) into a fully-featured GraphQL&#160;API, tailored for [AWS&#160;AppSync](https://aws.amazon.com/appsync/).\n\n## ✔️ Features\n\n💎 **Use your ◭ Prisma Schema**<br/>Quickly define your data model and deploy a GraphQL API tailored for AWS AppSync.\n\n⚡️ **Auto-generated CRUD operations**<br/>Using Prisma syntax, with a robust TS Client designed for AWS Lambda Resolvers.\n\n⛑ **Pre-configured security**<br/>Built-in XSS protection, query depth limitation, and in-memory rate limiting.\n\n🔐 **Fine-grained ACL and authorization**<br/>Flexible security options such as API keys, IAM, Cognito, and more.\n\n🔌 **Fully extendable features**<br/>Customize your GraphQL schema, API resolvers, and data flow as needed.\n\n## 🚀 Getting started\n\nRun the following command and follow the prompts 🙂\n\n```shell\nnpx create-prisma-appsync-app@latest\n```\n\n## 📓 Documentation\n\n[Read the documentation](https://prisma-appsync.vercel.app) to learn how to use Prisma-AppSync.\n\n## 🙏 Contributors\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100px;\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#creator-maoosi\" title=\"Creator & maintainer\">🐙</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://bell.moe\"><img src=\"https://avatars.githubusercontent.com/u/3979239?v=4?s=100\" width=\"100px;\" alt=\"Bell\"/><br /><sub><b>Bell</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=Tenrys\" title=\"Code\">💻</a> <a href=\"#ideas-Tenrys\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.cipriancaba.com\"><img src=\"https://avatars.githubusercontent.com/u/695515?v=4?s=100\" width=\"100px;\" alt=\"Ciprian Caba\"/><br /><sub><b>Ciprian Caba</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=cipriancaba\" title=\"Code\">💻</a> <a href=\"#ideas-cipriancaba\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tomschut\"><img src=\"https://avatars.githubusercontent.com/u/4933446?v=4?s=100\" width=\"100px;\" alt=\"Tom\"/><br /><sub><b>Tom</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=tomschut\" title=\"Code\">💻</a> <a href=\"#ideas-tomschut\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://ryanparker.dev\"><img src=\"https://avatars.githubusercontent.com/u/17558268?v=4?s=100\" width=\"100px;\" alt=\"Ryan Parker\"/><br /><sub><b>Ryan Parker</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=ryparker\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.cameronjjenkinson.com\"><img src=\"https://avatars.githubusercontent.com/u/5429478?v=4?s=100\" width=\"100px;\" alt=\"Cameron Jenkinson\"/><br /><sub><b>Cameron Jenkinson</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=cjjenkinson\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jeremy-white\"><img src=\"https://avatars.githubusercontent.com/u/42325631?v=4?s=100\" width=\"100px;\" alt=\"jeremy-white\"/><br /><sub><b>jeremy-white</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=jeremy-white\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/max-konin\"><img src=\"https://avatars.githubusercontent.com/u/1570356?v=4?s=100\" width=\"100px;\" alt=\"Max Konin\"/><br /><sub><b>Max Konin</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=max-konin\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/michachan\"><img src=\"https://avatars.githubusercontent.com/u/27760344?v=4?s=100\" width=\"100px;\" alt=\"Michael Chan\"/><br /><sub><b>Michael Chan</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=michachan\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.linkedin.com/in/nhu-mai/\"><img src=\"https://avatars.githubusercontent.com/u/84061316?v=4?s=100\" width=\"100px;\" alt=\"Nhu Mai\"/><br /><sub><b>Nhu Mai</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=nhu-mai-101\" title=\"Code\">💻</a></td>\n    </tr>\n  </tbody>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nWanting to help? Get started with our [contribution guide](https://prisma-appsync.vercel.app/contributing.html) or consider [💛 Github sponsors](https://github.com/sponsors/maoosi).\n\n## 🌟 Sponsors\n\n**Thanks go to these wonderful sponsors!**\n\n[![Kuizto — The Everyday Cooking App](https://prisma-appsync.vercel.app/sponsors/kuizto-banner.png \"Kuizto — The Everyday Cooking App\")](https://kuizto.co/?utm_source=prisma_appsync&utm_medium=github)\n\n[Kuizto.co](https://kuizto.co/?utm_source=prisma_appsync&utm_medium=github) is a cooking app that adds a unique twist to everyday cooking. Netflix-like feed to explore tailored recipes. Get inspired by others, save to cooklists, plan instantly!\n"
  },
  {
    "path": "bin/build.mjs",
    "content": "#!/usr/bin/env zx\n/* eslint-disable no-console */\n/* eslint-disable n/prefer-global/process */\nimport './env.mjs'\n\ntry {\n    // cleanup previous generated files\n    console.log(chalk.blue('\\n🧹 [chore] cleanup\\n'))\n    await $`rm -rf dist`.quiet()\n\n    if (!argv?.ignoreGenerator) {\n        console.log(chalk.blue('🛠️  [build] packages/generator'))\n\n        // build Prisma-AppSync Generator\n        await $`esbuild packages/generator/src/index.ts --bundle --format=cjs --keep-names --platform=node --target=node18 --external:fsevents --external:_http_common --outfile=dist/generator.js --define:import.meta.url='_importMetaUrl' --banner:js=\"const _importMetaUrl=require('url').pathToFileURL(__filename)\"`.quiet()\n    }\n\n    if (!argv?.ignoreClient) {\n        console.log(chalk.blue('🛠️  [build] packages/client'))\n\n        // build Prisma-AppSync Client\n        await $`esbuild packages/client/src/index.ts --bundle '--define:process.env.NODE_ENV=\"production\"' --format=cjs --minify --keep-names --platform=node --target=node18 --external:fsevents --external:@prisma/client --outfile=dist/client/index.js --legal-comments=inline`.quiet()\n\n        console.log(chalk.blue('🛠️  [build] packages/client types'))\n\n        // build Prisma-AppSync Client TS Declarations\n        await $`tsc packages/client/src/*.ts --outDir dist/client/ --declaration --emitDeclarationOnly --esModuleInterop --downlevelIteration`.nothrow().quiet()\n    }\n\n    if (!argv?.ignoreInstaller) {\n\n        if (process.env.COMPILE_MODE === 'preview') {\n            console.log(chalk.blue('🛠️  [build] packages/installer (preview mode)'))\n\n            // build installer (preview mode)\n            await $`esbuild packages/installer/src/index.ts --bundle '--define:process.env.NODE_ENV=\"production\"' '--define:process.env.COMPILE_MODE=\"preview\"' --format=cjs --minify --keep-names --platform=node --target=node18 --external:fsevents --external:_http_common --outfile=dist/installer/bin/index.js`.quiet()\n        }\n        else {\n            console.log(chalk.blue('🛠️  [build] packages/installer'))\n\n            // build installer (default)\n            await $`esbuild packages/installer/src/index.ts --bundle '--define:process.env.NODE_ENV=\"production\"' --format=cjs --minify --keep-names --platform=node --target=node18 --external:fsevents --external:_http_common --outfile=dist/installer/bin/index.js`.quiet()\n        }\n    }\n\n    if (!argv?.ignoreServer) {\n        console.log(chalk.blue('🛠️  [build] packages/server'))\n\n        // build server\n        await $`esbuild packages/server/src/index.ts --bundle --format=cjs --minify --keep-names --platform=node --target=node18 --external:fsevents --external:@prisma/client --external:amplify-appsync-simulator --external:_http_common --outfile=dist/server/index.js`.quiet()\n\n        // build server TS Declarations\n        await $`cp packages/server/src/index.d.ts dist/server/index.d.ts && chmod -R 755 dist`.quiet()\n\n        // copy server .vtl files into build folder\n        await $`cp -R packages/server/src/*.vtl dist/server && chmod -R 755 dist`.quiet()\n    }\n}\ncatch (error) {\n    console.log(chalk.red(`🚨 [build] error\\n\\n${error}`))\n}\n"
  },
  {
    "path": "bin/cleans.mjs",
    "content": "#!/usr/bin/env zx\nimport './env.mjs'\n\nconsole.log(chalk.blue('\\n🧹 [chore] deleting all `node_modules` folders\\n'))\nawait $`find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +`\n\nconsole.log(chalk.blue('🧹 [chore] deleting all `dist` folders\\n'))\nawait $`find . -name 'dist' -type d -prune -exec rm -rf '{}' +`\n\nconsole.log(chalk.blue('🧹 [chore] deleting all `cdk.out` folders\\n'))\nawait $`find . -name 'cdk.out' -type d -prune -exec rm -rf '{}' +`\n\nconsole.log(chalk.blue('🧹 [chore] deleting all `generated` folders\\n'))\nawait $`find . -name 'generated' -type d -prune -exec rm -rf '{}' +`\n\nconsole.log(chalk.blue('🧹 [chore] deleting all `yarn.lock` files\\n'))\nawait $`find . -name 'yarn.lock' -type f -prune -exec rm -rf '{}' +`\n\nconsole.log(chalk.blue('🧹 [chore] deleting all `pnpm-lock.yaml` files\\n'))\nawait $`find . -name 'pnpm-lock.yaml' -type f -prune -exec rm -rf '{}' +`\n\nconsole.log(chalk.blue('\\n📦 [install] re-installing all dependencies\\n'))\nawait $`pnpm install`\n"
  },
  {
    "path": "bin/dev.mjs",
    "content": "#!/usr/bin/env zx\nimport './env.mjs'\n\n// path\nconst playgroundPath = 'playground'\n\n// reset\nif (argv?.reset) {\n    console.log(chalk.blue('\\n💻 [dev] reset `playground` dir'))\n    await fs.remove(playgroundPath)\n}\n\n// build project\nawait $`zx bin/build.mjs`\n\n// install\nconst playgroundExists = await fs.pathExists(playgroundPath)\nconsole.log('')\n\nif (!playgroundExists) {\n    console.log(chalk.blue('💻 [dev] create `playground` dir'))\n    await fs.ensureDir(playgroundPath)\n\n    console.log(chalk.blue('💻 [dev] run installer'))\n    cd(playgroundPath)\n    process.env.INSTALL_MODE = 'contributor'\n    await $`node ../dist/installer/bin/index.js`\n}\nelse {\n    console.log(chalk.blue('💻 [dev] run prisma generate\\n'))\n    cd(playgroundPath)\n    await $`npx prisma generate`\n}\n\n// start dev server\nconsole.log(chalk.blue('💻 [dev] start dev server\\n'))\nawait $`yarn dev`\n"
  },
  {
    "path": "bin/env.mjs",
    "content": "#!/usr/bin/env zx\n\nprocess.env.FORCE_COLOR = 3\n"
  },
  {
    "path": "bin/postinstall.mjs",
    "content": "#!/usr/bin/env zx\nimport './env.mjs'\n\n// set DATABASE_URL env variable to docker instance\nprocess.env.DATABASE_URL = 'postgresql://prisma:prisma@localhost:5433/tests'\n\n// install boilerplate dependencies using Yarn\nconsole.log(chalk.blue('\\n📦 [post-install] install cdk boilerplate dependencies\\n'))\nawait $`cd packages/boilerplate/cdk && yarn install`\n"
  },
  {
    "path": "bin/publish/_pkg.core.cleanse.js",
    "content": "const fs = require('fs')\nconst path = require('path')\n\n// Define absolute paths for original pkg and temporary pkg.\nconst ORIG_PKG_PATH = path.resolve(__dirname, '../../package.json')\nconst BACKUP_PKG_PATH = path.resolve(__dirname, '../../package-beforePublish.json')\nconst RESTORE_PKG_PATH = path.resolve(__dirname, '../../package-afterPublish.json')\n\n// Obtain original `package.json` contents.\nconst pkgData = require(ORIG_PKG_PATH)\n\n// Write/cache the original `package.json` data to `package-beforePublish.json` file.\nfs.writeFile(BACKUP_PKG_PATH, JSON.stringify(pkgData, null, 4), (err) => {\n    if (err)\n        throw err\n})\n\n// Write/cache the original `package.json` data to `package-afterPublish.json` file.\nfs.writeFile(RESTORE_PKG_PATH, JSON.stringify(pkgData, null, 4), (err) => {\n    if (err)\n        throw err\n})\n\n// Remove all scripts from the scripts section.\ndelete pkgData.scripts\n\n// Remove all pkgs from the devDependencies section.\ndelete pkgData.devDependencies\n\n// Remove pnpm engine\ndelete pkgData.engines.pnpm\n\n// Overwrite original `package.json` with new data (i.e. minus the specific data).\nfs.writeFile(ORIG_PKG_PATH, JSON.stringify(pkgData, null, 4), (err) => {\n    if (err)\n        throw err\n})\n"
  },
  {
    "path": "bin/publish/_pkg.core.restore.js",
    "content": "const fs = require('fs')\nconst path = require('path')\n\n// Define absolute paths for original pkg and temporary pkg.\nconst ORIG_PKG_PATH = path.resolve(__dirname, '../../package.json')\nconst BACKUP_PKG_PATH = path.resolve(__dirname, '../../package-beforePublish.json')\nconst RESTORE_PKG_PATH = path.resolve(__dirname, '../../package-afterPublish.json')\n\n// Obtain original/cached contents (with new version) from `package-afterPublish`.\nconst pkgData = `${JSON.stringify(require(RESTORE_PKG_PATH), null, 4)}\\n`\n\n// Write data from `package-afterPublish` back to original `package.json`.\nfs.writeFile(ORIG_PKG_PATH, pkgData, (err) => {\n    if (err)\n        throw err\n})\n\n// Delete the temporary `package-beforePublish` file.\nfs.unlink(BACKUP_PKG_PATH, (err) => {\n    if (err)\n        throw err\n})\n\n// Delete the temporary `package-afterPublish` file.\nfs.unlink(RESTORE_PKG_PATH, (err) => {\n    if (err)\n        throw err\n})\n"
  },
  {
    "path": "bin/publish/_pkg.installer.cleanse.js",
    "content": "const fs = require('fs')\nconst path = require('path')\n\n// Define absolute paths for original pkg and temporary pkg.\nconst SRC_PKG_PATH = path.resolve(__dirname, '../../packages/installer/package.json')\nconst DEST_PKG_PATH = path.resolve(__dirname, '../../dist/installer/package.json')\n\n// Obtain original `package.json` contents.\nconst pkgData = require(SRC_PKG_PATH)\n\n// Remove all scripts from the scripts section.\ndelete pkgData.scripts\n\n// Remove all pkgs from the dependencies section.\ndelete pkgData.dependencies\n\n// Remove all pkgs from the devDependencies section.\ndelete pkgData.devDependencies\n\n// Remove private tag\ndelete pkgData.private\n\n// Create new `package.json` with new data (i.e. minus the specific data).\nfs.writeFile(DEST_PKG_PATH, JSON.stringify(pkgData, null, 4), (err) => {\n    if (err)\n        throw err\n})\n"
  },
  {
    "path": "bin/publish.mjs",
    "content": "#!/usr/bin/env zx\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport Listr from 'listr'\nimport prompts from 'prompts'\n\nawait $`zx bin/env.mjs`\n\n$.verbose = false\n\nasync function getPublishConfig() {\n    const { tag } = await prompts({\n        type: 'select',\n        name: 'tag',\n        message: 'Select publish tag',\n        choices: [\n            { title: 'preview', value: 'preview' },\n            { title: 'latest', value: 'latest' },\n        ],\n        initial: 0,\n    })\n\n    if (!tag)\n        process.exit()\n\n    let latestPublished = '0.0.9'\n\n    try {\n        latestPublished = String(await $`npm show prisma-appsync@${tag} version`)?.trim()\n    }\n    catch (err) {\n        try { latestPublished = String(await $`npm show prisma-appsync version`)?.trim() }\n        catch (err) {}\n    }\n\n    const minorPos = latestPublished.lastIndexOf('.')\n\n    const possibleFutureVersion = `${latestPublished.slice(0, minorPos)}.${\n        parseInt(latestPublished.slice(minorPos + 1)) + 1\n    }`\n\n    const { publishVersion } = await prompts({\n        type: 'text',\n        name: 'publishVersion',\n        message: `Enter new version for @${tag}? (latest = \"${latestPublished}\")`,\n        initial: possibleFutureVersion,\n    })\n\n    if (!publishVersion || publishVersion === latestPublished)\n        process.exit()\n\n    const { versionOk } = await prompts({\n        type: 'confirm',\n        name: 'versionOk',\n        message: `Run \"pnpm publish --tag ${tag} --no-git-checks\" with pkg version \"${publishVersion}\"?`,\n        initial: false,\n    })\n\n    return {\n        versionOk,\n        publishVersion,\n        tag,\n    }\n}\n\nasync function publishCore({ tag }) {\n    console.log('Publishing Core...')\n\n    await new Listr([\n        {\n            title: 'Cleansing package.json',\n            task: async () => {\n                await $`node bin/publish/_pkg.core.cleanse`\n            },\n        },\n        {\n            title: `Publishing on NPM with tag ${tag}`,\n            task: async () => await $`pnpm publish --tag ${tag} --no-git-checks`,\n        },\n        {\n            title: 'Restoring package.json',\n            task: async () => await $`node bin/publish/_pkg.core.restore`,\n        },\n    ]).run().catch((err) => {\n        console.error(err)\n    })\n}\n\nasync function publishInstaller({ tag }) {\n    console.log('Publishing Installer...')\n\n    await new Listr([\n        {\n            title: 'Copy + Cleanse package.json',\n            task: async () => await $`node bin/publish/_pkg.installer.cleanse`,\n        },\n        {\n            title: 'Publishing on NPM',\n            task: async () => await $`cd ./dist/installer/ && pnpm publish --tag ${tag} --no-git-checks`,\n        },\n    ]).run().catch((err) => {\n        console.error(err)\n    })\n}\n\nconst publishConfig = await getPublishConfig()\n\nif (publishConfig.versionOk) {\n    const corePkgFile = './package.json'\n    const installerPkgFile = './packages/installer/package.json'\n\n    // change package.json versions\n    console.log(`\\nSetting publish version to ${publishConfig.publishVersion}...`)\n    const corePkg = await fs.readJson(corePkgFile)\n    const installerPkg = await fs.readJson(installerPkgFile)\n    corePkg.version = publishConfig.publishVersion\n    installerPkg.version = publishConfig.publishVersion\n    await fs.writeJson(corePkgFile, corePkg, { spaces: 4 })\n    await fs.writeJson(installerPkgFile, installerPkg, { spaces: 4 })\n\n    // preview?\n    if (publishConfig.tag === 'preview')\n        process.env.COMPILE_MODE = \"preview\"\n\n    // build + test\n    console.log('Building + Testing...')\n    await $`zx bin/test.mjs`\n\n    // publish packages\n    await publishCore(publishConfig)\n    await publishInstaller(publishConfig)\n    console.log('Done!')\n}\n"
  },
  {
    "path": "bin/test.mjs",
    "content": "#!/usr/bin/env zx\n/* eslint-disable no-console */\nimport './env.mjs'\n\n// build\nawait $`zx bin/build.mjs`\n\n// prisma client for tests\nconsole.log(chalk.blue('\\n🧪 [test] run prisma generate'))\nawait $`npx prisma generate --schema tests/generator/schemas/crud.prisma`\nawait $`npx prisma generate --schema tests/generator/schemas/@gql.prisma`\n\n// unit tests\nconsole.log(chalk.blue('🧪 [test] run unit tests\\n'))\nawait $`VITE_CJS_IGNORE_WARNING=true vitest run tests`\n"
  },
  {
    "path": "docs/.vitepress/config.ts",
    "content": "export default {\n    title: 'Prisma-AppSync',\n    description: 'GraphQL API Generator for AWS and ◭ Prisma',\n\n    head: [['link', { rel: 'icon', type: 'image/svg+xml', href: '/logo.svg' }]],\n\n    vue: {\n        reactivityTransform: true,\n    },\n\n    lastUpdated: true,\n\n    themeConfig: {\n        logo: '/logo.svg',\n\n        editLink: {\n            text: 'Suggest changes to this page',\n            pattern: 'https://github.com/maoosi/prisma-appsync/edit/main/docs/:path',\n        },\n\n        socialLinks: [{ icon: 'github', link: 'https://github.com/maoosi/prisma-appsync' }],\n\n        lastUpdatedText: 'Updated Date',\n\n        footer: {\n            message: 'Released under the BSD 2-Clause License.',\n            copyright: 'Copyright © 2021-present Sylvain Simao',\n        },\n\n        nav: [\n            { text: 'Documentation', link: '/quick-start/getting-started' },\n            { text: 'Changelog', link: '/changelog/1.0.0' },\n            { text: 'Support', link: '/support' },\n            {\n                text: 'Tools',\n                items: [\n                    {\n                        text: 'AppSync GraphQL Schema Diff',\n                        link: '/tools/appsync-gql-schema-diff',\n                    },\n                ],\n            },\n            {\n                text: 'Links',\n                items: [\n                    {\n                        text: 'Report a bug',\n                        link: 'https://github.com/maoosi/prisma-appsync/issues',\n                    },\n                    {\n                        text: 'Sponsor',\n                        link: 'https://github.com/sponsors/maoosi',\n                    },\n                    {\n                        text: 'Roadmap',\n                        link: 'https://github.com/users/maoosi/projects/1',\n                    },\n                ],\n            },\n        ],\n\n        sidebar: [\n            {\n                text: 'Quick start',\n                items: [\n                    { text: 'Getting started', link: '/quick-start/getting-started' },\n                    { text: 'Installation', link: '/quick-start/installation' },\n                    { text: 'Usage', link: '/quick-start/usage' },\n                    { text: 'Deploy', link: '/quick-start/deploy' },\n                ],\n            },\n            {\n                text: 'Features',\n                collapsible: true,\n                items: [\n                    { text: 'Lifecycle hooks', link: '/features/hooks' },\n                    { text: 'Custom resolvers', link: '/features/resolvers' },\n                    { text: 'Tweaking GQL schema', link: '/features/gql-schema' },\n                ],\n            },\n            {\n                text: 'Security',\n                collapsible: true,\n                items: [\n                    { text: 'Authorization', link: '/security/appsync-authz' },\n                    { text: 'Shield (ACL rules)', link: '/security/shield-acl' },\n                    { text: 'XSS sanitizer', link: '/security/xss-sanitizer' },\n                    { text: 'Query depth', link: '/security/query-depth' },\n                    { text: 'Rate limiter (DOS)', link: '/security/rate-limiter' },\n                ],\n            },\n            {\n                text: 'Contributing',\n                collapsible: true,\n                items: [\n                    { text: 'Contributions guide', link: '/contributing' },\n                ],\n            },\n            {\n                text: 'Changelog',\n                collapsible: true,\n                collapsed: true,\n                items: [\n                    { text: '(latest) v1.0.0', link: '/changelog/1.0.0' },\n                    { text: 'Previous', link: '/changelog/' },\n                ],\n            },\n        ],\n    },\n}"
  },
  {
    "path": "docs/.vitepress/theme/Layout.vue",
    "content": "<script setup>\nimport DefaultTheme from 'vitepress/theme'\n\nconst { Layout } = DefaultTheme\n</script>\n\n<template>\n  <Layout>\n    <template #aside-outline-after>\n      <div class=\"content\">\n        <div class=\"title\">Our sponsors</div>\n        <div>\n          <a href=\"https://kuizto.co/?utm_source=prisma_appsync&utm_medium=github\" target=\"_blank\">\n            <img src=\"/sponsors/kuizto-square.png\" alt=\"Kuizto — The Everyday Cooking App\" />\n          </a>\n        </div>\n      </div>\n    </template>\n  </Layout>\n</template>\n\n<style scoped>\n.content {\n    position: relative;\n    border-left: 1px solid var(--vp-c-divider);\n    padding-left: 16px;\n    font-size: 13px;\n    font-weight: 500;\n    margin-top: 64px;\n}\n\n.title {\n  letter-spacing: 0.4px;\n  line-height: 28px;\n  font-size: 13px;\n  font-weight: 600;\n}\n</style>"
  },
  {
    "path": "docs/.vitepress/theme/index.ts",
    "content": "import Theme from 'vitepress/theme'\nimport Layout from './Layout.vue'\nimport './styles/vars.css'\n\nexport default {\n    extends: Theme,\n    Layout: Layout\n}\n"
  },
  {
    "path": "docs/.vitepress/theme/styles/vars.css",
    "content": "/**\n * Colors\n * -------------------------------------------------------------------------- */\n\n:root {\n    --vp-c-brand: #5379f4;\n    --vp-c-brand-light: #747bff;\n    --vp-c-brand-lighter: #9499ff;\n    --vp-c-brand-dark: #535bf2;\n    --vp-c-brand-darker: #454ce1;\n}\n\n/**\n   * Component: Button\n   * -------------------------------------------------------------------------- */\n\n:root {\n    --vp-button-brand-border: var(--vp-c-brand-light);\n    --vp-button-brand-text: var(--vp-c-text-dark-1);\n    --vp-button-brand-bg: var(--vp-c-brand);\n    --vp-button-brand-hover-border: var(--vp-c-brand-light);\n    --vp-button-brand-hover-text: var(--vp-c-text-dark-1);\n    --vp-button-brand-hover-bg: var(--vp-c-brand-light);\n    --vp-button-brand-active-border: var(--vp-c-brand-light);\n    --vp-button-brand-active-text: var(--vp-c-text-dark-1);\n    --vp-button-brand-active-bg: var(--vp-button-brand-bg);\n}\n\n/**\n   * Component: Home\n   * -------------------------------------------------------------------------- */\n\n:root {\n    --vp-home-hero-name-color: transparent;\n    --vp-home-hero-name-background: -webkit-linear-gradient(120deg, #5379f4 30%, #f59533);\n}\n\n/**\n   * Component: Algolia\n   * -------------------------------------------------------------------------- */\n\n.DocSearch {\n    --docsearch-primary-color: var(--vp-c-brand) !important;\n}\n"
  },
  {
    "path": "docs/changelog/1.0.0-rc.1.md",
    "content": "---\neditLink: false\n---\n\n# 1.0.0-rc.1\n\n::: warning BREAKING\n🚨 This release comes with a **major rewrite of the Prisma-AppSync Client API and breaking changes**. Please make sure to take a moment and read through the details below before upgrading.\n:::\n\n## Highlights\n\n- **Codebase rewrite**: Prisma-AppSync was rewritten from the ground to offer a simplified API with a more opinionated approach, end-to-end type safety for a better DX, advanced customisation options, as well as improved security and fine-grained access control.\n- **Installer CLI**: New interactive scaffolding CLI to quickly start new Prisma-AppSync projects, accessible from a single `npx create-prisma-appsync-app@latest` command. It can also plug into existing projects already using Prisma.\n- **Local AppSync Server**: New local development environment built for Prisma-AppSync (local database, auto-reload, TS support, GraphQL IDE). Iterate faster by simulating a GraphQL API running on AWS AppSync from your local machine.\n- **Documentation website**: New documentation website and contribution guide, built upon VitePress, and accessible from [prisma-appsync.vercel.app](https://prisma-appsync.vercel.app).\n- **Lots of improvements**: Implemented dozens of improvements, bug fixes and new Prisma features (atomic operations, order by relations, case sensitivity, etc).\n\n## 🪓 Breaking changes\n\n::: details Prisma-AppSync Client usage\n`BREAKING`Usage is simplified by adopting a more opinionated approach. Also provides a better TypeScript DX closer to Prisma Client.\n- Fine-gained access control and hooks have been re-engineered entirely to make them easier to use and more flexible for all project sizes.\n- Adopted a full TDD approach with both unit and integration tests. This is to help bring Prisma-AppSync to a stable version quicker.\n\n**Before:**\n\n```ts\n// init prisma-appsync client\nconst app = new PrismaAppSync({\n    connectionUrl: process.env.CONNECTION_URL\n})\n\n// direct lambda resolver for appsync\nexport const main = async (event) => {\n    // parse the `event` from your Lambda function\n    app.parseEvent(event)\n\n    // handle CRUD operations / resolve query\n    const result = await app.resolve()\n\n    // close database connection\n    await app.prisma.$disconnect()\n\n    // return query result\n    return Promise.resolve(result)\n}\n```\n\n**After:**\n\n```ts\nconst prismaAppSync = new PrismaAppSync()\n\n// direct lambda resolver for appsync\nexport const resolver = async (event) => {\n    return await prismaAppSync.resolve({ event })\n}\n```\n\n:::\n\n::: details Prisma-AppSync Client options\n\n`BREAKING`\n\n- `connectionUrl` parameter renamed into `connectionString`. This parameter is optional and leverages Prisma Client naming convention and defaults.\n- `debug` parameter renamed into `logLevel`. This parameter is optional and allows specify server logging levels.\n- New `maxDepth` parameter that improves security and prevents clients from abusing query depth. Defaults to `3`.\n- New `maxReqPerUserMinute` parameter that provides in-memory rate-limiting and prevents common DDoS attacks. Defaults to `200`.\n\n```ts\nconst prismaAppSync = new PrismaAppSync({\n    // optional, DB connection string, default to env var `DATABASE_URL`\n    connectionString,\n    // optional, enable data sanitizer for DB storage (incl. XSS parser), default to true\n    sanitize,\n    // optional, specify server logging level (`INFO`, `WARN`, `ERROR`), default to `INFO`\n    logLevel,\n    // optional, pagination for listQueries, default to 50\n    defaultPagination,\n    // optional, allowed graphql query depth, default to 3\n    maxDepth,\n    // optional, per user, in-memory rate limiting, default to 200\n    maxReqPerUserMinute\n})\n```\n\n:::\n\n::: details Custom Resolvers API\n\n`BREAKING`\n\n**Before:**\n\n```ts\napp.registerCustomResolvers({\n    notify: async ({ args }: CustomResolverProps) => {\n        return {\n            message: `${args.message} from notify`\n        }\n    }\n})\n```\n\n**After:**\n\n```ts\nreturn await prismaAppSync.resolve<'notify'>({\n    event,\n    resolvers: {\n        notify: async ({ args }: QueryParams) => {\n            return {\n                message: `${args.message} from notify`,\n            }\n        },\n    }\n})\n```\n\n:::\n\n::: details Hooks before/after API\n\n`BREAKING`\n\n**Before:**\n\n```ts\n// execute before resolve\napp.beforeResolve(async (props) => {})\n\n// execute after resolve\napp.afterResolve(async (props) => {})\n```\n\n**After:**\n\n```ts\nreturn await prismaAppSync.resolve<'likePost'>({\n    event,\n    hooks: {\n        // execute before any query\n        'before:**': async (params: BeforeHookParams) => params,\n\n        // execute after any query\n        'after:**': async (params: AfterHookParams) => params,\n\n        // execute after custom resolver query `likePost`\n        // (e.g. `query { likePost(postId: 3) }`)\n        'after:likePost': async (params: AfterHookParams) => {\n            await params.prismaClient.notification.create({\n                data: {\n                    event: 'POST_LIKED',\n                    targetId: params.args.postId,\n                    userId: params.authIdentity.sub,\n                },\n            })\n            return params\n        },\n    },\n})\n```\n\n:::\n\n::: details Fine-Grained Access Control API\n\n`BREAKING`\n\n**Before:**\n\n```ts\n// before resolving any query\napp.beforeResolve(async ({ authIdentity }: BeforeResolveProps) => {\n    // rules only apply to Cognito authorization type\n    if (authIdentity.authorization !== AuthModes.AMAZON_COGNITO_USER_POOLS)\n        return false\n\n    // get current user from database, using Prisma\n    // we only need to know the user ID\n    const currentUser = await prisma.user.findUnique({\n        select: { id: true },\n        where: { cognitoSub: authIdentity.sub }\n    }) || { id: null }\n\n    // everyone can access (get + list) or create Posts\n    app.allow({ action: AuthActions.access, subject: 'Post' })\n    app.allow({ action: AuthActions.create, subject: 'Post' })\n\n    // only the author is allowed to modify a given Post\n    app.deny({\n        action: AuthActions.modify,\n        subject: 'Post',\n        // IF `Post.ownerId` NOT_EQUAL_TO `currentUser.id` THEN DENY_QUERY\n        condition: { ownerId: { $ne: currentUser.id } }\n    })\n})\n```\n\n**After:**\n\n```ts\nreturn await prismaAppSync.resolve({\n    event,\n    shield: ({ authorization, identity }: QueryParams) => {\n        const isCognitoAuth = authorization === Authorizations.AMAZON_COGNITO_USER_POOLS\n        const isOwner = { owner: { cognitoSub: identity?.sub } } // Prisma syntax\n\n        return {\n            '**': {\n                rule: isCognitoAuth,\n                reason: ({ model }) => `${model} access is restricted to logged-in users.`,\n            },\n            '{update,upsert,delete}Post{,/**}': {\n                rule: isOwner,\n                reason: ({ model }) => `${model} can only be modified by their owner.`,\n            },\n        }\n    },\n})\n```\n\n:::\n\n::: details Prisma-AppSync Generator options\n\n`BREAKING`\n\n- `customSchema` parameter renamed into `extendSchema`.\n- `customResolvers` parameter renamed into `extendResolvers`.\n- new parameter `defaultDirective`, to globally apply default directives.\n\n```ts\ngenerator appsync {\n  provider = \"prisma-appsync\"\n\n  // optional params\n  output          = \"./generated/prisma-appsync\"\n  extendSchema    = \"./custom-schema.gql\"\n  extendResolvers = \"./custom-resolvers.yaml\"\n  defaultDirective = \"@auth(model: [{ allow: apiKey }])\"\n}\n```\n\n:::\n\n::: details AppSync Authorizations modes\n\n`BREAKING`\n\n**Before:**\n\n```json\n/// @PrismaAppSync.type: '@aws_api_key @aws_cognito_user_pools(cognito_groups: [\\\"admins\\\"])'\nmodel Post {\n  id       Int       @id @default(autoincrement())\n  title    String\n}\n```\n\n**After:**\n\n```json\n/// @auth(model: [{ allow: apiKey }, { allow: userPools, groups: [\"admins\"] }])\nmodel Post {\n  id       Int       @id @default(autoincrement())\n  title    String\n}\n```\n\n👆 Output: `@aws_api_key @aws_cognito_user_pools(cognito_groups: [\"admins\"])`\n:::\n\n::: details Data sanitizer behaviour\n\n`BREAKING`\n\nEnabling the data sanitizer will now automatically \"clarify/decode\" the data before sending it back to the client. Meaning client-side decoding is not anymore necessary, while your data will still be parsed for XSS before storage.\n:::\n\n::: details Auto-generated documentation\n\n`BREAKING`\n\nTo reduce the maintenance burden, auto-generated API docs have been removed from Prisma-AppSync in favour of a better description of the data (accessible via the native GraphQL documentation from your favourite GraphQL IDE).\n\nIn case this is problematic for you and you’d like auto-generated docs to make a comes back, please consider [supporting the project](https://github.com/sponsors/maoosi) and [opening a new issue](https://github.com/maoosi/prisma-appsync/issues).\n:::\n\n## 🎉 New features\n\n::: details New documentation website\n\n`NEW FEATURE`\n\nAccessible from [prisma-appsync.vercel.app](https://prisma-appsync.vercel.app).\n\n:::\n\n::: details New installer (scaffolding tool)\n\n`NEW FEATURE`\n\nNew installer that can be run via `npx create-prisma-appsync-app@latest`. Nicely plug with existing Prisma projects (non-destroying), while also allowing scaffolding of new projects from scratch.\n\n```bash\n    ___      _                             _               __\n   / _ \\_ __(◭)___ _ __ ___   __ _        /_\\  _ __  _ __ / _\\_   _ _ __   ___\n  / /◭)/ '__| / __| '_ ` _ \\ / _` |_____ //◭\\\\| '_ \\| '_ \\\\ \\| | | | '_ \\ / __|\n / ___/| |  | \\__ \\ | | | | | (◭| |_____/  _  \\ |◭) | |◭) |\\ \\ |_| | | | | (__\n \\/    |_|  |_|___/_| |_| |_|\\__,_|     \\_/ \\_/ .__/| .__/\\__/\\__, |_| |_|\\___|\n                                              |_|   |_|       |___/\n  ◭ Prisma-AppSync Installer v1.0.0\n```\n\n:::\n\n::: details Local development environment built for Prisma-AppSync\n\n`NEW FEATURE`\n\nNew local development environment built for Prisma-AppSync (local database, auto-reload, TS support, GraphQL IDE). Simulate a GraphQL API running on AWS AppSync + AWS Lambda Resolver + Prisma ORM + Database.\n\n:::\n\n::: details Support added for Prisma 4.5.x\n\n`NEW FEATURE`\n\nCodebase adapted and fully tested for Prisma 4.5.x support.\n\n:::\n\n::: details Customise GraphQL Schema output\n\n`NEW FEATURE`\n\n```json\n/// @gql(queries: { list: 'posts' }, subscriptions: null)\nmodel Post {\n  id       Int       @id @default(autoincrement())\n  title    String\n}\n```\n\n👆 Output: Default `listPosts` query renamed to `posts` / No subscriptions for the Post model\n:::\n\n::: details Support for Atomic Operations\n\n`NEW FEATURE`\n\n```graphql\nmutation {\n  updatePost(\n    where: { id: 1 }, \n    operation: { \n      views: { increment: 1 }\n    }\n  ) {\n    views\n  }\n}\n```\n\n:::\n\n::: details Support for order by relational fields\n\n`NEW FEATURE`\n\n```graphql\nquery {\n  listPosts(\n    orderBy: {\n      author: {\n        name: ASC\n      }\n    }\n  ) {\n    title\n    author {\n      name\n    }\n  }\n}\n```\n\n:::\n\n::: details Support for Case Sensitivity (PostgreSQL and MongoDB connectors only)\n\n`NEW FEATURE`\n\n```graphql\nquery {\n  listPosts(\n    where: {\n      title: {\n        contains: \"prisma\",\n        mode: \"insensitive\"\n      }\n    }\n  ) {\n    title\n  }\n}\n```\n\n:::\n\n::: details CDK boilerplate upgraded to v2+\n\n`IMPROVEMENT`\n\nCDK boilerplate was entirely rewritten to offer a more easy-to-use, simpler syntax making it more approachable for people who are new to AWS CDK.\n:::\n\n::: details TypeScript types improved for better DX\n\n`IMPROVEMENT`\n\nHovering on Prisma-AppSync types and Client API methods using VSCode is now displaying docs and examples across the entire codebase.\n:::\n\n::: details Bundle size and performances\n\n`IMPROVEMENT`\n\nNoticeable gains in bundle size and runtime performances. Lots of dependencies were removed from the previous version, in favour of custom utils functions.\n:::\n\n::: details Errors handling and server logs improved\n\n`IMPROVEMENT`\n\nBoth error handling and server logs (accessible from CloudWatch) have been improved to include more details and be easily readable.\n\n```ts\n// Example object returned from the API\n{\n\t\"error\": \"Query has depth of 4, which exceeds max depth of 3.\",\n\t\"type\": \"FORBIDDEN\",\n\t\"code\": 401\n}\n\n// Error codes\nconst errorCodes = {\n  FORBIDDEN: 401,\n  BAD_USER_INPUT: 400,\n  INTERNAL_SERVER_ERROR: 500,\n  TOO_MANY_REQUESTS: 429,\n}\n```\n\n:::\n\n## 🐞 Bug fixes\n\n::: details Added support for uniqueIndexes (🙏 contribution from [@cipriancaba](https://github.com/cipriancaba))\n🐙 [Issue #46](https://github.com/maoosi/prisma-appsync/issues/46) /[PR #47](https://github.com/maoosi/prisma-appsync/pull/47): Prisma is no longer providing idFields\n:::\n\n::: details Fixed casing issue on GraphQL relation fields (🙏 contribution from [@ryparker](https://github.com/ryparker))\n🐙 [Issue #37](https://github.com/maoosi/prisma-appsync/issues/37) / [PR #38](https://github.com/maoosi/prisma-appsync/pull/38): Generated GraphQL schema relation definitions using the incorrect case for type values\n:::\n\n::: details Fixed issue on nullable relation fields in mutations\n🐙 [Issue #26](https://github.com/maoosi/prisma-appsync/issues/26): Issue using nullable relation fields with mutations\n:::\n\n::: details Replaced env var JEST_WORKER_ID with PRISMA_APPSYNC_TESTING\n🐙 [Issue #32](https://github.com/maoosi/prisma-appsync/issues/32): Issue performing tests because of JEST_WORKER_ID\n:::\n\n## 💛 Github Sponsors\n\nEnjoy using Prisma-AppSync? Please consider sponsoring me at 🐙 [maoosi ↗](https://github.com/sponsors/maoosi) so that I can spend more time working on the project.\n"
  },
  {
    "path": "docs/changelog/1.0.0-rc.2.md",
    "content": "---\neditLink: false\n---\n\n# 1.0.0-rc.2\n\n**🌟 Help us spread the word about Prisma-AppSync by starring the repo.**\n\n## Major improvements\n\n### Support for Prisma Fluent API syntax on Relation Filters\n\n> 🚨 Breaking change affecting syntax for Relation Filters.\n\nIn this release, we are changing how to write relation filters. We are replacing the [original Prisma Client syntax](https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#filter-on--to-one-relations) (using `is` and `isNot` filters) with the newest [Fluent API syntax](https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#fluent-api) which feels more natural to write, but also allows using more complex Relation Filters such as `contains`, `endsWith`, `equals`, `gt`, `gte`, `lt`, `lte`, `in`, `not`, `notIn` and `startsWith`.\n\n**Before**\n\n```graphql\nquery {\n listPosts(\n  where: {\n   author: { is: { username: \"xxx\" } }\n  }\n ) {\n  title\n  author { username }\n }\n}\n```\n\n**After**\n\n```graphql\nquery {\n listPosts(\n  where: {\n   author: { username: { equals: \"xxx\" } }\n  }\n ) {\n  title\n  author { username }\n }\n}\n```\n\n### Improved readability for underlying Prisma client errors\n\nIn this release, we have improved readability for all [known errors](https://www.prisma.io/docs/reference/api-reference/error-reference) thrown by the underlying Prisma Client. For example, using an incorrect connection URL (`DATABASE_URL`) will now return the below message as part of the API response:\n\n> Error with Prisma client initialization. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientinitializationerror\n\nThe full error trace will still appear inside the terminal and/or CloudWatch logs.\n\n### New documentation guide: \"Adding Hooks\"\n\nIn this release, we have added a new guide on \"Adding Hooks\". Particularly useful to trigger actions and/or manipulate data `before` or `after` queries.\n\nhttps://prisma-appsync.vercel.app/advanced/hooks.html\n\n**Example snippet:**\n\n```tsx\nreturn await prismaAppSync.resolve<'likePost'>({\n    event,\n    hooks: {\n        // execute before any query\n        'before:**': async (params: BeforeHookParams) => params,\n\n        // execute after any query\n        'after:**': async (params: AfterHookParams) => params,\n\n        // execute after custom resolver query `likePost`\n        // (e.g. `query { likePost(postId: 3) }`)\n        'after:likePost': async (params: AfterHookParams) => {\n            await params.prismaClient.notification.create({\n                data: {\n                    event: 'POST_LIKED',\n                    targetId: params.args.postId,\n                    userId: params.authIdentity.sub,\n                },\n            })\n            return params\n        },\n    },\n})\n```\n\n## Fixes\n\n- [Issue using the `@aws_auth` directive along with additional authorization modes.](https://github.com/maoosi/prisma-appsync/pull/52)\n- [Issue with `before` and `after` hook responses.](https://github.com/maoosi/prisma-appsync/pull/54)\n\n## Credits\n\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\"><a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100px;\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#maintainer-maoosi\" title=\"Maintainer\">🧙‍♂️</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\"><a href=\"http://www.cipriancaba.com\"><img src=\"https://avatars.githubusercontent.com/u/695515?v=4?s=100\" width=\"100px;\" alt=\"Ciprian Caba\"/><br /><sub><b>Ciprian Caba</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=cipriancaba\" title=\"Code\">💻</a> <a href=\"#ideas-cipriancaba\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    </tr>\n  </tbody>\n</table>\n\n## Github sponsors\n\nEnjoy using Prisma-AppSync? Please consider [💛 Github sponsors](https://github.com/sponsors/maoosi).\n"
  },
  {
    "path": "docs/changelog/1.0.0-rc.3.md",
    "content": "---\neditLink: false\n---\n\n# 1.0.0-rc.3\n\n**🌟 Help us spread the word about Prisma-AppSync by starring the repo.**\n\n## Fixes\n\n- [Issue with Queries returning a single parameter (such as `count` queries)](https://github.com/maoosi/prisma-appsync/issues/61)\n- [Issue with generated GraphQL input `CreateInput` when using `@default(uuid())` inside Prisma Schema](https://github.com/maoosi/prisma-appsync/issues/62)\n\n## Credits\n\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\"><a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100px;\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#maintainer-maoosi\" title=\"Maintainer\">🧙‍♂️</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a></td>\n    </tr>\n  </tbody>\n</table>\n\n## Github sponsors\n\nEnjoy using Prisma-AppSync? Please consider [💛 Github sponsors](https://github.com/sponsors/maoosi).\n"
  },
  {
    "path": "docs/changelog/1.0.0-rc.4.md",
    "content": "---\neditLink: false\n---\n\n# 1.0.0-rc.4\n\n**🌟 Help us spread the word about Prisma-AppSync by starring the repo.**\n\n## Highlights\n\n### ⚡️ Local dev server is now using `vite-node` instead of `ts-node-dev`\n\nDue to some incompatibilities between `ts-node-dev` and some of the newest changes, Vite is now used as the underlying Node runtime for the Prisma-AppSync local dev server.\n\nTo migrate an existing project using the local dev server, you'll need to edit the `dev` script inside your `package.json` and replace the following part:\n\n```shell\nnpx ts-node-dev --rs --transpile-only --watch './*.ts' -- ./server.ts\n```\n\nwith:\n\n```shell\nnpx vite-node ./server.ts --watch --\n```\n\n### ⚡️ Local dev server upgraded to GraphQL Yoga v3, with the ability to use custom options\n\nWhen using Prisma-AppSync local dev server, it is now possible to pass custom options from the `server.ts` file. \n\n```ts\ncreateServer({\n    yogaServerOptions: {\n        cors: {\n            origin: 'http://localhost:4000',\n            credentials: true,\n            allowedHeaders: ['X-Custom-Header'],\n            methods: ['POST']\n        }\n        /* ...other args */\n    }\n})\n```\n\nFor the full list of supported options, please refer to https://the-guild.dev/graphql/yoga-server/docs and the `createYoga` method.\n\n## Fixes and improvements\n\n- [Auto-populated fields (autoincrement, uuid, updatedAt, …) are now visible and directly editable from the GraphQL schema (Issue #70)](https://github.com/maoosi/prisma-appsync/issues/70)\n- [Fixed issue with lists (arrays) in Prisma Schema not being properly cast into the GraphQL Schema (PR #78)](https://github.com/maoosi/prisma-appsync/pull/78)\n- [Added `cuid` as part of the auto-populated fields (PR #72)](https://github.com/maoosi/prisma-appsync/pull/72)\n- [Initialize `prismaArgs` with empty select (PR #69)](https://github.com/maoosi/prisma-appsync/pull/69)\n- [Added an optional generic type for QueryParams (PR #74)](https://github.com/maoosi/prisma-appsync/pull/74)\n- [Fixed issue with CDK boilerplate policy statements (Issue #64)](https://github.com/maoosi/prisma-appsync/issues/64)\n- [Fixed docs using the wrong syntax for fine-grained access control examples (Issue #79)](https://github.com/maoosi/prisma-appsync/issues/79)\n- CDK boilerplate Lambda function upgraded to `NODEJS_16_X`\n- CDK boilerplate `warmUp(boolean)` parameter becomes `useWarmUp(number)`, allowing to specify the number of warm-up functions to use (default `0`)\n\n## Credits\n\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\"><a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100px;\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#maintainer-maoosi\" title=\"Maintainer\">🧙‍♂️</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\"><a href=\"http://www.cipriancaba.com\"><img src=\"https://avatars.githubusercontent.com/u/695515?v=4?s=100\" width=\"100px;\" alt=\"Ciprian Caba\"/><br /><sub><b>Ciprian Caba</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=cipriancaba\" title=\"Code\">💻</a> <a href=\"#ideas-cipriancaba\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\"><a href=\"https://www.cameronjjenkinson.com\"><img src=\"https://avatars.githubusercontent.com/u/5429478?v=4?s=100\" width=\"100px;\" alt=\"Cameron Jenkinson\"/><br /><sub><b>Cameron Jenkinson</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=cjjenkinson\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://bell.moe\"><img src=\"https://avatars.githubusercontent.com/u/3979239?v=4?s=100\" width=\"100px;\" alt=\"Bell\"/><br /><sub><b>Bell</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=Tenrys\" title=\"Code\">💻</a></td>\n    </tr>\n  </tbody>\n</table>\n\n## Github sponsors\n\nEnjoy using Prisma-AppSync? Please consider [💛 Github sponsors](https://github.com/sponsors/maoosi).\n"
  },
  {
    "path": "docs/changelog/1.0.0-rc.5.md",
    "content": "---\neditLink: false\n---\n\n# 1.0.0-rc.5\n\n**🌟 Help us spread the word about Prisma-AppSync by starring the repo.**\n\n## Highlights\n\n### ⚡️ Async shield rules\n\nAsync Shield rules are now supported in Prisma-AppSync, opening up to 3 different ways to define fine-grained access control rules:\n\n```ts\nreturn await prismaAppSync.resolve({\n    event,\n    shield: () => {\n        return {\n            // Boolean\n            'listPosts{,/**}': { rule: true },\n\n            // Function\n            'listPosts{,/**}': { rule: () => true },\n\n            // (NEW) Async Function\n            'listPosts{,/**}': {\n                rule: async () => {\n                    await sleep(1000)\n                    return true\n                },\n            },\n        }\n    },\n})\n```\n\n### ⚡️ Support for deeply nested relation filters\n\nDeeply nested relation filters are now supported in Prisma-AppSync, allowing to perform the following queries:\n\n```graphql\nquery {\n  listComments(\n    where: {\n      author: {\n  \n        # deeply nested relation filter\n        posts: {\n          every: {\n            published: { equals: true }\n          }\n        }\n\n      }\n    }\n  )\n}\n```\n\n```graphql\nquery {\n  listUsers(\n    where: {\n      posts: {\n        every: {\n\n          # deeply nested relation filter\n          comments: {\n            every: {\n              message: { startsWith: 'hello' }\n           }\n          }\n\n        }\n      }\n    }\n  )\n}\n```\n\n### ⚡️ Support for `extendedWhereUnique` preview feature\n\nUsing the `extendedWhereUnique` preview feature flag will enable filtering on non-unique fields in Prisma-AppSync, allowing to do the following:\n\n```prisma\ngenerator client {\n  provider        = \"prisma-client-js\"\n  previewFeatures = [\"extendedWhereUnique\"]\n}\n```\n\n```graphql\nmutation($id: Int!, $version: Int) {\n  updatePost(\n    # version is a non-unique field\n    where: { id: $id, version: { equals: $version } },\n    operation: { version: { increment: 1 } }\n  ) {\n    id\n    version\n  }\n}\n```\n\nSee [Prisma Docs](https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#filter-on-non-unique-fields-with-userwhereuniqueinput) for more details.\n\n## Fixes and improvements\n\n- [`maxDepth` parameter not working properly with Json fields (Issue #71).](https://github.com/maoosi/prisma-appsync/issues/71)\n- [Local dev server reads `undefined` when using nested arrays in query (Issue #83).](https://github.com/maoosi/prisma-appsync/issues/81)\n- [GraphQL input `<Model>WhereUniqueInput` shouldn’t include Relation fields (Issue #83).](https://github.com/maoosi/prisma-appsync/issues/83)\n- [Unit tests for Prisma to GraphQL schema conversion (Issue #84).](https://github.com/maoosi/prisma-appsync/issues/84)\n- [Local dev server returning `null` for `0` values (PR #82).](https://github.com/maoosi/prisma-appsync/pull/82)\n- [Issue: fields with `@default` should appear as required `!` in generated GraphQL schema base type (Issue #91).](https://github.com/maoosi/prisma-appsync/issues/91)\n- Improved, more readable, Prisma Client errors logs.\n\n## Credits\n\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\"><a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100px;\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#maintainer-maoosi\" title=\"Maintainer\">🧙‍♂️</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\"><a href=\"http://www.cipriancaba.com\"><img src=\"https://avatars.githubusercontent.com/u/695515?v=4?s=100\" width=\"100px;\" alt=\"Ciprian Caba\"/><br /><sub><b>Ciprian Caba</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=cipriancaba\" title=\"Code\">💻</a> <a href=\"#ideas-cipriancaba\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\"><a href=\"http://bell.moe\"><img src=\"https://avatars.githubusercontent.com/u/3979239?v=4?s=100\" width=\"100px;\" alt=\"Bell\"/><br /><sub><b>Bell</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=Tenrys\" title=\"Code\">💻</a></td>\n    </tr>\n  </tbody>\n</table>\n\n## Github sponsors\n\nEnjoy using Prisma-AppSync? Please consider [💛 Github sponsors](https://github.com/sponsors/maoosi).\n"
  },
  {
    "path": "docs/changelog/1.0.0-rc.6.md",
    "content": "---\neditLink: false\n---\n\n# 1.0.0-rc.6\n\n**🌟 Help us spread the word about Prisma-AppSync by starring the repo.**\n\n> 🚨 This release include breaking changes, so please make sure to read the below thoroughly before upgrading.\n\n## Breaking\n\n### 💔 Updated `upsert<Model>` mutation params to be similar to Prisma Client API\n\nThis change is considered breaking if you are using `upsert` mutations.\n\n```graphql\n# before\nmutation {\n  upsertPost(\n    where: { id: 1 }\n    data: { title: \"Hello world\" }\n  ) {\n    title\n  }\n}\n\n# after\nmutation {\n  upsertPost(\n    where: { id: 1 }\n    create: { title: \"Hello world\" }\n    update: { title: \"Hello world\" }\n  ) {\n    title\n  }\n}\n```\n\n### 💔 Updated `QueryParams.paths` format to fix various reported issues on Shield ACL rules\n\nThis change fixes various reported issues on Shield ACL rules. [See full details here.](https://github.com/maoosi/prisma-appsync/issues/125) It also allows creating more granular rules such as [`createPost/**/connect{,/**}`](https://globster.xyz/?q=createPost%2F**%2Fconnect%7B%2C%2F**%7D&f=createPost%2CcreatePost%2Ftitle%2CcreatePost%2Fauthor%2CcreatePost%2Fauthor%2Fconnect%2CcreatePost%2Fauthor%2Fconnect%2Fid%2CgetPost%2CgetPost%2Fid%2CgetPost%2Ftitle).\n\nOnly considered breaking if you have implemented advanced fine-grained access control rules, or if you are using `QueryParams.paths` for some custom business logic (most likely inside Hooks).\n\n**Example:**\n\n```graphql\nmutation createPost {\n  createPost(\n    data: {\n      title: \"Hello people\"\n      author: { connect: { id: 1 } }\n    }\n  ) {\n    id\n    title\n  }\n}\n```\n\n**Before:**\n\n```json\n{\n    \"paths\": [\n        \"/create/post/title\",\n        \"/create/post/author/id\",\n        \"/get/post/id\",\n        \"/get/post/title\"\n    ]\n}\n```\n\n**After:**\n\n```json\n{\n    \"paths\": [\n        \"createPost\",\n        \"createPost/title\",\n        \"createPost/author\",\n        \"createPost/author/connect\",\n        \"createPost/author/connect/id\",\n        \"getPost\",\n        \"getPost/id\",\n        \"getPost/title\"\n    ]\n}\n```\n\n## Highlights\n\n### ⚡️ Support for custom GraphQL scalars on fields\n\n**Prisma schema:**\n\n```prisma\n/// @gql(scalars: { website: \"AWSURL\" })\nmodel Company {\n  id       Int    @id @default(autoincrement())\n  name     String\n  website  String?\n}\n```\n\n**GraphQL output:**\n\n```graphql\ntype Company {\n    id: Int!\n    name: String!\n    website: AWSURL\n}\n```\n\n### ⚡️ Support for nullable in Query filters\n\n**Example #1:**\n\n```graphql\nquery {\n  listUsers (\n    where: {\n      fullname: { isNull: true }\n    }\n  ) {\n    id\n  }\n}\n```\n\n**Example #2:**\n\n```graphql\nquery {\n  listPosts (\n    where: {\n      author: { is: NULL }\n    }\n  ) {\n    id\n  }\n}\n```\n\n**Example #3:**\n\n```graphql\nquery {\n  listPosts (\n    where: {\n      author: { isNot: NULL }\n    }\n  ) {\n    id\n  }\n}\n```\n\n### ⚡️ Refreshed documentation\n\n[Prisma-AppSync documentation](https://prisma-appsync.vercel.app) has been refreshed with new navigation, revised content, and a new guide on [Tweaking the GraphQL Schema](https://prisma-appsync.vercel.app/features/gql-schema.html).\n\n## Fixes and improvements\n\n- [The local dev server now supports concurrent queries.](https://github.com/maoosi/prisma-appsync/issues/103)\n- [The local dev server now returns __typename (similar to AppSync)](https://github.com/maoosi/prisma-appsync/issues/115)\n- [All fields with `@default()` are now optional in GraphQL output](https://github.com/maoosi/prisma-appsync/issues/96)\n- [Improved performances on ACL Shield Functions (checks now runs in parallel).](https://github.com/maoosi/prisma-appsync/issues/92)\n- [Fixed issue with ACL Shield rules and WhereUniqueInput.](https://github.com/maoosi/prisma-appsync/issues/123)\n- [Fixed issue with using `is` and `isNot` inside `some` or `every`.](https://github.com/maoosi/prisma-appsync/issues/102)\n- [Fixed issue using arguments with no selectionSet on the local dev server.](https://github.com/maoosi/prisma-appsync/pull/104)\n- [Fixed issue with `UpdateRelationsInput`, `delete` and `deleteMany` input types.](https://github.com/maoosi/prisma-appsync/pull/99)\n\n## Sponsors\n\n<table>\n      <tr>\n        <td align=\"center\" style=\"width:300px;\">\n            <a href=\"https://kuizto.co\" rel=\"noopener\" target=\"_blank\">\n                <img src=\"https://prisma-appsync.vercel.app/sponsors/kuizto-logo.jpg\" width=\"120px;\" alt=\"kuizto.co\"/>\n                <br /><sub><b>Solve and sparkle up your daily food life</b></sub>\n            </a>\n        </td>\n        <td align=\"center\" style=\"width:300px;\">\n            <a href=\"https://travistravis.co\" rel=\"noopener\" target=\"_blank\">\n                <img src=\"https://prisma-appsync.vercel.app/sponsors/travistravis-logo.jpg\" width=\"120px;\" alt=\"travistravis.co\"/>\n                <br /><sub><b>Collaborative travel planning</b></sub>\n            </a>\n        </td>\n    </tr>\n</table>\n\n## Credits\n\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100px;\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#creator-maoosi\" title=\"Creator & maintainer\">🐙</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://bell.moe\"><img src=\"https://avatars.githubusercontent.com/u/3979239?v=4?s=100\" width=\"100px;\" alt=\"Bell\"/><br /><sub><b>Bell</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=Tenrys\" title=\"Code\">💻</a> <a href=\"#ideas-Tenrys\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tomschut\"><img src=\"https://avatars.githubusercontent.com/u/4933446?v=4?s=100\" width=\"100px;\" alt=\"Tom\"/><br /><sub><b>Tom</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=tomschut\" title=\"Code\">💻</a> <a href=\"#ideas-tomschut\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jeremy-white\"><img src=\"https://avatars.githubusercontent.com/u/42325631?v=4?s=100\" width=\"100px;\" alt=\"jeremy-white\"/><br /><sub><b>jeremy-white</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=jeremy-white\" title=\"Code\">💻</a></td>\n    </tr>\n  </tbody>\n</table>\n\n## Annoucements\n\n<img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"18px;\" alt=\"Sylvain\"/> **I am starting my Founder journey with [kuizto.co](https://kuizto.co).** Kuizto is a bit like Netflix for your daily food! Lots of visual cooking inspiration, auto-generated grocery lists, and a small social layer to share and discover deliciously simple meals. [Please register for early access](https://kuizto.co), launching later this year!\n\n<img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"18px;\" alt=\"Sylvain\"/> **[Prisma-EdgeQL](https://github.com/kuizto/prisma-edgeql) is an edge-compatible Prisma Client (using PlanetScale driver).** The project was initially built as part of my work at [kuizto.co](https://kuizto.co) and will be released open-source soon. Please go [Star the repo](https://github.com/kuizto/prisma-edgeql) if you are interested!\n\n## Github sponsors\n\nEnjoy using Prisma-AppSync? **Please consider [💛 Github sponsors](https://github.com/sponsors/maoosi).**\n"
  },
  {
    "path": "docs/changelog/1.0.0-rc.7.md",
    "content": "---\neditLink: false\n---\n\n# 1.0.0-rc.7\n\n**🌟 Support Prisma-AppSync by Starring Our Repo!**\n\n## Highlights\n\n### Local Dev Server Transitioned to Amplify AppSync Simulator\n\n> 🚨 Breaking Change: Please Read the Following Carefully Before Upgrading.\n\nThe previous version of our Prisma-AppSync local development server relied on GraphQL Yoga, complemented by several custom functions to mimic AWS Lambda and AppSync's internal behaviors. This was an effective approach initially but began to cause issues as Prisma-AppSync was used for more complex use cases.\n\nTo resolve these issues and simplify maintenance, we've opted to replace our bespoke implementation with Amplify AppSync Simulator. Amplify AppSync Simulator is an integral package within the [AWS Amplify CLI](https://github.com/aws-amplify/amplify-cli) and aims to accurately simulate the experience of using AppSync locally.\n\n**This migration brings numerous advantages to using the local development server:**\n\n- Enables the use of Codegen [Issue #137](https://github.com/maoosi/prisma-appsync/issues/137)\n- Supports using GraphQL Fragments [Issue #112](https://github.com/maoosi/prisma-appsync/issues/112)\n- Accommodates Authentication and Authorization modes provided by AWS AppSync, including Cognito User Pools.\n- Enables Subscription support, using a local WebSocket server.\n\n**For users already using the Prisma-AppSync local development server who wish to migrate, follow these steps:**\n\n1. Substitute your local `server.ts` file with the newer version found at `packages/boilerplate/server.ts`.\n2. Install the new required dependency using `yarn add js-yaml -D`.\n3. Modify the CLI command to initiate the local development server within your `package.json` file (by default, this is the `dev` script).\n4. Here are the corresponding before and after scripts:\n\n```shell\n# before\nnpx vite-node ./server.ts --watch --\n    --handler handler.ts\n    --schema prisma/generated/prisma-appsync/schema.gql\n    --port 4000\n    --watchers '[{\"watch\":[\"**/*.prisma\",\"*.prisma\"],\"exec\":\"npx prisma generate && touch ./server.ts\"}]'\n    --headers '{\"x-fingerprint\":\"123456\"}' # removed\n\n# after\nnpx vite-node ./server.ts --watch --\n    --handler handler.ts\n    --schema prisma/generated/prisma-appsync/schema.gql\n    --resolvers prisma/generated/prisma-appsync/resolvers.yaml # added\n    --port 4000\n    --wsPort 4001 # added\n    --watchers '[{\"watch\":[\"**/*.prisma\",\"*.prisma\"],\"exec\":\"npx prisma generate && touch ./server.ts\"}]'\n```\n\n### Upgraded to Prisma 5.1.1+\n\n> 🚨 Breaking Change: Please Read the Following Carefully Before Upgrading.\n\nPrisma-AppSync internals were updated to support Prisma 5.1.1. One potentially breaking change is that the [`extendedWhereUnique`](https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#filter-on-non-unique-fields-with-userwhereuniqueinput) preview feature was promoted to general availability. So newly generated `WhereUniqueInput` schema types exposes all fields on the model, not just unique fields.\n\n### Updated Minimum NodeJS Version Requirement\n\n> 🚨 Breaking Change: Please Read the Following Carefully Before Upgrading.\n\nThe compilation target of Prisma-AppSync was updated **from Node.js 14 to Node.js 16**. Please ensure you have the minimum required Node.js version (Node.js 16) enabled on your local environment and deployed Lambda function.\n\n### Updated CDK Boilerplate\n\nThe provided CDK Boilerplate has been updated to use the latest depdencies and recommended CDK packages. In addition, the default Lambda function version has been updated to use **Node 18.X**.\n\n## Fixes and improvements\n\n- [GraphQL Schema adjusted to make some array elements and responses non-nullable.](https://github.com/maoosi/prisma-appsync/pull/133)\n- [Schema generation issue when using Prisma @@id attributes](https://github.com/maoosi/prisma-appsync/issues/149)\n\n## Sponsors\n\n<table>\n      <tr>\n        <td align=\"center\" style=\"width:300px;\">\n            <a href=\"https://kuizto.co\" rel=\"noopener\" target=\"_blank\">\n                <img src=\"https://prisma-appsync.vercel.app/sponsors/kuizto-logo.jpg\" width=\"120px;\" alt=\"kuizto.co\"/>\n                <br /><sub><b>Reconnect with home cooking</b></sub>\n            </a>\n        </td>\n    </tr>\n</table>\n\n## Credits\n\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#creator-maoosi\" title=\"Creator & maintainer\">🐙</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tomschut\"><img src=\"https://avatars.githubusercontent.com/u/4933446?v=4?s=100\" width=\"100\" alt=\"Tom\"/><br /><sub><b>Tom</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=tomschut\" title=\"Code\">💻</a> <a href=\"#ideas-tomschut\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://bell.moe\"><img src=\"https://avatars.githubusercontent.com/u/3979239?v=4?s=100\" width=\"100\" alt=\"Bell\"/><br /><sub><b>Bell</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=Tenrys\" title=\"Code\">💻</a> <a href=\"#ideas-Tenrys\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>      \n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/max-konin\"><img src=\"https://avatars.githubusercontent.com/u/1570356?v=4?s=100\" width=\"100\" alt=\"Max Konin\"/><br /><sub><b>Max Konin</b></sub></a><br /><a href=\"https://github.com/maoosi/prisma-appsync/commits?author=max-konin\" title=\"Code\">💻</a></td>\n    </tr>\n  </tbody>\n</table>\n\n## Github sponsors\n\nEnjoy using Prisma-AppSync? **Please consider [💛 Github sponsors](https://github.com/sponsors/maoosi).**\n"
  },
  {
    "path": "docs/changelog/1.0.0.md",
    "content": "---\neditLink: false\n---\n\n# v1.0.0\n\n**Support Prisma-AppSync by Starring Our Repo!**\n\n## 🌟 Sponsor\n\n[![Kuizto — The Everyday Cooking App](https://prisma-appsync.vercel.app/sponsors/kuizto-banner.png \"Kuizto — The Everyday Cooking App\")](https://kuizto.co/?utm_source=prisma_appsync&utm_medium=github)\n\n[Kuizto.co](https://kuizto.co/?utm_source=prisma_appsync&utm_medium=github) is a cooking app that adds a unique twist to everyday cooking. Netflix-like feed to explore tailored recipes. Get inspired by others, save to cooklists, plan instantly!\n\n## 🚀 Release Summary\n\n- Prisma-AppSync officially stable! 🎉\n- <u>Breaking</u> change to context alias values\n- <u>Breaking</u> change to maximum query depth defaults\n- Enhanced `@gql` and `@auth` directives for finer control\n- Generator Revamp & New Diff Tool for improved GraphQL Schema output\n- Streamlined Model Relations: `Create[Model]Without[Relation]Input`\n- Default input values are now visible in your GraphQL IDE\n- Added support for `AWS_LAMBDA` authorization mode\n\n## 👀 Full Changelog\n\n### 👉 Prisma-AppSync officially stable! 🎉\n\nExciting news! Prisma-AppSync has achieved stability and is already in use in multiple production projects. Time to celebrate the release of v1.0.0!\n\n### 👉 <u>Breaking</u> change to context alias values\n\nTo streamline values in `Context.alias` (accessible from hooks and custom resolvers params), the `modify` alias has been renammed to `mutate`, and `batchModify` is now referred to as `batchMutate`.\n\n### 👉 <u>Breaking</u> change to maximum query depth defaults\n\nTo align maximum query depth with the latest changes from v1.0.0, the `maxDepth` default value was changed from `3` to `4`.\n\nTo limit side effects, you have the option to manually set it to its previous value via:\n\n```ts\nconst prismaAppSync = new PrismaAppSync({ maxDepth: 3 })\n```\n\n### 👉 Enhanced `@gql` and `@auth` directives for finer control\n\nThe `@gql` directive has been updated to provide more detailed control over CRUD operations:\n\n```prisma\n// before: only top-level rules were supported\n@gql(queries: null, mutations: null)\n\n// after: define specific rules for each CRUD operation\n@gql(queries: { list: null, count: null }, mutations: { update: null, delete: null })\n```\n\nSame goes with the `@auth` directive, allowing granular access rules per operation:\n\n```prisma\n// before: only top-level rules were supported\n@auth(queries: [{ allow: iam }])\n\n// after: individual rules for specific query operations\n@auth(queries: { list: [{ allow: iam }] })\n```\n\nField-level authorization is now possible with the `@auth` directive:\n\n```prisma\n// newly supported field-level authorization rules\n@auth(fields: { password: [{ allow: apiKey }] })\n```\n\nThe `defaultDirective` in the prisma-appsync generator config is now optional, providing flexibility in configurations:\n\n```prisma\ngenerator appsync {\n  provider = \"prisma-appsync\"\n  // `defaultDirective` can be specified or omitted\n  defaultDirective = \"@auth(model: [{ allow: iam }])\"\n}\n```\n\nWhen provided, `defaultDirective` seamlessly integrates with model-specific directives:\n\n```prisma\n// specified 'defaultDirective' for all models:\n@auth(model: [{ allow: iam }])\n\n// additional 'model directive' for enhanced control:\n@auth(model: [{ allow: apiKey }])\n\n// resulting merged directive for the model:\n@auth(model: [{ allow: iam }, { allow: apiKey }])\n```\n\n### 👉 Generator Revamp for improved GraphQL Schema output\n\nThe Generator package has been totally rewritten to address reported issues and unlock a slew of new features. This not only makes the GraphQL Schema output more concise and well-optimized but also ensures Prisma-AppSync is ready for what's next.\n\nWith the largest production schemas, this revamp has led to a reduction of up to 500 lines in the GraphQL Schema output.\n\n::: info Free online tool: AppSync GraphQL Schema Diff\nTo see the before/after with your own schema or simply compare two different AppSync Schemas, we've published a free online tool: [AppSync GraphQL Schema Diff](https://prisma-appsync.vercel.app/tools/appsync-gql-schema-diff.html).\n:::\n\n### 👉 Streamlined Model Relations: Create[Model]Without[Relation]Input\n\nWith the generator revamp, you can now create, update, or upsert any Model Relation (like Author) tied to a particular Model (such as Post) in just one GraphQL query. This eliminates the previous, more cumbersome process of inserting each Model separately and then manually associating them. The improvement is in sync with the Prisma Client API, offering a more streamlined and developer-friendly approach.\n\n```gql\nmutation {\n  createPost(\n    data: {\n      title: \"Example post\"\n      author: {\n        connectOrCreate: {\n          where: { name: \"John Doe\" }\n          create: { name: \"John Doe\" }\n        }\n      }\n    }\n  ) {\n    title\n    author {\n      name\n    }\n  }\n}\n```\n\n### 👉 Default input values are now visible in your GraphQL IDE\n\nConsidering the Prisma model example below:\n\n```prisma\nmodel Post {\n  content     String\n  views       Int @default(0)\n  isPublished Boolean @default(false)\n}\n```\n\nThis model will result in the following GraphQL schema:\n\n```gql\ninput PostCreateInput {\n  content: String!\n  views: Int = 0\n  isPublished: Boolean = false\n}\n```\n\nThis update automatically fills the default values for `views` (0) and `isPublished` (false) in your GraphQL IDE, making it easier to see and work with your schema defaults.\n\n### 👉 Added support for `AWS_LAMBDA` authorization mode\n\nYou can now utilize `AWS_LAMBDA` as an authorization mode with the `@auth` directive:\n\n```prisma\n// AWS_LAMBDA\n@auth(model: [{ allow: lambda }])\n```\n\n## 🙏 Credits\n\n<a href=\"https://sylvainsimao.fr\"><img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"100\" alt=\"Sylvain\"/><br /><sub><b>Sylvain</b></sub></a><br /><a href=\"#creator-maoosi\" title=\"Creator & maintainer\">🐙</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Code\">💻</a> <a href=\"#ideas-maoosi\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/maoosi/prisma-appsync/commits?author=maoosi\" title=\"Documentation\">📖</a>\n\n## 💛 Github Sponsors\n\nEnjoy using Prisma-AppSync? **Please consider [💛 Github sponsors](https://github.com/sponsors/maoosi).**\n"
  },
  {
    "path": "docs/changelog/index.md",
    "content": "# Changelog\n\n- [(latest) v1.0.0](/changelog/1.0.0.html)\n- [1.0.0-rc.7](/changelog/1.0.0-rc.7.html)\n- [1.0.0-rc.6](/changelog/1.0.0-rc.6.html)\n- [1.0.0-rc.5](/changelog/1.0.0-rc.5.html)\n- [1.0.0-rc.4](/changelog/1.0.0-rc.4.html)\n- [1.0.0-rc.3](/changelog/1.0.0-rc.3.html)\n- [1.0.0-rc.2](/changelog/1.0.0-rc.2.html)\n- [1.0.0-rc.1](/changelog/1.0.0-rc.1.html)"
  },
  {
    "path": "docs/contributing.md",
    "content": "# Contributions guide\n\nThanks for your interest in contributing!\n\n## 👉 Discuss first\n\nBefore starting to work on a pull request, it's always better to open an issue first to confirm its desirability and discuss the approach with the maintainers.\n\n## 👉 Project packages\n\n<table>\n<tr>\n<td width=\"800px\">\n\n**`packages/generator`**\n\nGenerator for [Prisma ORM](https://www.prisma.io/), whose role is to parse your Prisma Schema and generate all the necessary components to run and deploy a GraphQL API tailored for AWS AppSync.\n\n</td>\n</tr>\n<tr>\n<td>\n\n**`packages/client`**\n\nThink of it as [Prisma Client](https://www.prisma.io/client) for GraphQL. Fully typed and designed for AWS Lambda AppSync Resolvers. It can handle CRUD operations with just a single line of code, or be fully extended.\n\n</td>\n</tr>\n<tr>\n<td>\n\n**`packages/installer`**\n\nInteractive CLI tool that streamlines the setup of new Prisma-AppSync projects, making it as simple as running `npx create-prisma-appsync-app@latest`.\n\n</td>\n</tr>\n<tr>\n<td>\n\n**`packages/server`**\n\nLocal dev environment that mimics running Prisma-AppSync in production. It includes an AppSync simulator, local Lambda resolvers execution, a GraphQL IDE, hot-reloading, and authorizations.\n\n</td>\n</tr>\n</table>\n\n## 👉 Repository setup\n\nWe use `pnpm` as the core package manager, `yarn` + `docker` for creating the AWS CDK bundle before deployment, `zx` for running scripts, `aws` + `cdk` CLIs for deployment.\n\n**Start with cloning the repo on your local machine:**\n\n```bash\ngit clone https://github.com/maoosi/prisma-appsync.git\n```\n\n**Checkout the `dev` branch (working branch):**\n\n```bash\ngit checkout dev\n```\n\n**Install pre-requirements:**\n\n| Step |\n|:-------------|\n| 1. Install NodeJS, [latest LTS is recommended ↗](https://nodejs.org/en/about/releases/) |\n| 2. Install [pnpm ↗](https://pnpm.js.org/) |\n| 3. Install [yarn@1 ↗](https://classic.yarnpkg.com/en/docs/install/) |\n| 4. Install [zx ↗](https://github.com/google/zx) |\n| 5. Install [docker ↗](https://www.docker.com/products/docker-desktop) |\n| 6. Install the [AWS CLI ↗](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) |\n| 7. Install the [AWS CDK ↗](https://github.com/aws/aws-cdk) |\n\n**Verify installation:**\n\n```bash\nnode -v && pnpm --version && yarn --version && zx --version && docker --version && aws --version && cdk --version\n```\n\n**Install dependencies:**\n\n```bash\npnpm install\n```\n\n**Run local dev playground:**\n\n```bash\npnpm dev\n```\n\n> See list of commands below for more details about `pnpm dev`.\n\n## 👉 Commands\n\n| Command | Description |\n| ------------- |:-------------|\n| `pnpm install` | Install project dependencies. |\n| `pnpm test` | Run all unit tests and e2e tests. |\n| `pnpm build` | Build the entire prisma-appsync library. |\n| `pnpm dev` | Creates local dev setup, useful for contributing [1]. |\n\n> [1] Auto-generates a 'playground' folder (if not there already) and launches a local GraphQL + AWS AppSync server. This simulates the Prisma-AppSync AWS environment for local development, with 'playground' contents pointing to local source packages.\n\n## 👉 Commit convention\n\nWe use [Conventional Commits ↗](https://www.conventionalcommits.org/) for commit messages such as:\n\n```ts\n<type>[optional scope]: <description>\n```\n\n> - Possible types: `feat` / `fix` / `chore` / `docs`\n> - Possible scopes: `client` / `generator` / `cli` / `boilerplate` / `server`\n> - Description: Short description, with issue number when relevant.\n\nHere are some examples:\n\n| Type | Commit message |\n|:------------- |:------------- |\n| Bug fix | `fix(client): issue #234 - JEST_WORKER_ID replaced` |\n| New feature | `feat(generator): new defaultDirective parameter` |\n| Routine task | `chore: deps updated to latest` |\n| Docs update | `docs: fix typo inside home` |\n\n## 👉 Coding guidelines\n\n### ESLint\n\nWe use [ESLint ↗](https://eslint.org/) for both linting and formatting.\n\n<table><tr><td width=\"500px\" valign=\"top\">\n\n#### IDE Setup\n\nWe recommend using [VS Code ↗](https://code.visualstudio.com/) along with the [ESLint extension ↗](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint).\n\nWith the settings on the right, you can have auto-fix and formatting when you save the code you are editing.\n\n</td><td width=\"500px\"><br>\n\nVS Code's `settings.json`\n\n```json\n{\n    \"editor.codeActionsOnSave\": {\n        \"source.fixAll\": false,\n        \"source.fixAll.eslint\": true\n    }\n}\n```\n\n</td></tr></table>\n\n### No Prettier\n\nSince ESLint is already configured to format the code, there is no need to duplicate the functionality with Prettier. If you have Prettier installed in your editor, we recommend you disable it when working on the project to avoid conflict.\n\n## 👉 License\n\nWhen you contribute code to the Prisma-AppSync project, you grant the maintainers permission to use and share your code under the project's BSD 2-Clause License. You also affirm that you are the original author of the code and have the authority to license it.\n"
  },
  {
    "path": "docs/features/gql-schema.md",
    "content": "# Tweaking GraphQL Schema\n\nPrisma-AppSync provides ways to tweak and customise the GraphQL Schema output.\n\n## 👉 Models directives\n\nTweaking the GraphQL schema for a given model require to write directives via AST comments (triple-slash `///`).\n\n```prisma\n/// @gql(mutations: null, subscriptions: null)\n/// @gql(fields: { password: null })\n/// @gql(scalars: { email: \"AWSEmail\" })\nmodel User {\n  id       Int       @id @default(autoincrement())\n  email    String\n  password String\n}\n```\n\n## 👉 Usage with @gql syntax\n\n### Disabling an entire model\n\n```prisma\n// Disable all queries, mutations and subscriptions\n@gql(model: null)\n```\n\n### Disabling queries\n\n```prisma\n// Disable all queries (get, list, count, ...)\n@gql(queries: null)\n\n// Disable granular queries\n@gql(queries: { list: null, count: null })\n```\n\n### Disabling mutations\n\n```prisma\n// Disable all mutations (create, update, upsert, delete, ...)\n@gql(mutations: null)\n\n// Disable granular mutations\n@gql(mutations: { update: null, delete: null })\n```\n\n> **Cascading Rules:**\n>\n> - Disabling `update` **will also disable** `upsert`\n> - Disabling `create` **will also disable** `upsert`\n> - Disabling `mutations` **will also disable** `subscriptions`\n\n### Disabling subscriptions\n\n```prisma\n// Disable all subscriptions (onCreated, onUpdated, ...)\n@gql(subscriptions: null)\n\n// Disable granular subscriptions\n@gql(mutations: { onCreated: null, onUpdated: null })\n```\n\n### Hiding fields\n\n```prisma\n// If applied to a model with a `password` field:\n// hide `password` field from the generated Type\n@gql(fields: { password: null })\n```\n\n> **Note:** To maintain Prisma Client integrity, hidden fields remain writable in mutation operations.\n\n### Custom scalars on fields\n\n```prisma\n// If applied to a model with a `website` (string) field:\n// use scalar `AWSURL` instead of default `String`\n@gql(scalars: { website: \"AWSURL\" })\n```\n"
  },
  {
    "path": "docs/features/hooks.md",
    "content": "# Lifecycle hooks\n\nHooks let you “hook into” Prisma-AppSync lifecycle to either trigger custom business logic or manipulate data at runtime.\n\n## 👉 Example code\n\nBasic example:\n\n```ts\nreturn await prismaAppSync.resolve({\n    event,\n    hooks: {\n        // Mutate Post title before creation on database\n        'before:createPost': async (params: BeforeHookParams) => {\n            params.prismaArgs.data.title = 'New post title'\n            return params\n        },\n        // Override query result using always the same Post title\n        'after:listPosts': async (params: AfterHookParams) => {\n            params.result = params.result.map(r => r.title = 'Always the same title')\n            return params\n        },\n    },\n})\n```\n\nAdvanced example:\n\n```ts\nreturn await prismaAppSync.resolve<'likePost'>({\n    event,\n    hooks: {\n        // execute before any query\n        'before:**': async (params: BeforeHookParams) => params,\n\n        // execute after any query\n        'after:**': async (params: AfterHookParams) => params,\n\n        // execute after custom resolver query `likePost`\n        // (e.g. `query { likePost(postId: 3) }`)\n        'after:likePost': async (params: AfterHookParams) => {\n            await params.prismaClient.notification.create({\n                data: {\n                    event: 'POST_LIKED',\n                    targetId: params.args.postId,\n                    userId: params.authIdentity.sub,\n                },\n            })\n            return params\n        },\n    },\n})\n```\n\n## 👉 Types\n\n```ts\nexport interface QueryParams {\n    type: GraphQLType\n    operation: string\n    context: Context\n    fields: string[]\n    paths: string[]\n    args: any\n    prismaArgs: PrismaArgs\n    authorization: Authorization\n    identity: Identity\n    headers: any\n    prismaClient: PrismaClient\n}\n\ntype BeforeHookParams = QueryParams\n\ntype AfterHookParams = QueryParams & {\n    result: any | any[]\n}\n```\n\n## 👉 Usage rules\n\n- Hooks are made of a **Path** (e.g. `after:updatePost`) and an async function.\n- **Path** syntax always starts with `before:` or `after:`.\n\n    > `before` or `after` querying data from the database.\n\n- **Path** syntax after `:` uses [Micromatch syntax](https://github.com/micromatch/micromatch).\n- Hooks are fully typed, so VSCode IntelliSense will give you the full list of Hooks Paths you can use while typing. Example:\n\n![Prisma-AppSync hooks on VS Code](/guides/hooks-autocompletion.png)\n\n- Hooks functions all receive a single object as a parameter. Here is an example object received inside `after:getPost`:\n\n```json\n{\n    \"type\": \"Query\",\n    \"operation\": \"getPost\",\n    \"context\": { \"action\": \"get\", \"alias\": \"access\", \"model\": \"Post\" },\n    \"fields\": [\"title\", \"status\"],\n    \"paths\": [\"get/post/title\", \"get/post/status\"],\n    \"args\": { \"where\": { \"id\": 5 } },\n    \"prismaArgs\": {\n        \"where\": { \"id\": 5 },\n        \"select\": { \"title\": true, \"status\": true }\n    },\n    \"authorization\": \"API_KEY\",\n    \"identity\": {},\n    \"result\": { \"title\": \"My first post\", \"status\": \"PUBLISHED\" }\n}\n```\n\n- Key `result` is only available inside `after` hooks.\n- Hooks async functions MUST return the object received as a parameter (either mutated or untouched).\n- Using hooks on custom resolvers requires explicitly listing resolvers using a TypeScript Generic `prismaAppSync.resolve<T>`:\n\n```ts\n// Using custom resolver `likePost`\nreturn await prismaAppSync.resolve<'likePost'>({ event, hooks })\n\n// Using multiple custom resolvers\nreturn await prismaAppSync.resolve<'likePost' | 'unlikePost'>({ event, hooks })\n```\n"
  },
  {
    "path": "docs/features/resolvers.md",
    "content": "# Custom resolvers\n\nLet's assume we want to extend our GraphQL CRUD API and add a custom mutation `incrementPostsViews` based on our Prisma Schema:\n\n```prisma\nmodel Post {\n    id     Int  @id @default(autoincrement())\n    views  Int\n}\n```\n\n## 👉 1. Extending our GraphQL Schema\n\nTo extend our auto-generated `schema.gql`, we will create a new `custom-schema.gql` file next to our `schema.prisma` file:\n\n```graphql\nextend type Mutation {\n  \"\"\"\n  Increment post views by +1\n  \"\"\"\n  incrementPostsViews(postId: Int!): Post\n}\n```\n\nFor Prisma-AppSync to merge our `custom-schema.gql` with the auto-generated schema, we edit the `schema.prisma` generator config:\n\n```json{3}\ngenerator appsync {\n  provider = \"prisma-appsync\"\n  extendSchema = \"./custom-schema.gql\"\n}\n```\n\n## 👉 2. Extending our Resolvers Config\n\nFor AWS AppSync to be able to use our new `incrementPostsViews` mutation, we also create a new `custom-resolvers.yaml` next to our `schema.prisma` file:\n\n```yaml\n- typeName: Mutation\n  fieldName: incrementPostsViews\n  dataSource: prisma-appsync\n```\n\nFor Prisma-AppSync to merge our `custom-resolvers.yaml` with the auto-generated resolvers config, we edit the `schema.prisma` generator config:\n\n```json{4}\ngenerator appsync {\n  provider = \"prisma-appsync\"\n  extendSchema = \"./custom-schema.gql\"\n  extendResolvers = \"./custom-resolvers.yaml\"\n}\n```\n\n## 👉 3. Coding our new Resolver Function\n\nQuerying the `incrementPostsViews` mutation will automatically run a Resolver Function inside our Lambda `handler.ts` file. This is where we will code our custom business logic.\n\n```ts\nreturn await prismaAppSync.resolve<'incrementPostsViews'>({\n    event,\n    resolvers: {\n        // code for our new resolver function\n        incrementPostsViews: async ({ args, prismaClient }: QueryParamsCustom) => {\n            return await prismaClient.post.update({\n                data: { views: { increment: 1 } },\n                where: { id: args.postId }\n            })\n        },\n    }\n})\n```\n\n## 👉 4. Updating our CDK file for bundling\n\nTo make sure our `custom-schema.gql` and `custom-resolvers.yaml` are properly bundled and deployed on AWS, we update the `beforeBundling` function inside `cdk/index.ts`:\n\n```ts\nfunction: {\n  bundling: {\n    commandHooks: {\n      beforeBundling(inputDir: string, outputDir: string): string[] {\n        const schema = path.join(inputDir, 'prisma/schema.prisma')\n        const gql = path.join(inputDir, 'prisma/custom-schema.gql')\n        const yaml = path.join(inputDir, 'prisma/custom-resolvers.yaml')\n\n        return [\n          `cp ${schema} ${outputDir}`,\n          `cp ${gql} ${outputDir}`,\n          `cp ${yaml} ${outputDir}`,\n        ]\n      },\n    },\n  }\n}\n```\n\n🚀 **Done! Next time we deploy on AWS, we will be able to use our new `incrementPostsViews` mutation.**\n"
  },
  {
    "path": "docs/index.md",
    "content": "---\nlayout: home\n\nhero:\n  name: Prisma-AppSync\n  text: GQL API Generator for Prisma ORM\n  tagline: Turns your Prisma Schema into a fully-featured GraphQL API, tailored for AWS AppSync.\n  image:\n    src: /logo.svg\n    alt: Prisma-AppSync\n  actions:\n    - theme: brand\n      text: Try Prisma-AppSync\n      link: /quick-start/getting-started\n    - theme: alt\n      text: View on GitHub ↗\n      link: https://github.com/maoosi/prisma-appsync\n\nfeatures:\n  - icon: ◭\n    title: Prisma Schema to CRUD API\n    details: Deploy a GraphQL API from your Prisma Schema with auto-generated CRUD.\n  - icon: ⚡️\n    title: GraphQL on AWS AppSync \n    details: Serverless GraphQL with real-time updates and built-in security on AppSync.\n  - icon: 🧑‍💻\n    title: Fast and Flexible DX\n    details: Build and deploy a working API in minutes, easily customise to your needs.\n---"
  },
  {
    "path": "docs/quick-start/deploy.md",
    "content": "# Deploy\n\n## 👉 1. Prepare your local machine\n\nMake sure to install the below on your local machine:\n\n- [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)\n- [AWS CDK CLI](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install)\n- [Docker](https://docs.docker.com/get-docker/)\n\nThen [configure your local environment](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-environment) with the AWS Account of your choice.\n\n## 👉 2. Setup a Database\n\nSetup the database of your choice. It doesn't have to be hosted on Amazon AWS, you can use any database supported by Prisma. If you are not sure what to use, we recommend using [PlanetScale](https://planetscale.com) and read the following [integration guide](https://planetscale.com/docs/tutorials/prisma-quickstart).\n\n## 👉 3. Deploy on AWS\n\nRun the below CDK CLI command:\n\n> Where `DATABASE_URL` is your own [database connection url](https://www.prisma.io/docs/reference/database-reference/connection-urls).\n\n```bash\nDATABASE_URL=mysql://xxx yarn deploy\n```\n\n**🚀 Done! Your GraphQL API is now ready to use.**\n"
  },
  {
    "path": "docs/quick-start/getting-started.md",
    "content": "# Getting started\n\n**Prisma-AppSync** seamlessly transforms your [Prisma Schema](https://www.prisma.io) into a comprehensive GraphQL&#160;API, tailored for [AWS AppSync](https://aws.amazon.com/appsync/).\n\n<table><tr><td width=\"500px\" valign=\"top\">\n\n**From `schema.prisma`:**\n\n```prisma\nmodel Post {\n    id         Int\n    title      String\n}\n```\n\n</td><td width=\"500px\">\n\n**To full-blown GraphQL API:**\n\n```graphql\nquery list {\n  listPosts {\n    id\n    title\n  }\n}\n```\n\n</td></tr></table>\n\n## 👉 Features\n\n💎 **Use your ◭ Prisma Schema**<br/>Quickly define your data model and deploy a GraphQL API tailored for AWS AppSync.\n\n⚡️ **Auto-generated CRUD operations**<br/>Using Prisma syntax, with a robust TS Client designed for AWS Lambda Resolvers.\n\n⛑ **Pre-configured security**<br/>Built-in XSS protection, query depth limitation, and in-memory rate limiting.\n\n🔐 **Fine-grained ACL and authorization**<br/>Flexible security options such as API keys, IAM, Cognito, and more.\n\n🔌 **Fully extendable features**<br/>Customize your GraphQL schema, API resolvers, and data flow as needed.\n\n## 👉 Built around 4 packages\n\n<table>\n<tr>\n<td width=\"800px\">\n\n**`packages/generator`**\n\nGenerator for [Prisma ORM](https://www.prisma.io/), whose role is to parse your Prisma Schema and generate all the necessary components to run and deploy a GraphQL API tailored for AWS AppSync.\n\n</td>\n</tr>\n<tr>\n<td>\n\n**`packages/client`**\n\nThink of it as [Prisma Client](https://www.prisma.io/client) for GraphQL. Fully typed and designed for AWS Lambda AppSync Resolvers. It can handle CRUD operations with just a single line of code, or be fully extended.\n\n</td>\n</tr>\n<tr>\n<td>\n\n**`packages/installer`**\n\nInteractive CLI tool that streamlines the setup of new Prisma-AppSync projects, making it as simple as running `npx create-prisma-appsync-app@latest`.\n\n</td>\n</tr>\n<tr>\n<td>\n\n**`packages/server`**\n\nLocal dev environment that mimics running Prisma-AppSync in production. It includes an AppSync simulator, local Lambda resolvers execution, a GraphQL IDE, hot-reloading, and authorizations.\n\n</td>\n</tr>\n</table>\n"
  },
  {
    "path": "docs/quick-start/installation.md",
    "content": "# Installation\n\n## 👉 Option 1: Using the CLI Installer (recommended)\n\nRun the following command and follow the prompts 🙂\n\n```bash\nnpx create-prisma-appsync-app@latest\n```\n\n🚀 Done!\n\n## 👉 Option 2: Manual Install\n\nAdd `prisma-appsync` to your project dependencies.\n\n```bash\n# using yarn\nyarn add prisma-appsync\n\n# using npm\nnpm i prisma-appsync\n```\n\nEdit your `schema.prisma` file and add:\n\n```json\ngenerator appsync {\n  provider = \"prisma-appsync\"\n}\n```\n\nAlso make sure to use the right binary targets:\n\n```json{3}\ngenerator client {\n  provider      = \"prisma-client-js\"\n  binaryTargets = [\"native\", \"rhel-openssl-1.0.x\"]\n}\n```\n\nGenerate your Prisma Client (this will also generate your Prisma-AppSync client):\n\n```bash\nnpx prisma generate\n```\n\nCreate your `handler.ts` Lambda handler (AppSync Direct Lambda Resolver):\n\n```ts\n// Import generated Prisma-AppSync client (adjust path as necessary)\nimport { PrismaAppSync } from './prisma/generated/prisma-appsync/client'\n\n// Instantiate Prisma-AppSync Client\nconst prismaAppSync = new PrismaAppSync()\n\n// Lambda handler (AppSync Direct Lambda Resolver)\nexport const main = async (event: any) => {\n    return await prismaAppSync.resolve({ event })\n}\n```\n\nEither copy the AWS CDK boilerplate provided with Prisma-AppSync into your project, OR just use it as a reference for your own CDK config:\n\n```bash\n# path to cdk boilerplate\n./node_modules/prisma-appsync/dist/boilerplate/cdk/\n```\n\nRefer to [AWS CDK Toolkit docs ↗](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) for more info.\n\n"
  },
  {
    "path": "docs/quick-start/usage.md",
    "content": "# Usage\n\n## 👉 Folder structure\n\nUsing the CLI Installer (recommended):\n\n```bash\nproject/\n  |__ handler.ts  # lambda function handler (API resolver)\n  |__ server.ts   # local server (for dev)\n  |__ cdk/        # AWS CDK deploy boilerplate\n  |__ prisma/\n    |__ schema.prisma  # prisma schema (data source)\n    |__ generated/     # auto-generated after each `npx prisma generate`\n```\n\n## 👉 Generating the API\n\nRun the below command from the project root directory:\n\n```bash\nnpx prisma generate\n```\n\nAfter each `prisma generate`, files inside `prisma/generated` will be auto-generated.\n\n## 👉 Local dev server\n\nRun the local server and try Prisma-AppSync locally (only if using the CLI Installer):\n\n```bash\nyarn run dev\n```\n\nThis will automatically push your Prisma Schema changes to a SQLite database, as well as launch a local GraphQL IDE server (with auto-reload and TS support).\n"
  },
  {
    "path": "docs/security/appsync-authz.md",
    "content": "# AppSync Authorization modes\n\nAWS AppSync provides [authz directives ↗](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html) for configuring security and data protection.\n\n::: warning SECURITY MUST NEVER BE TAKEN FOR GRANTED\nPrisma-AppSync implements a basic mechanism to help mitigate some common issues. However, accuracy is not guaranteed and you should always test your own API security implementation.\n:::\n\n## 👉 Models directives\n\nApplying AppSync authorization modes for a given model require to write directives using AST comments (triple-slash `///`).\n\n```prisma\n/// @auth(model: [{ allow: iam }, { allow: apiKey }])\nmodel Post {\n  id       Int       @id @default(autoincrement())\n  title    String\n}\n```\n\n## 👉 Usage with @auth syntax\n\n> **Note:** For now, `@auth` only works supports the `allow` key.\n\n### Entire model\n\n```prisma\n// Apply to all queries, mutations and subscriptions\n@auth(model: [{ allow: iam }])\n```\n\n### Queries\n\n```prisma\n// Apply to all queries (get, list, count, ...)\n@auth(queries: [{ allow: iam }])\n\n// Apply to granular queries\n@auth(queries: { list: [{ allow: iam }] })\n```\n\n### Mutations\n\n```prisma\n// Apply to all mutations (create, update, upsert, delete, ...)\n@auth(mutations: [{ allow: iam }])\n\n// Apply to granular mutations\n@auth(mutations: { create: [{ allow: iam }] })\n```\n\n### Subscriptions\n\n```prisma\n// Apply to all subscriptions (onCreated, onUpdated, ...)\n@auth(subscriptions: [{ allow: iam }])\n\n// Apply to granular subscriptions\n@auth(subscriptions: { onCreated: [{ allow: iam }] })\n```\n\n### Fields\n\n```prisma\n// Apply to specific Type fields\n@auth(fields: { password: [{ allow: apiKey }] })\n```\n\n## 👉 Supported Authorization modes\n\n<https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html>\n\n```prisma\n// API_KEY Authorization\n@auth(model: [{ allow: apiKey }])\n\n// AWS_IAM\n@auth(model: [{ allow: iam }])\n\n// OPENID_CONNECT\n@auth(model: [{ allow: oidc }])\n\n// AWS_LAMBDA\n@auth(model: [{ allow: lambda }])\n\n// AMAZON_COGNITO_USER_POOLS\n@auth(model: [{ allow: userPools }])\n\n// AMAZON_COGNITO_USER_POOLS with groups\n@auth(model: [{ allow: userPools, groups: [\"users\", \"admins\"] }])\n\n// Allow multiples\n@auth(model: [{ allow: apiKey }, { allow: userPools, groups: [\"admins\"] }])\n```\n\n## 👉 Default directive\n\nIt is also possible to set a `defaultDirective`, that will apply to all generated Types:\n\n```prisma{3}\ngenerator appsync {\n  provider = \"prisma-appsync\"\n  defaultDirective = \"@auth(model: [{ allow: iam }])\"\n}\n```\n\nWhen provided, `defaultDirective` seamlessly integrates with model-specific directives:\n\n```prisma\n// specified 'defaultDirective' for all models:\n@auth(model: [{ allow: iam }])\n\n// additional 'model directive' for enhanced control:\n@auth(model: [{ allow: apiKey }])\n\n// resulting merged directive for the model:\n@auth(model: [{ allow: iam }, { allow: apiKey }])\n```\n"
  },
  {
    "path": "docs/security/query-depth.md",
    "content": "# Query depth\n\n## 👉 Usage\n\nPrisma-AppSync automatically prevents from abusing query depth, by limiting query complexity.\n\n**For example, it will prevent from doing this:**\n\n```graphql\nquery IAmEvil {\n  author(id: \"abc\") {\n    posts {\n      author {\n        posts {\n          author {\n            posts {\n              author {\n                # that could go on as deep as the client wants!\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nDefault value for the maximum query depth is set to `4`. It is possible to change the default max depth value via the `maxDepth` option:\n\n```ts\nconst prismaAppSync = new PrismaAppSync({ maxDepth: 3 })\n```\n"
  },
  {
    "path": "docs/security/rate-limiter.md",
    "content": "# Rate limiter (DOS)\n\n::: warning WARNING NOTICE\nLimits are kept in memory and are not shared between function instantiations. This means limits can reset arbitrarily when new instances get spawned or different instances are used to serve requests.\n:::\n\n## 👉 Usage\n\nPrisma-AppSync uses in-memory rate-limiting to try protect your Database from most common DOS attacks.\n\nTo change the default value (default to 200 requests per user, per minute), you can adjust the `maxReqPerUserMinute` option when instantiating the Client:\n\n```ts\nconst prismaAppSync = new PrismaAppSync({ maxReqPerUserMinute: 500 })\n```\n\n## 👉 Disable rate limiter\n\nIf you prefer to disable the in-memory rate limiter, set the option to false:\n\n```ts\nconst prismaAppSync = new PrismaAppSync({ maxReqPerUserMinute: false })\n```\n"
  },
  {
    "path": "docs/security/shield-acl.md",
    "content": "# Shield (Access Control Rules)\n\nFine-grained access control rules can be used via the `shield` property of Prisma-AppSync client, directly inside the Lambda Handler function.\n\n::: warning SECURITY MUST NEVER BE TAKEN FOR GRANTED\nPrisma-AppSync implements a basic mechanism to help mitigate some common issues. However, accuracy is not guaranteed and you should always test your own API security implementation.\n:::\n\n## 👉 Basic example\n\nFor example, we might want to only allow access to `PUBLISHED` posts:\n\n```ts\nreturn await prismaAppSync.resolve({\n    event,\n    shield: () => {\n        // Prisma filtering syntax\n        // https://www.prisma.io/docs/concepts/components/prisma-client/filtering-and-sorting\n        const isPublished = { status: { equals: 'PUBLISHED' } }\n\n        return {\n            // Micromatch syntax\n            // https://github.com/micromatch/micromatch\n            'getPost{,/**}': {\n                rule: isPublished,\n                reason: () => 'Unpublished Posts cannot be accessed.',\n            },\n        }\n    },\n})\n```\n\nUseful links to create shield rules:\n\n- [Micromatch syntax](https://github.com/micromatch/micromatch)\n- [Micromatch tester](https://globster.xyz/?q=getPost%7B%2C%2F**%7D&f=getPost%2Ftitle%2CgetPost%2Fstatus)\n\n## 👉 Usage with AppSync Authorization modes\n\nCombining fine-grained access control with [AppSync Authorization modes](/security/appsync-authz) allows to implement powerful controls around data.\n\nLet's assume we want to restrict API access to users logged in via `AMAZON_COGNITO_USER_POOLS` and only allow the owner of a given Post to modify it:\n\n```ts\nreturn await prismaAppSync.resolve({\n    event,\n    shield: ({ authorization, identity }: QueryParams) => {\n        const isCognitoAuth = authorization === Authorizations.AMAZON_COGNITO_USER_POOLS\n        const isOwner = { owner: { cognitoSub: identity?.sub } }\n\n        return {\n            '**': {\n                rule: isCognitoAuth,\n                reason: ({ model }) => `${model} access is restricted to logged-in users.`,\n            },\n            '{update,upsert,delete}Post{,/**}': {\n                rule: isOwner,\n                reason: ({ model }) => `${model} can only be modified by their owner.`,\n            },\n        }\n    },\n})\n```\n\n> The above example implies using Cognito User Pools Authorization. Plus having set up an `Owner` relation on the `Post` model, and a `cognitoSub` field on the `User` model (containing all users `sub`).\n\n## 🚨 Order matters\n\nThe latest matching rule ALWAYS overrides previous ones.\n\n```ts\n// Bad - Second rule overrides first one\nreturn {\n    'listUsers/password': false,\n    'listUsers{,/**}': true,\n}\n\n// Good - Always write the more specific rules last\nreturn {\n    'listUsers{,/**}': true,\n    'listUsers/password': false\n}\n```\n"
  },
  {
    "path": "docs/security/xss-sanitizer.md",
    "content": "# XSS sanitizer\n\n## 👉 Usage\n\nPrisma-AppSync automatically perform XSS sanitization and encode all data coming through the GraphQL API.\n\n**Take a look at this example:**\n\n<table><tr><td width=\"800px\">\n\n1/ Assuming the following GraphQL Input:\n\n```graphql\nmutation maliciousPost($title: String!) {\n  createPost(data: { title: $title }) {\n    title\n  }\n}\n```\n\n```json\n{\n    \"title\": \"<IMG SRC=\\\"javascript:alert('XSS');\\\">\"\n}\n```\n\n</td></tr><tr><td>\n\n2/ Prisma-AppSync will automatically remove the malicious code and encode Html, before storing anything in the database:\n\n| Column name | Value |\n| ------------- |:-------------|\n| title | `&lt;img src&gt;` |\n\n</td></tr><tr><td>\n\n3/ Finally, the GraphQL API will also automatically clarify (decode) all data before sending the response:\n\n```ts\nconsole.log(post.title) // output: \"<img src>\"\n```\n\n</td></tr></table>\n\n## 👉 Disable xss sanitization\n\nIf you prefer to disable data sanitization, set the `sanitize` option to false when instantiating the Client:\n\n```ts\nconst prismaAppSync = new PrismaAppSync({ sanitize: false })\n```\n"
  },
  {
    "path": "docs/support.md",
    "content": "# Support\n\n## <img src=\"https://avatars.githubusercontent.com/u/4679377?v=4?s=100\" width=\"50\" alt=\"Sylvain\"/>\n\n**👋 Hi, I’m Sylvain! [On-demand CTO](https://sylvainsimao.com/freelance/) and creator of ◭ Prisma-AppSync.**\n\nUsing Prisma-AppSync in production and looking for hourly paid support? You can contact me on [Twitter](https://twitter.com/Sylvain_Simao), message me on [LinkedIn](https://www.linkedin.com/in/sylvainsimao/), or [send me an email](https://sylvainsimao.com/contact).\n"
  },
  {
    "path": "docs/tools/appsync-gql-schema-diff.md",
    "content": "---\naside: false\n---\n\n<script lang=\"ts\" setup>\nimport { buildSchema } from 'graphql';\nimport { diff as diffSchema } from '@graphql-inspector/core'\nimport { ref, watch } from 'vue'\n\nconst old_schema = ref('')\nconst new_schema = ref('')\nconst output = ref<{ message: string; level: \"BREAKING\" | \"NON_BREAKING\" | \"DANGEROUS\"}[]>([])\nconst error = ref(false)\n\nwatch([old_schema, new_schema], async () => {\n    error.value = false\n\n    try {\n        const aws = `\n            scalar AWSDate\n            scalar AWSTime\n            scalar AWSDateTime\n            scalar AWSTimestamp\n            scalar AWSEmail\n            scalar AWSJSON\n            scalar AWSURL\n            scalar AWSPhone\n            scalar AWSIPAddress\n            scalar BigInt\n            scalar Double\n            directive @aws_subscribe(mutations: [String!]!) on FIELD_DEFINITION\n            directive @deprecated(reason: String) on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ENUM | ENUM_VALUE\n            directive @aws_auth(cognito_groups: [String!]!) on FIELD_DEFINITION\n            directive @aws_api_key on FIELD_DEFINITION | OBJECT\n            directive @aws_iam on FIELD_DEFINITION | OBJECT\n            directive @aws_oidc on FIELD_DEFINITION | OBJECT\n            directive @aws_cognito_user_pools(cognito_groups: [String!]) on FIELD_DEFINITION | OBJECT\n            directive @aws_lambda on FIELD_DEFINITION | OBJECT`\n\n        const logs = await diffSchema(\n            buildSchema(aws + '\\n' + old_schema.value),\n            buildSchema(aws + '\\n' + new_schema.value)\n        )\n\n        output.value = format(logs)\n    } catch(err) {\n        output.value = [{ message: err.message, level: 'BREAKING' }]\n        error.value = true\n    }\n})\n\nfunction format(logs) {\n    return logs.map(log => ({ message: log.message, level: log.criticality.level }))\n}\n</script>\n\n# AppSync GraphQL Schema Diff\n\nCompare changes between AppSync GraphQL Schemas.\n\n<div class=\"tool\">\n    <div class=\"diff\">\n        <label>\n            Old Schema\n            <textarea v-model=\"old_schema\" placeholder=\"Paste old gql schema\"></textarea>\n        </label>\n        <label>\n            New Schema\n            <textarea v-model=\"new_schema\" placeholder=\"Paste new gql schema\"></textarea>\n        </label>\n    </div>\n    <div class=\"output\" v-if=\"old_schema && new_schema\">\n        <label>Diff:</label>\n        <ol>\n            <li v-for=\"log in output\" :class=\"{ breaking: log.level === 'BREAKING', dangerous: log.level === 'DANGEROUS' }\">\n                {{ log.level }}: {{ log.message }}\n            </li>\n        </ol>\n        <span v-if=\"output.length === 0\">No differences.</span>\n    </div>\n</div>\n\n<style lang=\"scss\" scoped>\n.tool {\n    display: flex;\n    flex-direction: column;\n    gap: 4rem;\n    margin-top: 2rem;\n}\n\n.diff {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    width: 100%;\n    height: 500px;\n    gap: 2rem;\n    font-size: 0.8rem;\n\n    label {\n        font-weight: bold;\n    }\n\n    textarea {\n        border: 1px solid #1d1d1d;\n        display: block;\n        width: 100%;\n        height: 100%;\n        border-radius: 15px;\n        padding: 0.5rem;\n    }\n}\n\n.output {\n    display: block;\n    font-size: 0.8rem;\n\n    label {\n        font-weight: bold;\n    }\n\n    span {\n        color: green;\n    }\n\n    li {\n        color: #02a676;\n\n        &.breaking { color: #d6231e; }\n        &.dangerous { color: #f8b500; }\n    }\n}\n</style>\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"prisma-appsync\",\n    \"version\": \"1.0.2\",\n    \"description\": \"⚡ AppSync GraphQL API Generator for ◭ Prisma ORM.\",\n    \"author\": \"maoosi <hello@sylvainsimao.fr>\",\n    \"license\": \"BSD-2-Clause\",\n    \"repository\": \"git@github.com:maoosi/prisma-appsync.git\",\n    \"keywords\": [\n        \"api\",\n        \"appsync\",\n        \"aws\",\n        \"crud\",\n        \"generator\",\n        \"graphql\",\n        \"prisma\",\n        \"prisma-appsync\",\n        \"appsync-crud-api\"\n    ],\n    \"bin\": \"./dist/generator.js\",\n    \"engines\": {\n        \"node\": \">=14\",\n        \"pnpm\": \">=6\"\n    },\n    \"scripts\": {\n        \"preinstall\": \"npx only-allow pnpm\",\n        \"postinstall\": \"zx bin/postinstall.mjs\",\n        \"build\": \"zx bin/build.mjs\",\n        \"test\": \"zx bin/test.mjs\",\n        \"dev\": \"zx bin/dev.mjs\",\n        \"cleans\": \"zx bin/cleans.mjs\",\n        \"publish\": \"zx bin/publish.mjs\",\n        \"docs:dev\": \"vitepress dev docs\",\n        \"docs:build\": \"vitepress build docs\",\n        \"docs:serve\": \"vitepress serve docs\"\n    },\n    \"devDependencies\": {\n        \"@antfu/eslint-config\": \"^2.4.6\",\n        \"@graphql-inspector/core\": \"^5.0.2\",\n        \"@graphql-tools/schema\": \"^10.0.2\",\n        \"@prisma/client\": \"^5.7.1\",\n        \"@types/lodash\": \"^4.14.202\",\n        \"@types/node\": \"^20.10.5\",\n        \"@zerollup/ts-transform-paths\": \"^1.7.18\",\n        \"all-contributors-cli\": \"^6.26.1\",\n        \"easygraphql-tester\": \"^6.0.1\",\n        \"esbuild\": \"^0.19.10\",\n        \"eslint\": \"^8.56.0\",\n        \"graphql\": \"16.8.1\",\n        \"listr\": \"^0.14.3\",\n        \"lodash\": \"^4.17.21\",\n        \"pluralize\": \"^8.0.0\",\n        \"prisma\": \"^5.7.1\",\n        \"prompts\": \"^2.4.2\",\n        \"sass\": \"^1.69.5\",\n        \"ts-node\": \"^10.9.2\",\n        \"tsconfig-paths\": \"^4.2.0\",\n        \"typescript\": \"^5.3.3\",\n        \"vite\": \"^5.0.10\",\n        \"vite-tsconfig-paths\": \"^4.2.2\",\n        \"vitepress\": \"1.0.0-rc.32\",\n        \"vitest\": \"^1.1.0\"\n    }\n}\n"
  },
  {
    "path": "packages/boilerplate/cdk/package.json",
    "content": "{\n    \"name\": \"prisma-appsync-cdk\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Sample AWS CDK template for Prisma-AppSync\",\n    \"author\": \"maoosi <hello@sylvainsimao.fr>\",\n    \"private\": true,\n    \"license\": \"BSD-2-Clause\",\n    \"devDependencies\": {\n        \"@types/js-yaml\": \"^4.0.5\",\n        \"@types/node\": \"^20.4.8\",\n        \"aws-cdk-lib\": \"^2.90.0\",\n        \"constructs\": \"^10.2.69\",\n        \"js-yaml\": \"^4.1.0\",\n        \"scule\": \"^1.0.0\",\n        \"ts-node\": \"^10.9.1\",\n        \"typescript\": \"^5.1.6\"\n    }\n}\n"
  },
  {
    "path": "packages/boilerplate/cdk/src/appsync.ts",
    "content": "/* eslint-disable no-new */\nimport { readFileSync } from 'fs'\nimport type { Construct } from 'constructs'\nimport { camelCase, kebabCase, pascalCase } from 'scule'\nimport { load } from 'js-yaml'\nimport {\n    Duration,\n    RemovalPolicy,\n    Stack,\n    aws_appsync as appSync,\n    aws_iam as iam,\n    aws_lambda as lambda,\n    aws_lambda_nodejs as lambdaNodejs,\n    type StackProps\n} from 'aws-cdk-lib'\n\nexport interface AppSyncStackProps {\n    resourcesPrefix: string\n    cognitoUserPoolId?: string\n    schema: string\n    resolvers: string\n    function: {\n        code: string\n        memorySize: number\n        useWarmUp: number\n        policies?: iam.PolicyStatementProps[]\n        bundling?: lambdaNodejs.BundlingOptions\n        environment?: {}\n    }\n    additionalApiKeys?: string[]\n    authorizationConfig: appSync.AuthorizationConfig\n}\n\nexport class AppSyncStack extends Stack {\n    private props: AppSyncStackProps\n    private resourcesPrefix: string\n    private resourcesPrefixCamel: string\n    private graphqlApi: appSync.GraphqlApi\n    private directResolverFn: lambda.Alias\n    private apiRole: iam.Role\n    private dataSources: {\n        lambda?: appSync.LambdaDataSource\n        none?: appSync.NoneDataSource\n    }\n\n    constructor(scope: Construct, id: string, tplProps: AppSyncStackProps, props?: StackProps) {\n        super(scope, id, props)\n\n        // stack naming convention\n        this.props = tplProps\n        this.resourcesPrefix = kebabCase(this.props.resourcesPrefix)\n        this.resourcesPrefixCamel = camelCase(this.resourcesPrefix)\n\n        this.createGraphQLApi()\n        this.createLambdaResolver()\n        this.createDataSources()\n        this.createPrismaAppSyncResolvers()\n    }\n\n    createGraphQLApi() {\n        // create appsync instance\n        this.graphqlApi = new appSync.GraphqlApi(this, `${this.resourcesPrefixCamel}Api`, {\n            name: this.resourcesPrefix,\n            schema: appSync.SchemaFile.fromAsset(this.props.schema),\n            authorizationConfig: this.props.authorizationConfig,\n            logConfig: {\n                fieldLogLevel: appSync.FieldLogLevel.ERROR,\n            },\n            xrayEnabled: true,\n        })\n\n        // create default API key\n        new appSync.CfnApiKey(this, `${this.resourcesPrefixCamel}ApiKey`, {\n            apiId: this.graphqlApi.apiId,\n            description: `${this.resourcesPrefix}_api-key`,\n            expires: Math.floor(new Date().setDate(new Date().getDate() + 365) / 1000.0),\n        })\n\n        // create additional API keys\n        if (this.props.additionalApiKeys) {\n            this.props.additionalApiKeys.forEach((apiKey: string) => {\n                new appSync.CfnApiKey(this, `${this.resourcesPrefixCamel}ApiKey${pascalCase(apiKey)}`, {\n                    apiId: this.graphqlApi.apiId,\n                    description: `${this.resourcesPrefix}_api-key_${kebabCase(apiKey)}`,\n                    expires: Math.floor(new Date().setDate(new Date().getDate() + 365) / 1000.0),\n                })\n            })\n        }\n    }\n\n    createLambdaResolver() {\n        // create function execution role\n        const lambdaExecutionRole = new iam.Role(this, `${this.resourcesPrefixCamel}FnExecRole`, {\n            roleName: `${this.resourcesPrefix}_fn-exec-role`,\n            assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),\n            managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')],\n            ...(this.props.function?.policies\n                && this.props.function.policies.length > 0 && {\n                inlinePolicies: {\n                    customApiFunctionPolicy: new iam.PolicyDocument({\n                        statements: this.props.function.policies.map((statement) => {\n                            return new iam.PolicyStatement(statement)\n                        }),\n                    }),\n                },\n            }),\n        })\n\n        // create lambda function datasource\n        const lambdaFunction = new lambdaNodejs.NodejsFunction(this, `${this.resourcesPrefixCamel}Fn`, {\n            functionName: `${this.resourcesPrefix}_fn`,\n            role: lambdaExecutionRole,\n            environment: this.props.function.environment || {},\n            runtime: lambda.Runtime.NODEJS_18_X,\n            timeout: Duration.seconds(10),\n            handler: 'main',\n            entry: this.props.function.code,\n            memorySize: this.props.function.memorySize,\n            tracing: lambda.Tracing.ACTIVE,\n            currentVersionOptions: {\n                removalPolicy: RemovalPolicy.RETAIN,\n                retryAttempts: 2,\n            },\n            ...(this.props.function.bundling && {\n                bundling: this.props.function.bundling,\n            }),\n        })\n\n        // create alias (from latest version)\n        this.directResolverFn = new lambda.Alias(this, `${this.resourcesPrefixCamel}_FnAliasLive`, {\n            aliasName: 'live',\n            version: lambdaFunction.currentVersion,\n            ...(this.props.function.useWarmUp > 0 && {\n                provisionedConcurrentExecutions: this.props.function.useWarmUp,\n            }),\n        })\n\n        // create IAM role\n        this.apiRole = new iam.Role(this, `${this.resourcesPrefixCamel}ApiRole`, {\n            roleName: `${this.resourcesPrefix}_api-role`,\n            assumedBy: new iam.ServicePrincipal('appsync.amazonaws.com'),\n            inlinePolicies: {\n                allowEc2DescribeNetworkInterfaces: new iam.PolicyDocument({\n                    statements: [\n                        new iam.PolicyStatement({\n                            actions: ['lambda:InvokeAsync', 'lambda:InvokeFunction'],\n                            resources: [this.directResolverFn.functionArn],\n                        }),\n                    ],\n                }),\n            },\n        })\n    }\n\n    createPrismaAppSyncResolvers() {\n        // read resolvers from yaml\n        const resolvers = load(readFileSync(this.props.resolvers, 'utf8'))\n\n        // create resolvers\n        if (Array.isArray(resolvers)) {\n            resolvers.forEach((resolver: any) => {\n                const resolvername = `${resolver.fieldName}${resolver.typeName}_resolver`\n\n                if (['lambda', 'prisma-appsync'].includes(resolver.dataSource) && this.dataSources.lambda) {\n                    new appSync.Resolver(this, resolvername, {\n                        api: this.graphqlApi,\n                        typeName: resolver.typeName,\n                        fieldName: resolver.fieldName,\n                        dataSource: this.dataSources.lambda,\n                    })\n                }\n                else if (resolver.dataSource === 'none' && this.dataSources.none) {\n                    new appSync.Resolver(this, resolvername, {\n                        api: this.graphqlApi,\n                        typeName: resolver.typeName,\n                        fieldName: resolver.fieldName,\n                        dataSource: this.dataSources.none,\n                        requestMappingTemplate: appSync.MappingTemplate.fromString(\n                            resolver.requestMappingTemplate,\n                        ),\n                        responseMappingTemplate: appSync.MappingTemplate.fromString(\n                            resolver.responseMappingTemplate,\n                        ),\n                    })\n                }\n            })\n        }\n    }\n\n    createDataSources() {\n        this.dataSources = {}\n\n        // create datasource of type \"lambda\"\n        this.dataSources.lambda = new appSync.LambdaDataSource(\n            this,\n            `${this.resourcesPrefixCamel}LambdaDatasource`,\n            {\n                api: this.graphqlApi,\n                name: `${this.resourcesPrefixCamel}LambdaDataSource`,\n                lambdaFunction: this.directResolverFn,\n                serviceRole: this.apiRole,\n            },\n        )\n\n        // create datasource of type \"none\"\n        this.dataSources.none = new appSync.NoneDataSource(this, `${this.resourcesPrefixCamel}NoneDatasource`, {\n            api: this.graphqlApi,\n            name: `${this.resourcesPrefixCamel}NoneDataSource`,\n        })\n    }\n}\n"
  },
  {
    "path": "packages/boilerplate/cdk/src/index.ts",
    "content": "/* eslint-disable no-new */\nimport { join } from 'path'\nimport { App } from 'aws-cdk-lib'\nimport { AuthorizationType } from 'aws-cdk-lib/aws-appsync'\nimport { kebabCase } from 'scule'\nimport { AppSyncStack } from './appsync'\n\nconst app = new App()\n\nnew AppSyncStack(app, kebabCase('{{ projectName }}'), {\n    resourcesPrefix: '{{ projectName }}',\n    schema: join(process.cwd(), '{{ relativeGqlSchemaPath }}'),\n    resolvers: join(process.cwd(), '{{ relativeYmlResolversPath }}'),\n    function: {\n        code: join(process.cwd(), '{{ relativeHandlerPath }}'),\n        memorySize: 1536,\n        useWarmUp: 0, // useWarmUp > 0 will incur extra costs\n        environment: {\n            NODE_ENV: 'production',\n            DATABASE_URL: process.env.DATABASE_URL,\n        },\n        bundling: {\n            minify: true,\n            sourceMap: true,\n            forceDockerBundling: true,\n            commandHooks: {\n                beforeBundling(inputDir: string, outputDir: string): string[] {\n                    return [`cp ${inputDir}/{{ relativePrismaSchemaPath }} ${outputDir}`]\n                },\n                beforeInstall() {\n                    return []\n                },\n                afterBundling() {\n                    return [\n                        'npx prisma generate',\n                        'rm -rf generated',\n\n                        // npm + yarn 1.x\n                        'rm -rf node_modules/@prisma/engines',\n                        'rm -rf node_modules/@prisma/client/node_modules',\n                        'rm -rf node_modules/.bin',\n                        'rm -rf node_modules/prisma',\n                        'rm -rf node_modules/prisma-appsync',\n                    ]\n                },\n            },\n            nodeModules: ['prisma', '@prisma/client'],\n            environment: {\n                NODE_ENV: 'production',\n            },\n        },\n    },\n    authorizationConfig: {\n        defaultAuthorization: {\n            authorizationType: AuthorizationType.API_KEY,\n        },\n    },\n})\n\napp.synth()\n"
  },
  {
    "path": "packages/boilerplate/cdk/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"ES2018\",\n        \"module\": \"commonjs\",\n        \"lib\": [\"es2016\", \"es2017.object\", \"es2017.string\"],\n        \"strict\": true,\n        \"noImplicitAny\": true,\n        \"strictNullChecks\": true,\n        \"noImplicitThis\": true,\n        \"alwaysStrict\": true,\n        \"noUnusedLocals\": true,\n        \"noUnusedParameters\": true,\n        \"noImplicitReturns\": true,\n        \"noFallthroughCasesInSwitch\": false,\n        \"inlineSourceMap\": true,\n        \"inlineSources\": true,\n        \"experimentalDecorators\": true,\n        \"strictPropertyInitialization\": false\n    }\n}\n"
  },
  {
    "path": "packages/boilerplate/cdk.json",
    "content": "{\n    \"app\": \"npx ts-node --prefer-ts-exts cdk/src/index.ts\"\n}"
  },
  {
    "path": "packages/boilerplate/handler.ts",
    "content": "import type { AppSyncResolverEvent } from './prisma/generated/prisma-appsync/client'\nimport { PrismaAppSync } from './prisma/generated/prisma-appsync/client'\n\n// Instantiate Prisma-AppSync Client\nconst prismaAppSync = new PrismaAppSync()\n\n// Lambda handler (AppSync Direct Lambda Resolver)\nexport const main = async (event: AppSyncResolverEvent<any>) => {\n    return await prismaAppSync.resolve({ event })\n}\n"
  },
  {
    "path": "packages/boilerplate/prisma/sqlite.prisma",
    "content": "datasource db {\n    provider = \"sqlite\"\n    url      = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n    provider      = \"prisma-client-js\"\n    binaryTargets = [\"native\", \"rhel-openssl-1.0.x\"]\n}\n\ngenerator appsync {\n    provider = \"prisma-appsync\"\n}\n\n/// @gql(fields: { passwordHash: null })\nmodel User {\n    id           Int      @id @default(autoincrement())\n    email        String   @unique\n    passwordHash String\n    posts        Post[]\n    createdAt    DateTime @default(now())\n}\n\n/// @gql(scalars: { source: \"AWSURL\" })\nmodel Post {\n    id        Int      @id @default(autoincrement())\n    title     String\n    source    String?\n    author    User?    @relation(fields: [authorId], references: [id])\n    authorId  Int?\n    updatedAt DateTime @updatedAt\n    createdAt DateTime @default(now())\n}\n"
  },
  {
    "path": "packages/boilerplate/server/server.ts",
    "content": "import { join } from 'path'\nimport { readFileSync } from 'fs'\nimport { load } from 'js-yaml'\nimport { argv, createServer } from 'prisma-appsync/dist/server'\n\n(async () => {\n    const schema = readFileSync(join(process.cwd(), argv.flags.schema), { encoding: 'utf-8' })\n    const lambdaHandler = await import(join(process.cwd(), argv.flags.handler))\n    const resolvers = load(readFileSync(join(process.cwd(), argv.flags.resolvers), { encoding: 'utf-8' }))\n    const port = argv.flags.port\n    const wsPort = argv.flags.wsPort\n    const watchers = argv.flags.watchers ? JSON.parse(argv.flags.watchers) : []\n\n    createServer({\n        schema,\n        lambdaHandler,\n        resolvers,\n        port,\n        wsPort,\n        watchers,\n    })\n})()\n"
  },
  {
    "path": "packages/boilerplate/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"display\": \"Default\",\n    \"compilerOptions\": {\n        \"target\": \"ES2018\",\n        \"module\": \"commonjs\",\n        \"lib\": [\"es2018\"],\n        \"declaration\": false,\n        \"strict\": true,\n        \"noImplicitAny\": false,\n        \"strictNullChecks\": true,\n        \"noImplicitThis\": true,\n        \"alwaysStrict\": true,\n        \"noUnusedLocals\": false,\n        \"noImplicitReturns\": true,\n        \"noFallthroughCasesInSwitch\": false,\n        \"inlineSourceMap\": true,\n        \"inlineSources\": true,\n        \"esModuleInterop\": true,\n        \"experimentalDecorators\": true,\n        \"strictPropertyInitialization\": false,\n        \"baseUrl\": \".\"\n    },\n    \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n    \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/client/package.json",
    "content": "{\n    \"name\": \"prisma-appsync-client\",\n    \"private\": true,\n    \"version\": \"1.0.0\",\n    \"author\": \"maoosi <hello@sylvainsimao.fr>\",\n    \"license\": \"BSD-2-Clause\",\n    \"devDependencies\": {\n        \"@types/aws-lambda\": \"^8.10.126\",\n        \"@types/micromatch\": \"^4.0.5\",\n        \"deepmerge\": \"^4.3.1\",\n        \"html-entities\": \"^2.4.0\",\n        \"lambda-rate-limiter\": \"^4.0.0\",\n        \"micromatch\": \"^4.0.5\",\n        \"wild-wild-path\": \"^4.0.0\",\n        \"wild-wild-utils\": \"^5.0.0\",\n        \"xss\": \"^1.0.14\"\n    }\n}\n"
  },
  {
    "path": "packages/client/src/adapter.ts",
    "content": "import { CustomError } from './inspector'\nimport { sanitize } from './guard'\nimport {\n    clone,\n    isEmpty,\n    isObject,\n    isUndefined,\n    lowerFirst,\n    merge,\n    objectToPaths,\n    uniq,\n    walk,\n} from './utils'\nimport type {\n    Action,\n    ActionsAlias,\n    AppSyncEvent,\n    Authorization,\n    Context,\n    GraphQLType,\n    Identity,\n    Model,\n    Options,\n    PrismaArgs,\n    QueryParams,\n} from './types'\nimport {\n    Actions,\n    ActionsAliasesList,\n    Authorizations,\n    BatchActionsList,\n    Prisma_ReservedKeysForPaths,\n} from './consts'\n\n/**\n * #### Parse AppSync direct resolver `event` and returns Query Params.\n *\n * @param  {AppSyncEvent} appsyncEvent - AppSync event received in Lambda.\n * @param  {Required<PrismaAppSyncOptionsType>} options - PrismaAppSync Client options.\n * @param  {any|null} customResolvers? - Custom Resolvers.\n * @returns `{ type, operation, context, fields, paths, args, prismaArgs, authorization, identity }` - QueryParams\n */\nexport async function parseEvent(appsyncEvent: AppSyncEvent, options: Options, customResolvers?: any | null): Promise<QueryParams> {\n    if (\n        isEmpty(appsyncEvent?.info?.fieldName)\n        || isUndefined(appsyncEvent?.info?.selectionSetList)\n        || isEmpty(appsyncEvent?.info?.parentTypeName)\n        || isUndefined(appsyncEvent?.arguments)\n    )\n        throw new CustomError('Error reading required parameters from appsyncEvent.', { type: 'INTERNAL_SERVER_ERROR' })\n\n    const operation = getOperation({ fieldName: appsyncEvent.info.fieldName })\n\n    const context = getContext({ customResolvers, options, operation })\n\n    const { identity, authorization } = getAuthIdentity({\n        appsyncEvent,\n    })\n\n    const fields = getFields({\n        _selectionSetList: appsyncEvent.info.selectionSetList,\n    })\n    const sanitizedArgs = options.sanitize\n        ? await sanitize(await addNullables(appsyncEvent.arguments))\n        : await addNullables(appsyncEvent.arguments)\n\n    const args = clone(sanitizedArgs)\n\n    const prismaArgs = getPrismaArgs({\n        action: context.action,\n        defaultPagination: options.defaultPagination,\n        _arguments: clone(sanitizedArgs),\n        _selectionSetList: appsyncEvent.info.selectionSetList,\n    })\n\n    const type = getType({\n        _parentTypeName: appsyncEvent.info.parentTypeName,\n    })\n\n    const paths = getPaths({\n        operation,\n        context,\n        prismaArgs,\n    })\n\n    const headers = appsyncEvent?.request?.headers || {}\n\n    return {\n        operation,\n        context,\n        fields,\n        args,\n        prismaArgs,\n        type,\n        authorization,\n        identity,\n        paths,\n        headers,\n    }\n}\n\n/**\n * #### Convert `is: <enum>NULL` and `isNot: <enum>NULL` to `is: null` and `isNot: null`\n *\n * @param {any} data\n * @returns any\n */\nexport async function addNullables(data: any): Promise<any> {\n    return await walk(data, async ({ key, value }, node) => {\n        if (key === 'is' || key === 'isNot') {\n            value = value === 'NULL' ? null : undefined\n\n            node.ignoreChilds()\n        }\n        else if (value && isObject(value) && Object.keys(value).includes('isNull')) {\n            const { isNull, ...val } = value as any\n\n            if (isNull === true)\n                value = { ...val, equals: null }\n            else\n                value = { ...val, not: null }\n\n            node.ignoreChilds()\n        }\n        return { key, value }\n    })\n}\n\n/**\n * #### Returns authorization and identity.\n *\n * @param {any} options\n * @param {AppSyncEvent} options.appsyncEvent - AppSync event received in Lambda.\n * @returns `{ authorization, identity }`\n *\n * https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-identity\n */\nexport function getAuthIdentity({ appsyncEvent }: { appsyncEvent: AppSyncEvent }): {\n    identity: Identity\n    authorization: Authorization\n} {\n    let authorization: Authorization = null\n    let identity: Identity = null\n\n    // API_KEY authorization\n    if (isEmpty(appsyncEvent?.identity)) {\n        authorization = Authorizations.API_KEY\n        identity = {\n            ...(appsyncEvent?.request?.headers\n                && typeof appsyncEvent.request.headers['x-api-key'] !== 'undefined' && {\n                requestApiKey: appsyncEvent.request.headers['x-api-key'],\n            }),\n            ...(appsyncEvent?.request?.headers\n                && typeof appsyncEvent.request.headers['user-agent'] !== 'undefined' && {\n                requestUserAgent: appsyncEvent.request.headers['user-agent'],\n            }),\n        }\n    }\n    // AWS_LAMBDA authorization\n    else if (appsyncEvent?.identity && typeof (appsyncEvent.identity as any).resolverContext !== 'undefined') {\n        authorization = Authorizations.AWS_LAMBDA\n        identity = appsyncEvent.identity\n    }\n    // AWS_IAM authorization\n    else if (\n        appsyncEvent?.identity\n        && typeof (appsyncEvent.identity as any).cognitoIdentityAuthType !== 'undefined'\n        && typeof (appsyncEvent.identity as any).cognitoIdentityAuthProvider !== 'undefined'\n        && typeof (appsyncEvent.identity as any).cognitoIdentityPoolId !== 'undefined'\n        && typeof (appsyncEvent.identity as any).cognitoIdentityId !== 'undefined'\n    ) {\n        authorization = Authorizations.AWS_IAM\n        identity = appsyncEvent.identity\n    }\n    // AMAZON_COGNITO_USER_POOLS authorization\n    else if (\n        appsyncEvent?.identity\n        && typeof (appsyncEvent.identity as any).sub !== 'undefined'\n        && typeof (appsyncEvent.identity as any).issuer !== 'undefined'\n        && typeof (appsyncEvent.identity as any).username !== 'undefined'\n        && typeof (appsyncEvent.identity as any).claims !== 'undefined'\n        && typeof (appsyncEvent.identity as any).sourceIp !== 'undefined'\n    ) {\n        authorization = Authorizations.AMAZON_COGNITO_USER_POOLS\n        identity = appsyncEvent.identity\n    }\n    // OPENID_CONNECT authorization\n    else if (\n        appsyncEvent?.identity\n        && typeof (appsyncEvent.identity as any).sub !== 'undefined'\n        && typeof (appsyncEvent.identity as any).issuer !== 'undefined'\n        && typeof (appsyncEvent.identity as any).claims !== 'undefined'\n    ) {\n        authorization = Authorizations.OPENID_CONNECT\n        identity = appsyncEvent.identity\n    }\n    // ERROR\n    else {\n        throw new CustomError('Couldn\\'t detect caller identity.', {\n            type: 'INTERNAL_SERVER_ERROR',\n        })\n    }\n\n    return { authorization, identity }\n}\n\n/**\n * #### Returns context (`action`, `alias` and `model`).\n *\n * @param  {any} options\n * @param  {any|null} options.customResolvers\n * @param  {string} options.operation\n * @param  {Options} options.options\n * @returns Context\n */\nexport function getContext({\n    customResolvers,\n    operation,\n    options,\n}: {\n    customResolvers?: any | null\n    operation: string\n    options: Options\n}): Context {\n    const context: Context = {\n        action: String(),\n        alias: null,\n        model: null,\n    }\n\n    if (customResolvers && typeof customResolvers[operation] !== 'undefined') {\n        context.action = operation\n        context.alias = 'custom'\n        context.model = null\n    }\n    else {\n        context.action = getAction({ operation })\n        context.model = getModel({ operation, action: context.action, options })\n        context.alias = getActionAlias({ action: context.action })\n    }\n\n    return context\n}\n\n/**\n * #### Returns operation (`getPost`, `listUsers`, ..).\n *\n * @param  {any} options\n * @param  {string} options.fieldName\n * @returns Operation\n */\nexport function getOperation({ fieldName }: { fieldName: string }): string {\n    const operation = fieldName\n\n    if (!(operation.length > 0))\n        throw new CustomError('Error parsing \\'operation\\' from input event.', { type: 'INTERNAL_SERVER_ERROR' })\n\n    return operation\n}\n\n/**\n * #### Returns action (`get`, `list`, `create`, ...).\n *\n * @param  {any} options\n * @param  {string} options.operation\n * @returns Action\n */\nexport function getAction({ operation }: { operation: string }): Action {\n    const actionsList = Object.keys(Actions).sort().reverse()\n\n    const action = actionsList.find((action: Action) => {\n        return operation.toLowerCase().startsWith(String(action).toLowerCase())\n    }) as Action\n\n    if (!(typeof action !== 'undefined' && String(action).length > 0)) {\n        throw new CustomError(\n            'Error parsing \\'action\\' from input event. If you are trying to query a custom resolver, make sure it is properly declared inside \\'prismaAppSync.resolve({ event, resolvers: { /* HERE */ } })\\'.',\n            { type: 'INTERNAL_SERVER_ERROR' },\n        )\n    }\n\n    return action\n}\n\n/**\n * #### Returns action alias (`access`, `create`, `modify`, `subscribe`).\n *\n * @param  {any} options\n * @param  {Action} options.action\n * @returns ActionsAlias\n */\nexport function getActionAlias({ action }: { action: Action }): ActionsAlias {\n    let actionAlias: ActionsAlias = null\n\n    for (const alias in ActionsAliasesList) {\n        const actionsList = ActionsAliasesList[alias]\n\n        if (actionsList.includes(action)) {\n            actionAlias = alias as ActionsAlias\n            break\n        }\n    }\n\n    if (!(typeof action !== 'undefined' && String(action).length > 0))\n        throw new CustomError('Error parsing \\'actionAlias\\' from input event.', { type: 'INTERNAL_SERVER_ERROR' })\n\n    return actionAlias\n}\n\n/**\n * #### Returns model (`Post`, `User`, ...).\n *\n * @param  {any} options\n * @param  {string} options.operation\n * @param  {Action} options.action\n * @param  {Options} options.options\n * @returns Model\n */\nexport function getModel(\n    { operation, action, options }:\n    { operation: string; action: Action; options: Options },\n): Model {\n    const actionModel = operation.replace(String(action), '')\n\n    if (!(actionModel.length > 0))\n        throw new CustomError('Error parsing \\'model\\' from input event.', { type: 'INTERNAL_SERVER_ERROR' })\n\n    const model = options?.modelsMapping?.[actionModel]\n\n    if (!model) {\n        throw new CustomError(`Resolver \"${actionModel}\" not found. If it's a custom resolver, please ensure it's available within your Lambda function.`, {\n            type: 'INTERNAL_SERVER_ERROR',\n        })\n    }\n\n    return model\n}\n\n/**\n * #### Returns fields (`title`, `author`, ...).\n *\n * @param  {any} options\n * @param  {string[]} options._selectionSetList\n * @returns string[]\n */\nexport function getFields({ _selectionSetList }: { _selectionSetList: string[] }): string[] {\n    const fields: string[] = []\n\n    _selectionSetList.forEach((item: string) => {\n        const field = item.split('/')[0]\n        if (!fields.includes(field) && !field.startsWith('__'))\n            fields.push(item)\n    })\n\n    return fields\n}\n\n/**\n * #### Returns GraphQL type (`Query`, `Mutation` or `Subscription`).\n *\n * @param {any} options\n * @param {string} options._parentTypeName\n * @returns GraphQLType\n */\nexport function getType({ _parentTypeName }: { _parentTypeName: string }): GraphQLType {\n    const type = _parentTypeName\n\n    if (!['Query', 'Mutation', 'Subscription'].includes(type))\n        throw new CustomError('Error parsing \\'type\\' from input event.', { type: 'INTERNAL_SERVER_ERROR' })\n\n    return type as GraphQLType\n}\n\n/**\n * #### Returns Prisma args (`where`, `data`, `orderBy`, ...).\n *\n * @param {any} options\n * @param {Action} options.action\n * @param {Options['defaultPagination']} options.defaultPagination\n * @param {any} options._arguments\n * @param {any} options._selectionSetList\n * @returns PrismaArgs\n */\nexport function getPrismaArgs({\n    action,\n    defaultPagination,\n    _arguments,\n    _selectionSetList,\n}: {\n    action: Action\n    defaultPagination: Options['defaultPagination']\n    _arguments: any\n    _selectionSetList: any\n}): PrismaArgs {\n    const prismaArgs: PrismaArgs = {}\n\n    if (typeof _arguments.data !== 'undefined' && typeof _arguments.operation !== 'undefined') {\n        throw new CustomError('Using \\'data\\' and \\'operation\\' together is not possible.', {\n            type: 'BAD_USER_INPUT',\n        })\n    }\n\n    if (typeof _arguments.data !== 'undefined')\n        prismaArgs.data = _arguments.data\n    else if (typeof _arguments.operation !== 'undefined')\n        prismaArgs.data = _arguments.operation\n\n    if (typeof _arguments.create !== 'undefined')\n        prismaArgs.create = _arguments.create\n    if (typeof _arguments.update !== 'undefined')\n        prismaArgs.update = _arguments.update\n    if (typeof _arguments.where !== 'undefined')\n        prismaArgs.where = _arguments.where\n    if (typeof _arguments.orderBy !== 'undefined')\n        prismaArgs.orderBy = parseOrderBy(_arguments.orderBy)\n    if (typeof _arguments.skipDuplicates !== 'undefined')\n        prismaArgs.skipDuplicates = _arguments.skipDuplicates\n\n    if (typeof _selectionSetList !== 'undefined')\n        prismaArgs.select = parseSelectionList(_selectionSetList)\n\n    if (isEmpty(prismaArgs.select))\n        delete prismaArgs.select\n\n    if (typeof _arguments.skip !== 'undefined')\n        prismaArgs.skip = Number.parseInt(_arguments.skip)\n    else if (defaultPagination !== false && action === Actions.list)\n        prismaArgs.skip = 0\n\n    if (typeof _arguments.take !== 'undefined')\n        prismaArgs.take = Number.parseInt(_arguments.take)\n    else if (defaultPagination !== false && action === Actions.list)\n        prismaArgs.take = defaultPagination\n\n    return prismaArgs\n}\n\n/**\n * #### Returns individual `orderBy` record formatted for Prisma.\n *\n * @param {any} sortObj\n * @returns any\n */\nfunction getOrderBy(sortObj: any): any {\n    if (Object.keys(sortObj).length > 1)\n        throw new CustomError('Wrong \\'orderBy\\' input format.', { type: 'BAD_USER_INPUT' })\n\n    const key: any = Object.keys(sortObj)[0]\n    const value = typeof sortObj[key] === 'object' ? getOrderBy(sortObj[key]) : sortObj[key].toLowerCase()\n\n    return { [key]: value }\n}\n\n/**\n * #### Returns Prisma `orderBy` from parsed `event.arguments.orderBy`.\n *\n * @param {any} orderByInputs\n * @returns any[]\n */\nfunction parseOrderBy(orderByInputs: any): any[] {\n    const orderByOutput: any = []\n    const orderByInputsArray = Array.isArray(orderByInputs) ? orderByInputs : [orderByInputs]\n\n    orderByInputsArray.forEach((orderByInput: any) => {\n        orderByOutput.push(getOrderBy(orderByInput))\n    })\n\n    return orderByOutput\n}\n\n/**\n * #### Returns individual `include` field formatted for Prisma.\n *\n * @param {any} parts\n * @returns any\n */\nfunction getInclude(parts: any): any {\n    const field = parts[0]\n    const value = parts.length > 1 ? getSelect(parts.splice(1)) : true\n\n    return {\n        include: {\n            [field]: value,\n        },\n    }\n}\n\n/**\n * #### Returns individual `select` field formatted for Prisma.\n *\n * @param {any} parts\n * @returns any\n */\nfunction getSelect(parts: any): any {\n    const field = parts[0]\n    const value = parts.length > 1 ? getSelect(parts.splice(1)) : true\n\n    return {\n        select: {\n            [field]: value,\n        },\n    }\n}\n\n/**\n * #### Return Prisma `select` from parsed `event.arguments.info.selectionSetList`.\n *\n * @param {any} selectionSetList\n * @returns any\n */\nfunction parseSelectionList(selectionSetList: any): any {\n    let prismaArgs: any = { select: {} }\n\n    for (let i = 0; i < selectionSetList.length; i++) {\n        const path = selectionSetList[i]\n        const parts = path.split('/')\n\n        if (!parts.includes('__typename')) {\n            if (parts.length > 1)\n                prismaArgs = merge(prismaArgs, getInclude(parts))\n            else\n                prismaArgs = merge(prismaArgs, getSelect(parts))\n        }\n    }\n\n    if (prismaArgs.include) {\n        for (const include in prismaArgs.include) {\n            if (typeof prismaArgs.select[include] !== 'undefined')\n                delete prismaArgs.select[include]\n        }\n\n        prismaArgs.select = merge(prismaArgs.select, prismaArgs.include)\n        delete prismaArgs.include\n    }\n\n    return typeof prismaArgs.select !== 'undefined' ? prismaArgs.select : {}\n}\n\n/**\n * #### Returns req and res paths (`updatePost/title`, `getPost/date`, ..).\n *\n * @param {any} options\n * @param {string} options.operation\n * @param {Context} options.context\n * @param {PrismaArgs} options.prismaArgs\n * @returns string[]\n */\nexport function getPaths({\n    operation,\n    context,\n    prismaArgs,\n}: {\n    operation: string\n    context: Context\n    prismaArgs: PrismaArgs\n}): string[] {\n    const paths: string[] = [\n        operation,\n        ...objectToPaths({\n            ...(prismaArgs?.data && {\n                data: prismaArgs.data,\n            }),\n            ...(prismaArgs?.select && {\n                select: prismaArgs.select,\n            }),\n        }),\n    ]\n\n    paths.forEach((path: string, index: number) => {\n        if (path.startsWith('data')) {\n            paths[index] = path.replace('data', operation)\n        }\n\n        else if (path.startsWith('select')) {\n            const action = BatchActionsList.includes(context.action) ? Actions.list : Actions.get\n            if (context.model !== null) {\n                const model = action === Actions.list ? context.model.plural : context.model.singular\n                paths[index] = path.replace('select', `${lowerFirst(action)}${model}`)\n            }\n            else {\n                paths[index] = path.replace('select', operation)\n            }\n        }\n    })\n\n    return uniq(\n        paths.map(\n            (path: string) => path\n                .split('/')\n                .filter(k => !Prisma_ReservedKeysForPaths.includes(k))\n                .join('/'),\n        ).filter(Boolean),\n    )\n}\n"
  },
  {
    "path": "packages/client/src/consts.ts",
    "content": "import type { Action } from './types'\nimport { uniq } from './utils'\n\n// Enums\n\nexport enum Actions {\n    // queries\n    get = 'get',\n    list = 'list',\n    count = 'count',\n\n    // mutations (multiple)\n    createMany = 'createMany',\n    updateMany = 'updateMany',\n    deleteMany = 'deleteMany',\n\n    // mutations (single)\n    create = 'create',\n    update = 'update',\n    upsert = 'upsert',\n    delete = 'delete',\n\n    // subscriptions (multiple)\n    onCreatedMany = 'onCreatedMany',\n    onUpdatedMany = 'onUpdatedMany',\n    onDeletedMany = 'onDeletedMany',\n    onMutatedMany = 'onMutatedMany',\n\n    // subscriptions (single)\n    onCreated = 'onCreated',\n    onUpdated = 'onUpdated',\n    onUpserted = 'onUpserted',\n    onDeleted = 'onDeleted',\n    onMutated = 'onMutated',\n}\n\nexport enum ActionsAliases {\n    access = 'access',\n    batchAccess = 'batchAccess',\n    create = 'create',\n    batchCreate = 'batchCreate',\n    delete = 'delete',\n    batchDelete = 'batchDelete',\n    modify = 'modify',\n    batchModify = 'batchModify',\n    subscribe = 'subscribe',\n    batchSubscribe = 'batchSubscribe',\n}\n\n/**\n * ### Authorizations\n *\n * - `API_KEY`: Via hard-coded API key passed into `x-api-key` header.\n * - `AWS_IAM`: Via IAM identity and associated IAM policy rules.\n * - `AMAZON_COGNITO_USER_POOLS`: Via Amazon Cognito user token.\n * - `AWS_LAMBDA`: Via an AWS Lambda function.\n * - `OPENID_CONNECT`: Via Open ID connect such as Auth0.\n *\n * https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html\n */\nexport enum Authorizations {\n    API_KEY = 'API_KEY',\n    AWS_IAM = 'AWS_IAM',\n    AMAZON_COGNITO_USER_POOLS = 'AMAZON_COGNITO_USER_POOLS',\n    AWS_LAMBDA = 'AWS_LAMBDA',\n    OPENID_CONNECT = 'OPENID_CONNECT',\n}\n\n// Consts\n\nexport const Prisma_QueryOptions = [\n    'where', 'data', 'select', 'orderBy', 'include', 'distinct',\n]\n\nexport const Prisma_NestedQueries = [\n    'create', 'createMany', 'set', 'connect', 'connectOrCreate', 'disconnect', 'update', 'upsert', 'delete', 'updateMany', 'deleteMany',\n]\n\nexport const Prisma_FilterConditionsAndOperatos = [\n    'equals', 'not', 'in', 'notIn', 'lt', 'lte', 'gt', 'gte', 'contains', 'search', 'mode', 'startsWith', 'endsWith', 'AND', 'OR', 'NOT',\n]\n\nexport const Prisma_FilterRelationFilters = [\n    'some', 'every', 'none', 'is', 'isNot',\n]\n\nexport const Prisma_ScalarListMethods = [\n    'set', 'push', 'unset',\n]\n\nexport const Prisma_ScalarListFilters = [\n    'has', 'hasEvery', 'hasSome', 'isEmpty', 'isSet', 'equals',\n]\n\nexport const Prisma_CompositeTypeMethods = [\n    'set', 'unset', 'update', 'upsert', 'push',\n]\n\nexport const Prisma_CompositeTypeFilters = [\n    'equals', 'is', 'isNot', 'isEmpty', 'every', 'some', 'none',\n]\n\nexport const Prisma_AtomicNumberOperations = [\n    'increment', 'decrement', 'multiply', 'divide', 'set',\n]\n\nexport const Prisma_JSONFilters = [\n    'path', 'string_contains', 'string_starts_with', 'string_ends_with', 'array_contains', 'array_starts_with', 'array_ends_with',\n]\n\nexport const Prisma_ReservedKeysForPaths = uniq([\n    ...Prisma_QueryOptions,\n    ...Prisma_FilterConditionsAndOperatos,\n    ...Prisma_FilterRelationFilters,\n    ...Prisma_ScalarListFilters,\n    ...Prisma_CompositeTypeFilters,\n    ...Prisma_JSONFilters,\n])\n\nexport const Prisma_ReservedKeys = uniq([\n    ...Prisma_QueryOptions,\n    ...Prisma_NestedQueries,\n    ...Prisma_FilterConditionsAndOperatos,\n    ...Prisma_FilterRelationFilters,\n    ...Prisma_ScalarListMethods,\n    ...Prisma_ScalarListFilters,\n    ...Prisma_CompositeTypeMethods,\n    ...Prisma_CompositeTypeFilters,\n    ...Prisma_AtomicNumberOperations,\n    ...Prisma_JSONFilters,\n])\n\nexport const ActionsAliasesList = {\n    access: [Actions.get, Actions.list, Actions.count],\n    batchAccess: [Actions.list, Actions.count],\n    create: [Actions.create, Actions.createMany],\n    batchCreate: [Actions.createMany],\n    modify: [Actions.upsert, Actions.update, Actions.updateMany, Actions.delete, Actions.deleteMany],\n    batchModify: [Actions.updateMany, Actions.deleteMany],\n    delete: [Actions.delete, Actions.deleteMany],\n    batchDelete: [Actions.deleteMany],\n    subscribe: [\n        Actions.onCreatedMany,\n        Actions.onUpdatedMany,\n        Actions.onDeletedMany,\n        Actions.onMutatedMany,\n        Actions.onCreated,\n        Actions.onUpdated,\n        Actions.onUpserted,\n        Actions.onDeleted,\n        Actions.onMutated,\n    ],\n    batchSubscribe: [Actions.onCreatedMany, Actions.onUpdatedMany, Actions.onDeletedMany, Actions.onMutatedMany],\n} as const\n\nlet actionsListMultiple: Action[] = []\nlet actionsListSingle: Action[] = []\n\nfor (const actionAlias in ActionsAliasesList) {\n    if (actionAlias.startsWith('batch'))\n        actionsListMultiple = actionsListMultiple.concat(ActionsAliasesList[actionAlias])\n\n    else\n        actionsListSingle = actionsListSingle.concat(ActionsAliasesList[actionAlias])\n}\n\nexport const ActionsList = actionsListSingle.filter((item, pos) => actionsListSingle.indexOf(item) === pos)\n\nexport const BatchActionsList = actionsListMultiple.filter((item, pos) => actionsListMultiple.indexOf(item) === pos)\n\nexport const DebugTestingKey = '__prismaAppsync'\n"
  },
  {
    "path": "packages/client/src/core.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable no-restricted-globals */\n/* eslint-disable n/prefer-global/process */\nimport type {\n    AfterHookParams,\n    InjectedConfig,\n    Options,\n    PrismaAppSyncOptionsType,\n    ResolveParams,\n    Shield,\n    ShieldAuthorization,\n} from './types'\nimport {\n    Prisma,\n    PrismaClient,\n} from './types'\nimport {\n    BatchActionsList,\n    DebugTestingKey,\n} from './consts'\nimport { CustomError, log, parseError } from './inspector'\nimport {\n    clarify,\n    getDepth,\n    getShieldAuthorization,\n    preventDOS,\n    runHooks,\n} from './guard'\nimport { parseEvent } from './adapter'\nimport { isEmpty, omit } from './utils'\nimport { prismaQueryJoin } from './resolver'\nimport * as queries from './resolver'\n\n/**\n * ##  Auto-injected at generation time\n */\n// eslint-disable-next-line spaced-comment\nconst injectedConfig: InjectedConfig = {} //! inject:config\n\n/**\n * ##  Prisma-AppSync Client ʲˢ\n *\n * Type-safe Prisma AppSync client for TypeScript & Node.js\n * @example\n * ```\n * const prismaAppSync = new PrismaAppSync()\n *\n * // lambda handler (AppSync Direct Lambda Resolver)\n * export const resolver = async (event: any, context: any) => {\n *     return await prismaAppSync.resolve({ event })\n * }\n * ```\n *\n *\n * Read more in our [docs](https://prisma-appsync.vercel.app).\n */\nexport class PrismaAppSync {\n    public options: Options\n    public prismaClient: PrismaClient<Prisma.PrismaClientOptions, 'query' | 'info' | 'warn' | 'error'>\n\n    /**\n   * ### Client Constructor\n   *\n   * Instantiate Prisma-AppSync Client.\n   * @example\n   * ```\n   * const prismaAppSync = new PrismaAppSync()\n   * ```\n   *\n   * @param {PrismaAppSyncOptionsType} options\n   * @param {string} options.connectionString? - Prisma connection string (database connection URL).\n   * @param {boolean} options.sanitize? - Enable sanitize inputs (parse xss + encode html).\n   * @param {'INFO' | 'WARN' | 'ERROR'} options.logLevel? - Server logs level (visible in CloudWatch).\n   * @param {number|false} options.defaultPagination? - Default pagination for list Query (items per page).\n   * @param {number} options.maxDepth? - Maximum allowed GraphQL query depth.\n   * @param {number} options.maxReqPerUserMinute? - Maximum allowed requests per user, per minute.\n   *\n   * @default\n   * ```\n   * {\n   *   connectionString: process.env.DATABASE_URL,\n   *   sanitize: true,\n   *   logLevel: 'INFO',\n   *   defaultPagination: 50,\n   *   maxDepth: 4,\n   *   maxReqPerUserMinute: 200\n   * }\n   * ```\n   *\n   *\n   * Read more in our [docs](https://prisma-appsync.vercel.app).\n   */\n    constructor(options?: PrismaAppSyncOptionsType) {\n    // Set ENV variable DATABASE_URL if connectionString option is set\n        if (typeof options?.connectionString !== 'undefined')\n            process.env.DATABASE_URL = options.connectionString\n\n        // Set client options using constructor options\n        this.options = {\n            modelsMapping: {},\n            fieldsMapping: {},\n            connectionString: String(process.env.DATABASE_URL),\n            sanitize:\n                typeof options?.sanitize !== 'undefined'\n                    ? options.sanitize\n                    : true,\n            logLevel:\n                typeof options?.logLevel !== 'undefined'\n                    ? options.logLevel\n                    : 'INFO',\n            defaultPagination:\n                typeof options?.defaultPagination !== 'undefined'\n                    ? options.defaultPagination\n                    : 50,\n            maxDepth:\n                typeof options?.maxDepth !== 'undefined'\n                    ? options.maxDepth\n                    : 4,\n            maxReqPerUserMinute:\n                typeof options?.maxReqPerUserMinute !== 'undefined'\n                    ? options.maxReqPerUserMinute\n                    : 200,\n        }\n\n        this.options.modelsMapping = {}\n\n        // Read injected config\n        if (injectedConfig?.modelsMapping) {\n            this.options.modelsMapping = injectedConfig.modelsMapping\n        }\n        else if (process?.env?.PRISMA_APPSYNC_INJECTED_CONFIG) {\n            try {\n                this.options.modelsMapping = JSON.parse(\n                    process.env.PRISMA_APPSYNC_INJECTED_CONFIG,\n                ).modelsMapping\n            }\n            catch {}\n        }\n        if (injectedConfig?.fieldsMapping) {\n            this.options.fieldsMapping = injectedConfig.fieldsMapping\n        }\n        else if (process?.env?.PRISMA_APPSYNC_INJECTED_CONFIG) {\n            try {\n                this.options.fieldsMapping = JSON.parse(\n                    process.env.PRISMA_APPSYNC_INJECTED_CONFIG,\n                ).fieldsMapping\n            }\n            catch {}\n        }\n\n        // Make sure injected config isn't empty\n        if (Object.keys(this.options.modelsMapping).length === 0) {\n            throw new CustomError('Issue with auto-injected models mapping config.', {\n                type: 'INTERNAL_SERVER_ERROR',\n            })\n        }\n\n        // Set ENV variable for log level\n        process.env.PRISMA_APPSYNC_LOG_LEVEL = this.options.logLevel\n\n        // Debug logs\n\n        // eslint-disable-next-line unused-imports/no-unused-vars\n        const { fieldsMapping, ...newInstanceLogs } = this.options\n        log('New Prisma-AppSync instance created:', newInstanceLogs)\n\n        // Prisma client options\n        const prismaLogDef: Prisma.LogDefinition[] = [\n            { emit: 'event', level: 'query' },\n            { emit: 'event', level: 'error' },\n            { emit: 'event', level: 'info' },\n            { emit: 'event', level: 'warn' },\n        ]\n\n        // Create new Prisma Client\n        if (process?.env?.PRISMA_APPSYNC_TESTING === 'true') {\n            if (!global.prisma)\n                global.prisma = new PrismaClient({ log: prismaLogDef })\n\n            this.prismaClient = global.prisma\n        }\n        else {\n            this.prismaClient = new PrismaClient({ log: prismaLogDef })\n        }\n\n        // Prisma logs\n        if (!(process?.env?.PRISMA_APPSYNC_TESTING === 'true')) {\n            this.prismaClient.$on('query', (e: any) => log('Prisma Client query:', e, 'INFO'))\n            this.prismaClient.$on('info', (e: any) => log('Prisma Client info:', e, 'INFO'))\n            this.prismaClient.$on('warn', (e: any) => log('Prisma Client warn:', e, 'WARN'))\n            this.prismaClient.$on('error', (e: any) => log('Prisma Client error:', e, 'ERROR'))\n        }\n    }\n\n    /**\n   * ###  Resolver\n   *\n   * Resolve the API request, based on the AppSync `event` received by the Direct Lambda Resolver.\n   * @example\n   * ```\n   * await prismaAppSync.resolve({ event })\n   *\n   * // custom resolvers\n   * await prismaAppSync.resolve<'notify'|'listPosts'>(\n   *     event,\n   *     resolvers: {\n   *         // extend CRUD API with a custom `notify` query\n   *         notify: async ({ args }) => { return { message: args.message } },\n   *\n   *         // disable one of the generated CRUD API query\n   *         listPosts: false,\n   *     }\n   * })\n   * ```\n   *\n   * @param {ResolveParams} resolveParams\n   * @param {any} resolveParams.event - AppSync event received by the Direct Lambda Resolver.\n   * @param {any} resolveParams.resolvers? - Custom resolvers (to extend the CRUD API).\n   * @param {function} resolveParams.shield? - Shield configuration (to protect your API).\n   * @param {function} resolveParams.hooks? - Hooks (to trigger functions based on events).\n   * @returns Promise<result>\n   *\n   *\n   * Read more in our [docs](https://prisma-appsync.vercel.app).\n   */\n    public async resolve<CustomResolvers = void>(\n        resolveParams: ResolveParams<'//! inject:type:operations', Extract<CustomResolvers, string>>,\n    ): Promise<any> {\n        let result: any = null\n\n        try {\n            log('Resolving API request w/ event (truncated):', {\n                arguments: resolveParams.event.arguments,\n                identity: resolveParams.event.identity,\n                info: omit(resolveParams.event.info, 'selectionSetGraphQL'),\n            })\n\n            // Adapter :: parse appsync event\n            let QueryParams = await parseEvent(\n                resolveParams.event,\n                this.options,\n                resolveParams.resolvers,\n            )\n            log('Parsed event:', QueryParams)\n\n            // Guard :: rate limiting\n            const callerUuid\n                = (QueryParams.identity as any)?.sourceIp?.[0]\n                || (QueryParams.identity as any)?.sourceIp\n                || (QueryParams.identity as any)?.sub\n                || JSON.stringify(QueryParams.identity)\n\n            if (this.options.maxReqPerUserMinute && callerUuid) {\n                const { limitExceeded, count } = await preventDOS({\n                    callerUuid,\n                    maxReqPerMinute: this.options.maxReqPerUserMinute,\n                })\n                if (limitExceeded) {\n                    throw new CustomError(\n                        `Rate limit (maxReqPerUserMinute=${this.options.maxReqPerUserMinute}) exceeded for caller \"${callerUuid}\".`,\n                        {\n                            type: 'TOO_MANY_REQUESTS',\n                        },\n                    )\n                }\n                else {\n                    log(`Rate limit check for caller \"${callerUuid}\" returned ${count}/${this.options.maxReqPerUserMinute} (last minute).`)\n                }\n            }\n\n            // Guard :: block queries with a depth > maxDepth\n            const depth = getDepth({\n                paths: QueryParams.paths,\n                context: QueryParams.context,\n                fieldsMapping: this.options.fieldsMapping,\n            })\n            if (depth > this.options.maxDepth) {\n                throw new CustomError(\n                    `Query has depth of ${depth}, which exceeds max depth of ${this.options.maxDepth}.`,\n                    {\n                        type: 'FORBIDDEN',\n                    },\n                )\n            }\n            else {\n                log(`Query has depth of ${depth} (max allowed is ${this.options.maxDepth}).`)\n            }\n\n            // Guard :: create shield from config\n            const shield: Shield = resolveParams?.shield\n                ? await resolveParams.shield(QueryParams)\n                : {}\n\n            // Guard :: get shield authorization config\n            const shieldAuth: ShieldAuthorization = await getShieldAuthorization({\n                shield,\n                paths: QueryParams.paths,\n                context: QueryParams.context,\n            })\n            if (Object.keys(shield).length === 0)\n                log('Query shield authorization: No Shield setup detected.', null, 'WARN')\n            else\n                log('Query shield authorization:', shieldAuth)\n\n            // Guard :: if `canAccess` if equal to `false`, we reject the API call\n            if (!shieldAuth.canAccess) {\n                const reason = typeof shieldAuth.reason === 'string'\n                    ? shieldAuth.reason\n                    : shieldAuth.reason({\n                        action: QueryParams.context.action,\n                        model: QueryParams.context.model?.singular || QueryParams.context.action,\n                    })\n                throw new CustomError(reason, { type: 'FORBIDDEN' })\n            }\n\n            // Guard :: if `prismaFilter` is set, combine with current Prisma query\n            if (!isEmpty(shieldAuth.prismaFilter)) {\n                log('QueryParams before adding Shield filters:', QueryParams)\n\n                QueryParams.prismaArgs = prismaQueryJoin(\n                    [QueryParams.prismaArgs, { where: shieldAuth.prismaFilter }],\n                    [\n                        'where',\n                        'data',\n                        'orderBy',\n                        'skip',\n                        'take',\n                        'skipDuplicates',\n                        'select',\n                    ],\n                )\n\n                log('QueryParams after adding Shield filters:', QueryParams)\n            }\n\n            // Guard: get and run all before hooks functions matching query\n            if (!isEmpty(resolveParams?.hooks)) {\n                QueryParams = await runHooks({\n                    when: 'before',\n                    hooks: resolveParams.hooks,\n                    prismaClient: this.prismaClient,\n                    QueryParams,\n                })\n            }\n\n            // Resolver :: resolve query for UNIT TESTS\n            if (process?.env?.PRISMA_APPSYNC_TESTING === 'true') {\n                log('Resolving query for UNIT TESTS.')\n\n                const isBatchAction = BatchActionsList.includes(\n                    QueryParams?.context?.action,\n                )\n\n                const getTestResult = () => {\n                    return {\n                        ...QueryParams.fields.reduce((a, v) => {\n                            const value = !isEmpty(QueryParams?.prismaArgs?.data?.[v])\n                                ? QueryParams.prismaArgs.data[v]\n                                : (Math.random() + 1).toString(36).substring(7)\n\n                            return { ...a, [v]: String(value) }\n                        }, {}),\n                        [DebugTestingKey]: {\n                            QueryParams,\n                        },\n                    }\n                }\n\n                if (isBatchAction)\n                    result = [getTestResult(), getTestResult()]\n                else\n                    result = getTestResult()\n            }\n            // Resolver :: query is disabled\n            else if (\n                resolveParams?.resolvers\n                && typeof resolveParams.resolvers[QueryParams.operation] === 'boolean'\n                && resolveParams.resolvers[QueryParams.operation] === false\n            ) {\n                throw new CustomError(\n                    `Query resolver for ${QueryParams.operation} is disabled.`,\n                    { type: 'FORBIDDEN' },\n                )\n            }\n            // Resolver :: resolve query with Custom Resolver\n            else if (\n                typeof resolveParams?.resolvers?.[QueryParams.operation] === 'function'\n            ) {\n                log(`Resolving query for Custom Resolver \"${QueryParams.operation}\".`)\n                const customResolverFn = resolveParams.resolvers[\n                    QueryParams.operation\n                ] as Function\n                result = await customResolverFn({\n                    ...QueryParams,\n                    prismaClient: this.prismaClient,\n                })\n            }\n            // Resolver :: resolve query with built-in CRUD\n            else if (!isEmpty(QueryParams?.context?.model)) {\n                log(`Resolving query for built-in CRUD operation \"${QueryParams.operation}\".`)\n\n                try {\n                    result = await queries[`${QueryParams.context.action}Query`](\n                        this.prismaClient,\n                        QueryParams,\n                    )\n                }\n                catch (err: any) {\n                    if (err instanceof Prisma.PrismaClientKnownRequestError) {\n                        throw new CustomError(\n                            `Prisma Client known request error${err?.code ? ` (code ${err.code})` : ''}. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientknownrequesterror`,\n                            { type: 'INTERNAL_SERVER_ERROR', cause: err },\n                        )\n                    }\n                    else if (err instanceof Prisma.PrismaClientUnknownRequestError) {\n                        throw new CustomError(\n                            'Prisma Client unknown request error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientunknownrequesterror',\n                            { type: 'INTERNAL_SERVER_ERROR', cause: err },\n                        )\n                    }\n                    else if (err instanceof Prisma.PrismaClientRustPanicError) {\n                        throw new CustomError(\n                            'Prisma Client Rust panic error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientrustpanicerror',\n                            { type: 'INTERNAL_SERVER_ERROR', cause: err },\n                        )\n                    }\n                    else if (err instanceof Prisma.PrismaClientInitializationError) {\n                        throw new CustomError(\n                            `Prisma Client initialization error${err?.errorCode ? ` (errorCode ${err.errorCode})` : ''}. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientinitializationerror`,\n                            { type: 'INTERNAL_SERVER_ERROR', cause: err },\n                        )\n                    }\n                    else if (err instanceof Prisma.PrismaClientValidationError) {\n                        throw new CustomError(\n                            'Prisma Client validation error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientvalidationerror',\n                            { type: 'INTERNAL_SERVER_ERROR', cause: err },\n                        )\n                    }\n                    else {\n                        throw new CustomError(\n                            err?.message?.split('\\n')?.pop() || 'Unknown error during query.',\n                            { type: 'INTERNAL_SERVER_ERROR', cause: err },\n                        )\n                    }\n                }\n            }\n            // Resolver :: query resolver not found\n            else {\n                throw new CustomError(\n                    `Query resolver for ${QueryParams.operation} could not be found.`,\n                    {\n                        type: 'INTERNAL_SERVER_ERROR',\n                    },\n                )\n            }\n\n            // Guard: get and run all after hooks functions matching query\n            if (!isEmpty(resolveParams?.hooks)) {\n                const q: AfterHookParams = await runHooks({\n                    when: 'after',\n                    hooks: resolveParams.hooks,\n                    prismaClient: this.prismaClient,\n                    QueryParams,\n                    result,\n                })\n                result = q.result\n            }\n        }\n        catch (error) {\n            // Return error\n            return Promise.reject(parseError(error as Error))\n        }\n\n        // Guard :: clarify result (decode html)\n        const resultClarified = this.options.sanitize ? await clarify(result) : result\n        log('Returning response to API request w/ result:', resultClarified)\n\n        return resultClarified\n    }\n}\n"
  },
  {
    "path": "packages/client/src/guard.ts",
    "content": "import lambdaRateLimiter from 'lambda-rate-limiter'\nimport type {\n    Context,\n    PrismaClient,\n    QueryParams,\n    Shield,\n    ShieldAuthorization,\n    ShieldRule,\n} from './types'\nimport { DebugTestingKey } from './consts'\nimport { decode, encode, filterXSS, isEmpty, isMatchingGlob, merge, walk } from './utils'\nimport { CustomError } from './inspector'\n\n// https:// github.com/blackflux/lambda-rate-limiter\nconst limiter = lambdaRateLimiter({\n    interval: 60 * 1000, // 60 seconds = 1 minute\n    uniqueTokenPerInterval: 1000,\n})\n\n/**\n * #### Sanitize data (parse xss + encode html).\n *\n * @param {any} data\n * @returns any\n */\nexport async function sanitize(data: any): Promise<any> {\n    return await walk(data, async ({ key, value }, node) => {\n        if (typeof key === 'string' && key === DebugTestingKey)\n            node.ignoreChilds()\n\n        if (typeof value === 'string')\n            value = encode(filterXSS(value))\n\n        return { key, value }\n    })\n}\n\n/**\n * #### Clarify data (decode html).\n *\n * @param {any} data\n * @returns any\n */\nexport async function clarify(data: any): Promise<any> {\n    return await walk(data, async ({ key, value }, node) => {\n        if (typeof key === 'string' && key === DebugTestingKey)\n            node.ignoreChilds()\n\n        if (typeof value === 'string')\n            value = decode(value)\n\n        return { key, value }\n    })\n}\n\n/**\n * #### Returns an Shield authorization object for a given field.\n *\n * @param {any} options\n * @param {Shield} options.shield\n * @param {ShieldRule} options.shieldRule\n * @param {string} options.globPattern\n * @param {string} options.matcher\n * @param {Context} options.context\n * @returns Promise<ShieldAuthorization>\n */\nasync function getFieldAuthorization(\n    { shield, shieldRule, globPattern, matcher, context }:\n    {\n        shield: Shield\n        shieldRule: ShieldRule\n        globPattern: string\n        matcher: string\n        context: Context\n    },\n): Promise<ShieldAuthorization> {\n    const authorization: ShieldAuthorization = {\n        canAccess: true,\n        reason: String(),\n        prismaFilter: {},\n        matcher: String(),\n        globPattern: String(),\n    }\n\n    if (typeof shieldRule === 'boolean') {\n        authorization.canAccess = shield[matcher] as boolean\n    }\n    else {\n        if (typeof shieldRule.rule === 'undefined')\n            throw new Error('Badly formed shield rule.')\n\n        if (typeof shieldRule.rule === 'boolean') {\n            authorization.canAccess = shieldRule.rule\n        }\n        else if (typeof shieldRule.rule === 'function') {\n            const ruleResult = shieldRule.rule(context)\n\n            if (ruleResult instanceof Promise)\n                authorization.canAccess = await ruleResult\n            else if (typeof ruleResult === 'boolean')\n                authorization.canAccess = ruleResult\n            else\n                throw new Error('Shield rule must return a boolean.')\n        }\n        else {\n            authorization.canAccess = true\n            if (!authorization.prismaFilter)\n                authorization.prismaFilter = {}\n\n            authorization.prismaFilter = merge(authorization.prismaFilter, shieldRule.rule)\n        }\n    }\n\n    authorization.matcher = matcher\n    authorization.globPattern = globPattern\n\n    const isReasonDefined = typeof shieldRule !== 'boolean' && typeof shieldRule.reason !== 'undefined'\n    let reason = `Matcher: ${authorization.matcher}`\n\n    if (isReasonDefined && typeof shieldRule.reason === 'function')\n        reason = shieldRule.reason({ action: context.action, model: context.model?.singular || context.action })\n\n    else if (isReasonDefined && typeof shieldRule.reason === 'string')\n        reason = shieldRule.reason\n\n    authorization.reason = reason\n\n    return authorization\n}\n\n/**\n * #### Returns an authorization object from a Shield configuration passed as input.\n *\n * @param {Shield} options.shield\n * @param {string[]} options.paths\n * @param {Context} options.context\n * @returns ShieldAuthorization\n */\nexport async function getShieldAuthorization({\n    shield,\n    paths,\n    context,\n}: {\n    shield: Shield\n    paths: string[]\n    context: Context\n}): Promise<ShieldAuthorization> {\n    let authorization: ShieldAuthorization = {\n        canAccess: true,\n        reason: String(),\n        prismaFilter: {},\n        matcher: String(),\n        globPattern: String(),\n    }\n\n    for (const matcher in shield) {\n        const concurrentFieldsAuthCheck: Promise<any>[] = []\n\n        const globPattern = matcher\n\n        for (let i = paths.length - 1; i >= 0; i--) {\n            const reqPath: string = paths[i]\n\n            if (isMatchingGlob(reqPath, globPattern)) {\n                const shieldRule = shield[matcher]\n\n                concurrentFieldsAuthCheck.push(\n                    getFieldAuthorization({ shield, shieldRule, globPattern, matcher, context }),\n                )\n            }\n        }\n\n        const fieldsAuthCheckResults = await Promise.allSettled(concurrentFieldsAuthCheck)\n\n        for (let fieldIndex = 0; fieldIndex < fieldsAuthCheckResults.length; fieldIndex++) {\n            const fieldAuthCheckResult = fieldsAuthCheckResults[fieldIndex]\n\n            if (fieldAuthCheckResult.status === 'rejected') {\n                throw new CustomError(fieldAuthCheckResult.reason, { type: 'INTERNAL_SERVER_ERROR' })\n            }\n            else {\n                authorization = fieldAuthCheckResult.value\n\n                if (!fieldAuthCheckResult.value.canAccess)\n                    break\n            }\n        }\n    }\n\n    return authorization\n}\n\n/**\n * #### Returns GraphQL query depth for any given Query.\n *\n * @param {any} options\n * @param {string[]} options.paths\n * @param {Context} options.context\n * @param {any} options.fieldsMapping\n * @returns number\n */\nexport function getDepth(\n    { paths, context, fieldsMapping }:\n    { paths: string[]; context: Context; fieldsMapping: any },\n): number {\n    let depth = 0\n\n    const stopPaths: string[] = []\n\n    if (!isEmpty(fieldsMapping)) {\n        for (const fieldMap in fieldsMapping) {\n            if (fieldsMapping[fieldMap].type.toLowerCase() === 'json')\n                stopPaths.push(String(fieldMap))\n        }\n    }\n\n    paths.forEach((path: string) => {\n        const stopPath = stopPaths.find((p: string) => path.includes(p))\n        const stopIndex = stopPath ? stopPath.split('/').length - 1 : undefined\n        const parts = path.split('/').filter(Boolean).slice(1, stopIndex ? stopIndex + 1 : undefined)\n        const pathDepth = parts.length\n\n        if (pathDepth > depth)\n            depth = pathDepth\n    })\n\n    if (context.model === null)\n        depth += 1\n\n    return depth\n}\n\n/**\n * #### Execute hooks that apply to a given Query.\n *\n * @param {any} options\n * @param {'before' | 'after'} options.when\n * @param {any} options.hooks\n * @param {PrismaClient} options.prismaClient\n * @param {QueryParams} options.QueryParams\n * @param {any | any[]} options.result\n * @returns Promise<void | any>\n */\nexport async function runHooks({\n    when,\n    hooks,\n    prismaClient,\n    QueryParams,\n    result,\n}: {\n    when: 'before' | 'after'\n    hooks: any\n    prismaClient: PrismaClient\n    QueryParams: QueryParams\n    result?: any | any[]\n}): Promise<void | any> {\n    const matchingHooks = Object.keys(hooks).filter((hookPath: string) => {\n        const hookParts = hookPath.split(':')\n        const hookWhen = hookParts[0]\n        const hookGlob = hookParts[1]\n        const currentPath = QueryParams.operation\n\n        return hookWhen === when && isMatchingGlob(currentPath, hookGlob)\n    })\n\n    let hookResponse = when === 'after'\n        ? { ...QueryParams, result }\n        : QueryParams\n\n    if (matchingHooks.length > 0) {\n        for (let index = 0; index < matchingHooks.length; index++) {\n            const hookPath = matchingHooks[index]\n\n            if (Object.prototype.hasOwnProperty.call(hooks, hookPath)) {\n                hookResponse = await hooks[hookPath]({\n                    ...QueryParams,\n                    ...(typeof result !== 'undefined' && when === 'after' && { result }),\n                    prismaClient,\n                })\n            }\n        }\n    }\n\n    return hookResponse\n}\n\nexport async function preventDOS({\n    callerUuid,\n    maxReqPerMinute,\n}: {\n    callerUuid: string\n    maxReqPerMinute: number\n}): Promise<{\n    limitExceeded: boolean\n    count: number\n}> {\n    let limitExceeded = false\n    let count = -1\n\n    try {\n        count = await limiter.check(maxReqPerMinute, callerUuid)\n    }\n    catch (error) {\n        limitExceeded = true\n        count = maxReqPerMinute\n    }\n\n    return {\n        limitExceeded,\n        count,\n    }\n}\n"
  },
  {
    "path": "packages/client/src/index.ts",
    "content": "import {\n    clone,\n    decode,\n    dotate,\n    encode,\n    filterXSS,\n    isEmpty,\n    isMatchingGlob,\n    isObject,\n    isUndefined,\n    lowerFirst,\n    merge,\n    replaceAll,\n    walk,\n} from './utils'\n\nexport { PrismaAppSync } from './core'\nexport { CustomError, log } from './inspector'\nexport { queryBuilder } from './resolver'\nexport {\n    QueryParams,\n    QueryParamsCustom,\n    BeforeHookParams,\n    AfterHookParams,\n    Authorization,\n    AppSyncEvent,\n    Identity,\n    API_KEY,\n    AWS_IAM,\n    AMAZON_COGNITO_USER_POOLS,\n    AWS_LAMBDA,\n    OPENID_CONNECT,\n    AppSyncResolverHandler,\n    AppSyncResolverEvent,\n    AppSyncIdentity,\n} from './types'\nexport { Authorizations } from './consts'\n\nconst _ = {\n    merge,\n    clone,\n    decode,\n    encode,\n    dotate,\n    isMatchingGlob,\n    filterXSS,\n    isEmpty,\n    isUndefined,\n    lowerFirst,\n    isObject,\n    walk,\n    replaceAll,\n}\n\nexport { _ }\n"
  },
  {
    "path": "packages/client/src/inspector.ts",
    "content": "/* eslint-disable n/prefer-global/process */\n/* eslint-disable no-console */\nimport { inspect as nodeInspect } from 'node:util'\nimport type { logLevel } from './types'\n\nconst errorCodes = {\n    FORBIDDEN: 401,\n    BAD_USER_INPUT: 400,\n    INTERNAL_SERVER_ERROR: 500,\n    TOO_MANY_REQUESTS: 429,\n}\n\nexport type ErrorExtensions = {\n    type: keyof typeof errorCodes\n    cause?: any\n}\n\nexport type ErrorDetails = {\n    error: string\n    type: ErrorExtensions['type']\n    code: number\n    cause?: ErrorExtensions['cause']\n}\n\nexport class CustomError extends Error {\n    public error: ErrorDetails['error']\n    public type: ErrorDetails['type']\n    public code: ErrorDetails['code']\n    public cause: ErrorDetails['cause']\n    public details: ErrorDetails\n\n    constructor(message: string, extensions: ErrorExtensions) {\n        super(message)\n\n        this.error = message\n        this.type = extensions.type\n        this.cause = extensions?.cause?.meta?.cause || extensions?.cause\n        this.code = typeof errorCodes[this.type] !== 'undefined' ? errorCodes[this.type] : errorCodes.INTERNAL_SERVER_ERROR\n\n        this.message = JSON.stringify({\n            error: this.error,\n            type: this.type,\n            code: this.code,\n        })\n\n        const maxCauseMessageLength = 500\n\n        if (this.cause?.message?.length > maxCauseMessageLength)\n            this.cause.message = `... ${this.cause.message.slice(this.cause.message.length - maxCauseMessageLength)}`\n\n        this.details = {\n            error: this.error,\n            type: this.type,\n            code: this.code,\n            ...(this.cause && { cause: this.cause }),\n        }\n\n        if (!(process?.env?.PRISMA_APPSYNC_TESTING === 'true'))\n            log(message, this.details, 'ERROR')\n    }\n}\n\nexport function parseError(error: Error): CustomError {\n    if (error instanceof CustomError) {\n        return error\n    }\n    else {\n        return new CustomError(error.message, {\n            type: 'INTERNAL_SERVER_ERROR',\n            cause: error,\n        })\n    }\n}\n\nexport function log(message: string, obj?: any, level?: logLevel): void {\n    if (canPrintLog(level || 'INFO')) {\n        printLog(message, level || 'INFO')\n\n        if (obj) {\n            console.log(\n                nodeInspect(obj, {\n                    compact: false,\n                    depth: 5,\n                    breakLength: 80,\n                    maxStringLength: 800,\n                    ...(!process.env.LAMBDA_TASK_ROOT && {\n                        colors: true,\n                    }),\n                }),\n            )\n        }\n    }\n}\n\nexport function printLog(message: any, level: logLevel): void {\n    const timestamp = new Date().toLocaleString(undefined, {\n        day: 'numeric',\n        month: 'numeric',\n        year: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit',\n        second: '2-digit',\n    })\n    const prefix = `◭ ${timestamp} <<${level}>>`\n    const log = [prefix, message].join(' ')\n\n    if (level === 'ERROR' && canPrintLog(level))\n        console.error(`\\x1B[31m${log}`)\n    else if (level === 'WARN' && canPrintLog(level))\n        console.warn(`\\x1B[33m${log}`)\n    else if (level === 'INFO' && canPrintLog(level))\n        console.info(`\\x1B[36m${log}`)\n}\n\nfunction canPrintLog(level: logLevel): boolean {\n    if (process?.env?.PRISMA_APPSYNC_TESTING === 'true')\n        return false\n\n    const logLevel = String(process.env.PRISMA_APPSYNC_LOG_LEVEL) as logLevel\n\n    return (logLevel === 'ERROR' && level === 'ERROR')\n        || (logLevel === 'WARN' && ['WARN', 'ERROR'].includes(level))\n        || (logLevel === 'INFO')\n}\n"
  },
  {
    "path": "packages/client/src/resolver.ts",
    "content": "import type {\n    PrismaArgs,\n    PrismaClient,\n    PrismaCount,\n    PrismaCreate,\n    PrismaCreateMany,\n    PrismaDelete,\n    PrismaDeleteMany,\n    PrismaGet,\n    PrismaList,\n    PrismaOperator,\n    PrismaUpdate,\n    PrismaUpdateMany,\n    PrismaUpsert,\n    QueryBuilder,\n    QueryParams,\n} from './types'\nimport { merge } from './utils'\n\n/**\n *  #### Query Builder\n */\nexport function prismaQueryJoin<T>(queries: PrismaArgs[], operators: PrismaOperator[]): T {\n    const prismaArgs: PrismaArgs = {}\n\n    // 'where', 'orderBy', 'select', 'skip', 'take', ...\n    operators.forEach((operator: PrismaOperator) => {\n        queries.forEach((query: PrismaArgs) => {\n            if (query?.[operator]) {\n                if (operator === 'where') {\n                    if (prismaArgs.where?.AND) {\n                        prismaArgs.where.AND.push(query.where)\n                    }\n                    else if (prismaArgs.where) {\n                        prismaArgs.where = {\n                            ...prismaArgs.where,\n                            AND: [query.where],\n                        }\n                    }\n                    else {\n                        prismaArgs.where = query.where\n                    }\n                }\n                else if (prismaArgs?.[operator]) {\n                    prismaArgs[operator] = merge(prismaArgs[operator], query[operator]) as never\n                }\n                else {\n                    prismaArgs[operator] = query[operator] as never\n                }\n            }\n        })\n    })\n\n    return prismaArgs as T\n}\n\nexport const queryBuilder: QueryBuilder = {\n    prismaGet: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaGet>(prismaQueries, ['where', 'select'])\n    },\n    prismaList: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaList>(prismaQueries, ['where', 'orderBy', 'select', 'skip', 'take'])\n    },\n    prismaCount: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaCount>(prismaQueries, ['where', 'orderBy', 'select', 'skip', 'take'])\n    },\n    prismaCreate: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaCreate>(prismaQueries, ['data', 'select'])\n    },\n    prismaCreateMany: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaCreateMany>(prismaQueries, ['data', 'skipDuplicates'])\n    },\n    prismaUpdate: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaUpdate>(prismaQueries, ['data', 'where', 'select'])\n    },\n    prismaUpdateMany: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaUpdateMany>(prismaQueries, ['data', 'where'])\n    },\n    prismaUpsert: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaUpsert>(prismaQueries, ['where', 'create', 'update', 'select'])\n    },\n    prismaDelete: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaDelete>(prismaQueries, ['where', 'select'])\n    },\n    prismaDeleteMany: (...prismaQueries: PrismaArgs[]) => {\n        return prismaQueryJoin<PrismaDeleteMany>(prismaQueries, ['where'])\n    },\n}\n\n/**\n *  #### Query :: Find Unique\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findunique\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function getQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].findUnique(queryBuilder.prismaGet(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Query :: Find Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findmany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function listQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].findMany(queryBuilder.prismaList(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Query :: Count\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#count\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function countQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].count(queryBuilder.prismaCount(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Mutation :: Create\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#create\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function createQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].create(queryBuilder.prismaCreate(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Mutation :: Create Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#createmany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function createManyQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].createMany(queryBuilder.prismaCreateMany(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Mutation :: Update\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#update\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function updateQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].update(queryBuilder.prismaUpdate(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Mutation :: Update Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#updatemany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function updateManyQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].updateMany(queryBuilder.prismaUpdateMany(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Mutation :: Upsert\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#upsert\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function upsertQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].upsert(queryBuilder.prismaUpsert(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Mutation :: Delete\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#delete\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function deleteQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].delete(queryBuilder.prismaDelete(query.prismaArgs))\n\n    return results\n}\n\n/**\n * #### Mutation :: Delete Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#deletemany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport async function deleteManyQuery(prismaClient: PrismaClient, query: QueryParams) {\n    if (query.context.model === null)\n        return\n\n    const results = await prismaClient[query.context.model.prismaRef].deleteMany(queryBuilder.prismaDeleteMany(query.prismaArgs))\n\n    return results\n}\n"
  },
  {
    "path": "packages/client/src/types.ts",
    "content": "import { Prisma, PrismaClient } from '@prisma/client'\nimport type {\n    AppSyncIdentity,\n    AppSyncIdentityCognito,\n    AppSyncIdentityIAM,\n    AppSyncIdentityLambda,\n    AppSyncIdentityOIDC,\n    AppSyncResolverEvent,\n    AppSyncResolverHandler,\n} from 'aws-lambda'\nimport type { Actions, ActionsAliases, Authorizations } from './consts'\n\nexport type logLevel = 'INFO' | 'WARN' | 'ERROR'\n\nexport type PrismaAppSyncOptionsType = {\n    connectionString?: string\n    sanitize?: boolean\n    logLevel?: logLevel\n    defaultPagination?: number | false\n    maxDepth?: number\n    maxReqPerUserMinute?: number | false\n}\n\nexport type Options = Required<PrismaAppSyncOptionsType> & {\n    modelsMapping: any\n    fieldsMapping: any\n}\n\nexport type InjectedConfig = {\n    modelsMapping?: { [modelVariant: string]: { prismaRef: string; singular: string; plural: string } }\n    fieldsMapping?: { [fieldPath: string]: { type: string; isRelation: boolean } }\n    operations?: string\n}\n\nexport type RuntimeConfig = {\n    modelsMapping: { [modelVariant: string]: { prismaRef: string; singular: string; plural: string } }\n    fieldsMapping: { [fieldPath: string]: { type: string; isRelation: boolean } }\n    operations: string[]\n}\n\nexport type Action = typeof Actions[keyof typeof Actions] | string\n\nexport type ActionsAlias = typeof ActionsAliases[keyof typeof ActionsAliases] | 'custom' | null\n\nexport type ActionsAliasStr = keyof typeof ActionsAliases\n\nexport type Context = {\n    action: Action\n    alias: ActionsAlias\n    model: Model\n}\n\nexport type Model = { prismaRef: string; singular: string; plural: string } | null\n\nexport type { AppSyncResolverHandler, AppSyncResolverEvent, AppSyncIdentity }\n\n/**\n * ### QueryParams\n *\n * @example\n * ```\n * {\n *     type: 'Query',\n *     operation: 'getPost',\n *     context: { action: 'get', alias: 'access', model: 'Post' },\n *     fields: ['title', 'status'],\n *     paths: ['get/post/title', 'get/post/status'],\n *     args: { where: { id: 5 } },\n *     prismaArgs: {\n *         where: { id: 5 },\n *         select: { title: true, status: true },\n *     },\n *     authorization: 'API_KEY',\n *     identity: { ... },\n * }\n * ```\n */\nexport type QueryParams<T = any> = {\n    type: GraphQLType\n    operation: string\n    context: Context\n    fields: string[]\n    paths: string[]\n    args: T\n    prismaArgs: PrismaArgs\n    authorization: Authorization\n    identity: Identity\n    headers: any\n}\n\nexport type Authorization = typeof Authorizations[keyof typeof Authorizations] | null\n\nexport type PrismaGet = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'>\nexport type PrismaList = Pick<PrismaArgs, 'where' | 'orderBy' | 'select' | 'skip' | 'take'>\nexport type PrismaCount = Pick<PrismaArgs, 'where' | 'orderBy' | 'select' | 'skip' | 'take'>\nexport type PrismaCreate = Pick<Required<PrismaArgs>, 'data'> & Pick<PrismaArgs, 'select'>\nexport type PrismaCreateMany = Pick<Required<PrismaArgs>, 'data'> & Pick<PrismaArgs, 'skipDuplicates'>\nexport type PrismaUpdate = Pick<Required<PrismaArgs>, 'data' | 'where'> & Pick<PrismaArgs, 'select'>\nexport type PrismaUpdateMany = Pick<Required<PrismaArgs>, 'data' | 'where'>\nexport type PrismaUpsert = Pick<Required<PrismaArgs>, 'where'> &\nPick<PrismaArgs, 'select'> & Pick<PrismaArgs, 'update'> & Pick<PrismaArgs, 'create'>\nexport type PrismaDelete = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'>\nexport type PrismaDeleteMany = Pick<Required<PrismaArgs>, 'where'>\n\nexport type QueryBuilder = {\n    prismaGet: (...prismaArgs: PrismaArgs[]) => PrismaGet\n    prismaList: (...prismaArgs: PrismaArgs[]) => PrismaList\n    prismaCount: (...prismaArgs: PrismaArgs[]) => PrismaCount\n    prismaCreate: (...prismaArgs: PrismaArgs[]) => PrismaCreate\n    prismaCreateMany: (...prismaArgs: PrismaArgs[]) => PrismaCreateMany\n    prismaUpdate: (...prismaArgs: PrismaArgs[]) => PrismaUpdate\n    prismaUpdateMany: (...prismaArgs: PrismaArgs[]) => PrismaUpdateMany\n    prismaUpsert: (...prismaArgs: PrismaArgs[]) => PrismaUpsert\n    prismaDelete: (...prismaArgs: PrismaArgs[]) => PrismaDelete\n    prismaDeleteMany: (...prismaArgs: PrismaArgs[]) => PrismaDeleteMany\n}\n\nexport type QueryParamsCustom<T = any> = QueryParams<T> & {\n    prismaClient: PrismaClient\n}\n\nexport type BeforeHookParams = QueryParams & {\n    prismaClient: PrismaClient\n}\n\n/**\n * ### AfterHookParams\n *\n * @example\n * ```\n * {\n *     type: 'Query',\n *     operation: 'getPost',\n *     context: { action: 'get', alias: 'access', model: 'Post' },\n *     fields: ['title', 'status'],\n *     paths: ['get/post/title', 'get/post/status'],\n *     args: { where: { id: 5 } },\n *     prismaArgs: {\n *         where: { id: 5 },\n *         select: { title: true, status: true },\n *     },\n *     authorization: 'API_KEY',\n *     identity: { ... },\n *     result: { title: 'Hello World', status: 'PUBLISHED' }\n * }\n * ```\n */\nexport type AfterHookParams = QueryParams & {\n    prismaClient: PrismaClient\n    result: any | any[]\n}\n\nexport type ShieldContext = {\n    action: Action\n    model: string\n}\n\nexport type Reason = string | ((context: ShieldContext) => string)\n\nexport type ShieldRule = boolean | ((context: ShieldContext) => boolean | Promise<boolean>) | any\n\nexport type Shield = {\n    [matcher: string]:\n    | boolean\n    | {\n        rule: ShieldRule\n        reason?: Reason\n    }\n}\n\nexport type HooksProps = {\n    before: BeforeHookParams\n    after: AfterHookParams\n}\n\nexport type HooksReturn = {\n    before: Promise<BeforeHookParams>\n    after: Promise<AfterHookParams>\n}\n\nexport type HookPath<Operations extends string, CustomResolvers> = Operations | CustomResolvers\n\nexport type HooksParameter<\n    HookType extends 'before' | 'after',\n    Operations extends string,\n    CustomResolvers extends string,\n> = `${HookType}:${HookPath<Operations, CustomResolvers>}` | `${HookType}:**`\n\nexport type HooksParameters<\n    HookType extends 'before' | 'after',\n    Operations extends string,\n    CustomResolvers extends string,\n> = {\n    [matcher in HooksParameter<HookType, Operations, CustomResolvers>]?: (\n        props: HooksProps[HookType],\n    ) => HooksReturn[HookType]\n}\n\nexport type Hooks<Operations extends string, CustomResolvers extends string> =\n    | HooksParameters<'before', Operations, CustomResolvers>\n    | HooksParameters<'after', Operations, CustomResolvers>\n\nexport type ShieldAuthorization = {\n    canAccess: boolean\n    reason: Reason\n    prismaFilter: any\n    matcher: string\n    globPattern: string\n}\n\nexport type ResolveParams<Operations extends string, CustomResolvers extends string> = {\n    event: AppSyncEvent\n    resolvers?: {\n        [resolver in CustomResolvers]: ((props: QueryParamsCustom) => Promise<any>) | boolean\n    }\n    shield?: (props: QueryParams) => Shield\n    hooks?: Hooks<Operations, CustomResolvers>\n}\n\n// Prisma-related Types\n\nexport { PrismaClient, Prisma }\n\nexport type PrismaArgs = {\n    where?: any\n    create?: any\n    update?: any\n    data?: any\n    select?: any\n    orderBy?: any\n    skip?: number | undefined\n    take?: number | undefined\n    skipDuplicates?: boolean | undefined\n}\n\nexport type PrismaOperator = keyof Required<PrismaArgs>\n\nexport type AppSyncEvent = AppSyncResolverEvent<any>\n\nexport type GraphQLType = 'Query' | 'Mutation' | 'Subscription'\n\nexport type API_KEY = null | {\n    [key: string]: any\n}\n\nexport type AWS_LAMBDA = AppSyncIdentityLambda\n\nexport type AWS_IAM = AppSyncIdentityIAM\n\nexport type AMAZON_COGNITO_USER_POOLS = AppSyncIdentityCognito\n\nexport type OPENID_CONNECT = AppSyncIdentityOIDC\n\nexport type Identity = API_KEY | AWS_LAMBDA | AWS_IAM | AMAZON_COGNITO_USER_POOLS | OPENID_CONNECT\n"
  },
  {
    "path": "packages/client/src/utils.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-types */\nimport { flatten } from 'wild-wild-utils'\nimport { isMatch } from 'micromatch'\nimport deepmerge from 'deepmerge'\nimport { decode as decodeHtml, encode as encodeHtml } from 'html-entities'\nimport xss from 'xss'\n\n/**\n * #### Deep merge objects (without mutating the target object).\n *\n * @example const newObj = merge(obj1, obj2, obj3)\n *\n * @param {any[]} sources\n * @returns any\n */\nexport function merge(...sources: any[]): any {\n    return deepmerge.all([{}, ...sources])\n}\n\n/**\n * #### Deep clone object.\n *\n * @example const newObj = clone(sourceObj)\n *\n * @param {any} source\n * @returns any\n */\nexport function clone(source: any): any {\n    return deepmerge({}, source)\n}\n\n/**\n * #### Returns decoded text, replacing HTML special characters.\n *\n * @example decode('&lt; &gt; &quot; &apos; &amp; &#169; &#8710;')\n * // returns '< > \" \\' & © ∆'\n *\n * @param {string} str\n * @returns string\n */\nexport function decode(str: string): string {\n    return decodeHtml(str)\n}\n\n/**\n * #### Returns encoded text, version of string.\n *\n * @example encode('<script>alert(\"xss\");</scr' + \"ipt>\")\n *\n * @param {string} str\n * @returns string\n */\nexport function encode(str: string): string {\n    return encodeHtml(str)\n}\n\n/**\n * #### Transform an object to a dotted-key/value pair.\n *\n * @example dotate({ data: { title: \"glut\" } })\n * // returns { 'data.title': 'glut' }\n *\n * @param {any} source\n * @returns any\n */\nexport function dotate(source: any): any {\n    return flatten(source, { shallowArrays: true })\n}\n\n/**\n * #### Transform an object to an array of paths.\n *\n * @example objectToPaths({ data: { title: \"glut\" } })\n * // returns [ 'data', 'data/title']\n *\n * @param {any} source\n * @returns any\n */\nexport function objectToPaths(source: any): string[] {\n    const dotObject = flatten(source)\n    const dotPaths = Object.keys(dotObject).map((k: string) => {\n        return k\n            .split('.')\n            .filter((part) => {\n                const isDigit = Boolean(/\\b(\\d+)\\b/gi.exec(part))\n                return !isDigit\n            })\n            .join('/')\n    })\n    const paths: string[] = []\n    const seen: Set<string> = new Set()\n\n    for (const dotPath of dotPaths) {\n        const parts = dotPath.split('/')\n        let current = ''\n\n        for (const part of parts) {\n            current += current === '' ? part : `/${part}`\n            if (!seen.has(current)) {\n                paths.push(current)\n                seen.add(current)\n            }\n        }\n    }\n\n    return paths\n}\n\n/**\n * #### Return an object ommitting one to multiple keys.\n *\n * @example omit({ foo: 'foo', bar: 'bar' }, 'foo')\n * // returns { foo: 'foo' }\n *\n * @param {any} obj\n * @param {string | string[]} omitKey\n * @returns any\n */\nexport function omit(obj: any, omitKey: string | string[]): any {\n    const newObj = clone(obj)\n    const omitKeys = !Array.isArray(omitKey) ? [omitKey] : omitKey\n    omitKeys.forEach(k => delete newObj?.[k])\n    return newObj\n}\n\n/**\n * #### Returns true if specified path matches any of the glob patterns.\n *\n * @example isMatchingGlob('get/post/title', ['get/post{,/**}'])\n *\n * @param {string} path\n * @param {string|string[]} globPatterns\n * @returns boolean\n */\nexport function isMatchingGlob(path: string, globPatterns: string | string[]): boolean {\n    return isMatch(path, globPatterns)\n}\n\n/**\n * #### Sanitize untrusted HTML to prevent XSS.\n *\n * @example filterXSS('<script>alert(\"xss\");</scr' + \"ipt>\")\n *\n * @param {string} str\n * @returns string\n */\nexport function filterXSS(str: string): string {\n    return xss(str)\n}\n\n/**\n * #### Return true if element is Empty.\n *\n * @example isEmpty(prismaArgs?.data?.title)\n *\n * @param {any} element\n * @returns boolean\n */\nexport function isEmpty(element: any): boolean {\n    return (\n        element === null\n        || element === undefined\n        || typeof element === 'undefined'\n        || (typeof element === 'string' && element.trim() === '')\n        || (Array.isArray(element) && element.length === 0)\n        || (Object.getPrototypeOf(element) === Object.prototype && Object.keys(element).length === 0)\n    )\n}\n\n/**\n * #### Return true if element is Undefined.\n *\n * @example isUndefined(prismaArgs?.data?.title)\n *\n * @param {any} element\n * @returns boolean\n */\nexport function isUndefined(element: any): boolean {\n    return element === undefined || typeof element === 'undefined'\n}\n\n/**\n * #### Return true if element is an Array\n *\n * @example isArray(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport const isArray = (val: any): val is any[] => Array.isArray(val)\n\n/**\n * #### Return string with first letter lowercase.\n *\n * @example lowerFirst(\"PostOffice\")\n * // returns 'postOffice'\n *\n * @param {string} str\n * @returns string\n */\nexport function lowerFirst(str: string): string {\n    if (str)\n        return str.charAt(0).toLowerCase() + str.slice(1)\n    else\n        return String()\n}\n\n/**\n * #### Return string with first letter uppercase.\n *\n * @example upperFirst(\"postOffice\")\n * // returns 'PostOffice'\n *\n * @param {string} str\n * @returns string\n */\nexport function upperFirst(str: string): string {\n    if (str)\n        return str.charAt(0).toUpperCase() + str.slice(1)\n    else return String()\n}\n\n/**\n * #### Return true if element is an object\n *\n * @example isObject(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport const isObject = (val: any): val is object => Object.prototype.toString.call(val) === '[object Object]'\n\n/**\n * #### Return true if element is a function\n *\n * @example isFunction(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport const isFunction = <T extends Function>(val: any): val is T => typeof val === 'function'\n\n/**\n * Applies a mutation function to each key and value of an object recursively.\n * Ensures immutability of the original object by returning a new, deeply-copied and mutated object.\n *\n * @param {Object} obj - Original object.\n * @param {Function} fn - Async mutator function, should return an object with potentially new key-value pair.\n * @return {Object} - A new mutated object.\n */\nexport async function walk(\n    jsonObj: any,\n    fn: (arg: { key: string; value: any }, node: WalkNode) => Promise<{ key: string; value: any }>,\n) {\n    if (Array.isArray(jsonObj))\n        return await Promise.all(jsonObj.map(async value => await walkObj(value, fn)))\n\n    else if (isObject(jsonObj))\n        return await walkObj(jsonObj, fn)\n\n    else\n        return jsonObj\n}\nasync function walkObj(\n    jsonObj: any,\n    fn: (arg: { key: string; value: any }, node: WalkNode) => Promise<{ key: string; value: any }>,\n    node: WalkNode = new WalkNode(),\n): Promise<any> {\n    const cloneObj = clone(jsonObj)\n    const out: any = {}\n    const keys = Object.keys(cloneObj)\n\n    for (const key of keys) {\n        const newNode = new WalkNode([...node._path, key])\n        let { key: newKey, value: newValue } = await fn({ key, value: cloneObj[key] }, newNode)\n\n        if (newValue && isObject(newValue) && !newNode._ignoreChildren) {\n            newValue = await walkObj(newValue, fn, newNode)\n        }\n\n        else if (newValue && isArray(newValue) && !newNode._ignoreChildren) {\n            for (let idx = 0; idx < newValue.length; idx++) {\n                if (newValue[idx] && isObject(newValue[idx]))\n                    newValue[idx] = await walkObj(newValue[idx], fn, new WalkNode([...newNode._path, idx]))\n            }\n        }\n\n        out[newKey] = newValue\n    }\n\n    return out\n}\nclass WalkNode {\n    constructor(public _path: (string | number)[] = [], public _ignoreChildren: boolean = false) {\n        this._path = _path\n        this._ignoreChildren = _ignoreChildren\n    }\n\n    ignoreChilds() { this._ignoreChildren = true }\n    getPath() { return this._path }\n}\n\n/**\n * #### Replace all from findArray with replaceArray\n *\n * @example replaceAll('you & me', ['you','me'], ['me','you'])\n *\n * @param {string} str\n * @param {string[]} findArray\n * @param {string[]} replaceArray\n * @returns string\n */\nexport function replaceAll(str: string, findArray: string[], replaceArray: string[]): string {\n    let regex: string[] | string = []\n    const map = {}\n\n    for (let i = 0; i < findArray.length; i++) {\n        regex.push(findArray[i].replace(/([-[\\]{}()*+?.\\\\^$|#,])/g, '\\\\$1'))\n        map[findArray[i]] = replaceArray[i]\n    }\n\n    regex = regex.join('|')\n\n    str = str.replace(new RegExp(regex, 'g'), (matched) => {\n        return map[matched]\n    })\n\n    return str\n}\n\n/**\n * #### Creates a duplicate-free version of an array\n *\n * @example uniq(['a', 'b', 'a'])\n *\n * @param {any[]} array\n * @returns any[]\n */\nexport function uniq<T>(array: readonly T[]): T[] {\n    return Array.from(new Set(array))\n}\n\n/**\n * #### Creates a duplicate-free version of an array using iteratee\n *\n * @category Array\n */\nexport function uniqBy<T>(array: readonly T[], iteratee: keyof T | ((a: any) => any)): T[] {\n    return array.reduce((acc: T[], cur: any) => {\n        const computed = isFunction(iteratee)\n        const index = acc.findIndex((item: any) =>\n            computed\n                ? iteratee(item) === iteratee(cur)\n                : typeof cur?.[iteratee] !== 'undefined' && item?.[iteratee] === cur?.[iteratee],\n        )\n        if (index === -1)\n            acc.push(cur)\n        return acc\n    }, [])\n}\n"
  },
  {
    "path": "packages/client/tsconfig.json",
    "content": "{\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n    \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/generator/package.json",
    "content": "{\n    \"name\": \"prisma-appsync-generator\",\n    \"private\": true,\n    \"version\": \"1.0.0\",\n    \"author\": \"maoosi <hello@sylvainsimao.fr>\",\n    \"license\": \"BSD-2-Clause\",\n    \"devDependencies\": {\n        \"@prisma/generator-helper\": \"^5.6.0\",\n        \"@types/fs-extra\": \"^11.0.4\",\n        \"@types/pluralize\": \"^0.0.33\",\n        \"@types/prettier\": \"^3.0.0\",\n        \"appsync-schema-converter\": \"^2.1.4\",\n        \"fs-extra\": \"^11.1.1\",\n        \"graphql\": \"^16.8.1\",\n        \"lodash\": \"^4.17.21\",\n        \"pluralize\": \"^8.0.0\",\n        \"prettier\": \"^3.1.0\"\n    }\n}\n"
  },
  {
    "path": "packages/generator/src/client.ts",
    "content": "import type { RuntimeConfig } from '@client/types'\nimport type { DMMF } from '@prisma/generator-helper'\nimport { plural } from 'pluralize'\nimport * as prettier from 'prettier'\nimport { merge, uniq } from '@client/utils'\nimport { type ModelDirectives, extractUniqueAuthzModes, parseModelDirectives } from './directives'\n\nexport default class ClientConfigBuilder {\n    private runtimeConfig: Required<RuntimeConfig> = { modelsMapping: {}, fieldsMapping: {}, operations: [] }\n\n    public async createRuntimeConfig(dmmf: DMMF.Document, options?: { defaultDirective?: string }): Promise<RuntimeConfig> {\n        // get all schema authz modes\n        const schemaAuthzModes = extractUniqueAuthzModes(dmmf.datamodel, options)\n\n        // schema models\n        dmmf.datamodel?.models.forEach((modelDMMF: DMMF.Model) => {\n            const model = this.parseModelDMMF(modelDMMF, { ...options, schemaAuthzModes })\n            const modelConfig = this.createModelConfig(model)\n\n            this.runtimeConfig.modelsMapping = merge(\n                this.runtimeConfig.modelsMapping,\n                modelConfig.modelsMapping,\n            )\n            this.runtimeConfig.fieldsMapping = merge(\n                this.runtimeConfig.fieldsMapping,\n                modelConfig.fieldsMapping,\n            )\n            this.runtimeConfig.operations = uniq([\n                ...this.runtimeConfig.operations,\n                ...modelConfig.operations,\n            ])\n        })\n\n        // return config\n        return {\n            modelsMapping: this.runtimeConfig.modelsMapping,\n            fieldsMapping: this.runtimeConfig.fieldsMapping,\n            operations: this.runtimeConfig.operations,\n        }\n    }\n\n    public async mergeResolvers(baseResolvers: string, mergeResolvers: string): Promise<string> {\n        return await this.prettyYaml(`${baseResolvers}\\n${mergeResolvers}`)\n    }\n\n    private async prettyYaml(yaml: string) {\n        let prettyYaml = yaml\n\n        try {\n            prettyYaml = await prettier.format(yaml, {\n                parser: 'yaml',\n            })\n        }\n        catch (err) {\n            console.error(err)\n        }\n\n        return prettyYaml\n    }\n\n    private parseModelDMMF(modelDMMF: DMMF.Model, options?: { defaultDirective?: string; schemaAuthzModes: string[] }): ParsedModel {\n        const directives = parseModelDirectives({\n            modelDMMF,\n            defaultDirective: options?.defaultDirective || '',\n            schemaAuthzModes: options?.schemaAuthzModes || [],\n        })\n        const singular = modelDMMF.name\n        const prismaRef = singular.charAt(0).toLowerCase() + singular.slice(1)\n\n        return {\n            singular,\n            plural: plural(singular),\n            directives,\n            prismaRef,\n            fields: modelDMMF.fields,\n        }\n    }\n\n    private createModelConfig(model: ParsedModel): RuntimeConfig {\n        const modelsMapping: any = {}\n        const fieldsMapping: Record<string, { type: string; isRelation: boolean }> = {}\n        const operations: string[] = []\n\n        const modelDefinition = {\n            prismaRef: model.prismaRef,\n            singular: model.singular,\n            plural: model.plural,\n        }\n\n        // plural first (order is important)\n        if (model.singular !== model.plural)\n            modelsMapping[model.plural] = modelDefinition\n\n        // then singular\n        modelsMapping[model.singular] = modelDefinition\n\n        // mapping function\n        const map = (\n            { operation, field }:\n            { operation: string; field: DMMF.Field }\n        ) => {\n            if (!operations.includes(operation))\n                operations.push(operation)\n\n            fieldsMapping[`${operation}/${field.name}`] = {\n                type: field.type,\n                isRelation: Boolean(field?.relationName),\n            }\n        }\n\n        // fields mapping + operations\n        model.fields.forEach((field) => {\n            // get\n            if (model?.directives.isActionEligibleForGQL('get'))\n                map({ operation: `get${model.singular}`, field })\n\n            // list\n            if (model?.directives.isActionEligibleForGQL('list'))\n                map({ operation: `list${model.plural}`, field })\n\n            // count\n            if (model?.directives.isActionEligibleForGQL('count'))\n                map({ operation: `count${model.plural}`, field })\n\n            // create\n            if (model?.directives.isActionEligibleForGQL('create'))\n                map({ operation: `create${model.singular}`, field })\n\n            // createMany\n            if (model?.directives.isActionEligibleForGQL('createMany'))\n                map({ operation: `createMany${model.plural}`, field })\n\n            // update\n            if (model?.directives.isActionEligibleForGQL('update'))\n                map({ operation: `update${model.singular}`, field })\n\n            // updateMany\n            if (model?.directives.isActionEligibleForGQL('updateMany'))\n                map({ operation: `updateMany${model.plural}`, field })\n\n            // upsert\n            if (model?.directives.isActionEligibleForGQL('upsert'))\n                map({ operation: `upsert${model.singular}`, field })\n\n            // delete\n            if (model?.directives.isActionEligibleForGQL('delete'))\n                map({ operation: `delete${model.singular}`, field })\n\n            // deleteMany\n            if (model?.directives.isActionEligibleForGQL('deleteMany'))\n                map({ operation: `deleteMany${model.plural}`, field })\n\n            // onCreated\n            if (model?.directives.isActionEligibleForGQL('onCreated'))\n                map({ operation: `onCreated${model.singular}`, field })\n\n            // onUpdated\n            if (model?.directives.isActionEligibleForGQL('onUpdated'))\n                map({ operation: `onUpdated${model.singular}`, field })\n\n            // onUpserted\n            if (model?.directives.isActionEligibleForGQL('onUpserted'))\n                map({ operation: `onUpserted${model.singular}`, field })\n\n            // onDeleted\n            if (model?.directives.isActionEligibleForGQL('onDeleted'))\n                map({ operation: `onDeleted${model.singular}`, field })\n\n            // onMutated\n            if (model?.directives.isActionEligibleForGQL('onMutated'))\n                map({ operation: `onMutated${model.singular}`, field })\n\n            // onCreatedMany\n            if (model?.directives.isActionEligibleForGQL('onCreatedMany'))\n                map({ operation: `onCreatedMany${model.plural}`, field })\n\n            // onUpdatedMany\n            if (model?.directives.isActionEligibleForGQL('onUpdatedMany'))\n                map({ operation: `onUpdatedMany${model.plural}`, field })\n\n            // onDeletedMany\n            if (model?.directives.isActionEligibleForGQL('onDeletedMany'))\n                map({ operation: `onDeletedMany${model.plural}`, field })\n\n            // onMutatedMany\n            if (model?.directives.isActionEligibleForGQL('onMutatedMany'))\n                map({ operation: `onMutatedMany${model.plural}`, field })\n        })\n\n        return {\n            modelsMapping,\n            operations,\n            fieldsMapping,\n        }\n    }\n}\n\ntype ParsedModel = {\n    prismaRef: string\n    singular: string\n    plural: string\n    directives: ModelDirectives\n    fields: DMMF.Field[]\n}\n\nexport type Resolver = {\n    typeName: string\n    fieldName: string\n    dataSource: string\n    requestMappingTemplate?: string\n    responseMappingTemplate?: string\n}\n"
  },
  {
    "path": "packages/generator/src/directives.ts",
    "content": "import { merge, replaceAll, uniq, uniqBy } from '@client/utils'\nimport type { DMMF } from '@prisma/generator-helper'\n\nconst AuthzModes = ['apiKey', 'userPools', 'iam', 'oidc', 'lambda']\nconst QueryActions = ['get', 'list', 'count']\nconst MutationActions = ['create', 'createMany', 'update', 'updateMany', 'upsert', 'delete', 'deleteMany']\nconst SubscriptionActions = ['onCreated', 'onUpdated', 'onUpserted', 'onDeleted', 'onMutated', 'onCreatedMany', 'onUpdatedMany', 'onDeletedMany', 'onMutatedMany']\nconst Actions = [...QueryActions, ...MutationActions, ...SubscriptionActions]\n\nfunction getActionType(action) {\n    if (QueryActions.includes(action))\n        return 'queries'\n    if (MutationActions.includes(action))\n        return 'mutations'\n    if (SubscriptionActions.includes(action))\n        return 'subscriptions'\n    else\n        return 'model'\n}\n\nexport function extractUniqueAuthzModes(\n    datamodel: DMMF.Datamodel, opts?: { defaultDirective?: string },\n): string[] {\n    const schemaDirectives = datamodel?.models\n        ?.map(modelDMMF => [opts?.defaultDirective, modelDMMF.documentation].filter(Boolean).join(' '))\n        ?.join(' ') || ''\n    const regex = new RegExp(`(${AuthzModes.join('|')})`, 'gm')\n    const found = schemaDirectives.match(regex)\n    const uniqAuthzModes = found ? uniq(found) : []\n\n    return uniqAuthzModes\n}\n\nfunction parseDocumentationMatches(regex, doc, find, replace) {\n    let directive = {}\n\n    const matches = doc.match(regex)\n\n    if (matches) {\n        for (let i = 0; i < matches.length; i++) {\n            const str = replaceAll(matches[i].replace(regex, '$1'), find, replace)\n            // eslint-disable-next-line no-new-func\n            directive = merge(directive, new Function(`return ({${str}})`)())\n        }\n    }\n\n    return directive\n}\n\nexport function parseModelDirectives(\n    { modelDMMF, defaultDirective, schemaAuthzModes }:\n    { modelDMMF: DMMF.Model; defaultDirective: string; schemaAuthzModes: string[] },\n): ModelDirectives {\n    const doc = [defaultDirective, modelDMMF.documentation].filter(Boolean).join('\\n')\n\n    const gqlRegex = /@(?:gql)\\(([^)]+)\\)/gm\n    const authRegex = /@(?:auth)\\(([^)]+)\\)/gm\n\n    const find = AuthzModes\n    const replace = AuthzModes.map(authzMode => `\"${authzMode}\"`)\n\n    const gql: DirectiveGql = parseDocumentationMatches(gqlRegex, doc, find, replace)\n    const auth: DirectiveAuth = parseDocumentationMatches(authRegex, doc, find, replace)\n\n    const directives = { gql, auth }\n\n    return {\n        auth,\n        gql,\n        getGQLDirectivesForAction: (action: Action) => {\n            const authzDirectives = getAuthzDirectivesForAction(action, directives)\n            return convertToGQLDirectives(authzDirectives, schemaAuthzModes)\n        },\n        getGQLDirectivesForField: (field: string) => {\n            const authzDirectives = getAuthzDirectivesForField(field, directives)\n            return convertToGQLDirectives(authzDirectives, schemaAuthzModes)\n        },\n        getGQLDirectivesForModel: () => {\n            const authzDirectives = getAuthzDirectivesForModel(directives)\n            return convertToGQLDirectives(authzDirectives, schemaAuthzModes)\n        },\n        isFieldEligibleForGQL: (field: string) => {\n            return isFieldEligibleForGQL({ field, directives })\n        },\n        isActionEligibleForGQL: (action: Action) => {\n            return isActionEligibleForGQL({ action, directives })\n        },\n    }\n}\n\nfunction accessNestedProperty(obj, path) {\n    return path.split('.').reduce((acc, part) => acc && acc[part], obj)\n}\n\nfunction isDirectiveDefined(directive, ...properties) {\n    return properties.every(p => accessNestedProperty(directive, p) !== null)\n}\n\nfunction isActionEligibleForGQL(\n    { action, directives }: { action: Action; directives: Directives },\n): boolean {\n    let can = false\n\n    /**\n     * Cascading rules:\n     *\n     *  - Disabling model [cascade] on all queries, mutations and subscriptions\n     *  - Disabling queries, mutations, or subscription [cascade] on all related operations\n     *  - Disabling update [cascade] on upsert\n     *  - Disabling create [cascade] on upsert\n     *  - Disabling mutations [cascade] on subscriptions\n     */\n\n    const actionGroup = getActionType(action)\n\n    if (actionGroup === 'queries')\n        can = isDirectiveDefined(directives?.gql, 'model', 'queries', `queries.${action}`)\n\n    else if (actionGroup === 'mutations' && action === 'upsert')\n        can = isDirectiveDefined(directives?.gql, 'model', 'mutations', `mutations.${action}`, 'mutations.create', 'mutations.update')\n\n    else if (actionGroup === 'mutations')\n        can = isDirectiveDefined(directives?.gql, 'model', 'mutations', `mutations.${action}`)\n\n    else if (actionGroup === 'subscriptions')\n        can = isDirectiveDefined(directives?.gql, 'model', 'subscriptions', 'mutations', `subscriptions.${action}`)\n\n    return can\n}\n\nfunction isFieldEligibleForGQL(\n    { field, directives }: { field: string; directives: Directives },\n): boolean {\n    return isDirectiveDefined(directives?.gql, `fields.${field}`)\n}\n\nfunction mergeIfArray(target, source) {\n    if (Array.isArray(source))\n        return [...target, ...source]\n\n    return target\n}\n\nfunction getAuthzDirectivesForModel(directives) {\n    let authDirectives: Authz[] = []\n\n    // model\n    authDirectives = mergeIfArray(authDirectives, directives.auth?.model)\n\n    // queries, mutation, etc..\n    ;['queries', 'mutations', 'subscriptions'].forEach((thisActionGroup) => {\n        authDirectives = mergeIfArray(authDirectives, directives.auth?.[thisActionGroup])\n    })\n\n    // get, list, count, create, etc..\n    Actions.forEach((thisAction) => {\n        const thisActionGroup = getActionType(thisAction)\n        authDirectives = mergeIfArray(authDirectives, directives.auth?.[thisActionGroup]?.[thisAction])\n    })\n\n    return combineUniqueAuthDirectives(authDirectives)\n}\n\nfunction getAuthzDirectivesForAction(action, directives) {\n    let authDirectives: Authz[] = []\n\n    const actionGroup = getActionType(action)\n\n    // model\n    authDirectives = mergeIfArray(authDirectives, directives.auth?.model)\n\n    // queries, mutation, etc..\n    authDirectives = mergeIfArray(authDirectives, directives.auth?.[actionGroup])\n\n    // get, list, count, create, etc..\n    authDirectives = mergeIfArray(authDirectives, directives.auth?.[actionGroup]?.[action])\n\n    return combineUniqueAuthDirectives(authDirectives)\n}\n\nfunction getAuthzDirectivesForField(field, directives) {\n    return combineUniqueAuthDirectives(\n        mergeIfArray([], directives.auth?.fields?.[field]),\n    )\n}\n\nfunction combineUniqueAuthDirectives(authDirectives: Authz[]): Authz[] {\n    return uniqBy(\n        Array.from(\n            authDirectives\n                .reduce((map, policy) => {\n                    const existingPolicy = map.get(policy.allow)\n                    if (existingPolicy && policy.groups) {\n                        // merge groups\n                        existingPolicy.groups = [...existingPolicy.groups ?? [], ...policy.groups]\n                    }\n                    else {\n                        map.set(policy.allow, { ...policy })\n                    }\n                    return map\n                }, new Map()).values(),\n        ), 'allow',\n    )\n}\n\nfunction convertToGQLDirectives(prismaAuthDirectives, schemaAuthzModes) {\n    const appSyncDirectives: string[] = []\n\n    prismaAuthDirectives.forEach((authDirective) => {\n        if (authDirective?.allow === 'apiKey') {\n            appSyncDirectives.push('@aws_api_key')\n        }\n        else if (authDirective?.allow === 'iam') {\n            appSyncDirectives.push('@aws_iam')\n        }\n        else if (authDirective?.allow === 'oidc') {\n            appSyncDirectives.push('@aws_oidc')\n        }\n        else if (authDirective?.allow === 'lambda') {\n            appSyncDirectives.push('@aws_lambda')\n        }\n        else if (authDirective?.allow === 'userPools') {\n            // You can’t use the @aws_auth directive along with additional authorization modes. @aws_auth works only in the context of AMAZON_COGNITO_USER_POOLS authorization with no additional authorization modes.\n            // https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html\n            const cognitoDirective = schemaAuthzModes.length > 1\n                ? '@aws_cognito_user_pools'\n                : '@aws_auth'\n\n            if (authDirective?.groups && Array.isArray(authDirective.groups)) {\n                appSyncDirectives.push(\n                    `${cognitoDirective}(cognito_groups: [${authDirective.groups.map((g: string) => `\"${g}\"`).join(', ')}])`,\n                )\n            }\n            else {\n                appSyncDirectives.push(cognitoDirective)\n            }\n        }\n    })\n\n    return uniq(appSyncDirectives)\n}\n\nexport type Action = 'get' | 'list' | 'count' | 'create' | 'createMany' | 'update' | 'updateMany' | 'upsert' | 'delete' | 'deleteMany' | 'onCreated' | 'onUpdated' | 'onUpserted' | 'onDeleted' | 'onMutated' | 'onCreatedMany' | 'onUpdatedMany' | 'onMutatedMany' | 'onDeletedMany'\n\nexport type Directives = {\n    gql: DirectiveGql\n    auth: DirectiveAuth\n}\n\nexport type ModelDirectives = {\n    gql: DirectiveGql\n    auth: DirectiveAuth\n    getGQLDirectivesForAction: (action: Action) => string[]\n    getGQLDirectivesForField: (field: string) => string[]\n    getGQLDirectivesForModel: () => string[]\n    isActionEligibleForGQL: (action: Action) => boolean\n    isFieldEligibleForGQL: (field: string) => boolean\n}\n\ntype Authz = {\n    allow: 'apiKey' | 'iam' | 'oidc' | 'userPools' | 'lambda'\n    groups?: string[]\n}\n\ntype DirectiveGql = {\n    fields?: Record<string, null>\n    model?: null\n    queries?: null | Record<'get' | 'list' | 'count', string | null>\n    mutations?: null | Record<'create' | 'createMany' | 'update' | 'updateMany' | 'upsert' | 'delete' | 'deleteMany', string | null>\n    subscriptions?: null | Record<'onCreated' | 'onUpdated' | 'onUpserted' | 'onDeleted' | 'onMutated' | 'onCreatedMany' | 'onUpdatedMany' | 'onMutatedMany' | 'onDeletedMany', string | null>\n    scalars?: Record<string, string>\n}\n\ntype DirectiveAuth = {\n    model?: Authz[]\n    fields?: Record<string, Authz[]>\n    queries?: Record<'get' | 'list' | 'count', Authz[]>\n    mutations?: Record<'create' | 'createMany' | 'update' | 'updateMany' | 'upsert' | 'delete' | 'deleteMany', Authz[]>\n    subscriptions?: Record<'onCreated' | 'onUpdated' | 'onUpserted' | 'onDeleted' | 'onMutated' | 'onCreatedMany' | 'onUpdatedMany' | 'onMutatedMany' | 'onDeletedMany', Authz[]>\n}\n"
  },
  {
    "path": "packages/generator/src/generator.ts",
    "content": "import { dirname, join } from 'node:path'\nimport { copy, outputFile, readFile } from 'fs-extra'\nimport type { DMMF } from '@prisma/generator-helper'\nimport SchemaBuilder from './schema'\nimport ResolversBuilder from './resolvers'\nimport ClientConfigBuilder from './client'\n\nexport default class PrismaAppSyncGenerator {\n    private prismaDmmf: GeneratorOption['prismaDmmf']\n    private outputDir: GeneratorOption['outputDir']\n    private prismaSchemaPath: GeneratorOption['prismaSchemaPath']\n    private userGraphQLPath?: GeneratorOption['userGraphQLPath']\n    private userResolversPath?: GeneratorOption['userResolversPath']\n    private defaultDirective?: GeneratorOption['defaultDirective']\n\n    constructor(options: GeneratorOption) {\n        this.outputDir = options.outputDir\n        this.prismaDmmf = options.prismaDmmf\n        this.prismaSchemaPath = options.prismaSchemaPath\n        this.userGraphQLPath = options?.userGraphQLPath\n        this.userResolversPath = options?.userResolversPath\n        this.defaultDirective = options?.defaultDirective\n    }\n\n    public async makeAppSyncSchema() {\n        let schema: string\n\n        const builder = new SchemaBuilder()\n\n        // create schema from prisma dmmf\n        schema = await builder.createSchema(this.prismaDmmf, { defaultDirective: this.defaultDirective })\n\n        // extendSchema option\n        if (this.userGraphQLPath) {\n            // read user schema\n            const userSchema = await readFile(join(dirname(this.prismaSchemaPath), this.userGraphQLPath), {\n                encoding: 'utf-8',\n            })\n\n            // merge with generated schema\n            schema = await builder.mergeSchemas(schema, userSchema)\n        }\n        else {\n            // merge with nothing\n            schema = await builder.mergeSchemas(schema, '')\n        }\n\n        // output graphql schema\n        await outputFile(join(this.outputDir, 'schema.gql'), schema, 'utf-8')\n    }\n\n    public async makeAppSyncResolvers() {\n        let resolvers: string\n\n        const builder = new ResolversBuilder()\n\n        // create schema from prisma dmmf\n        resolvers = await builder.createResolvers(this.prismaDmmf, { defaultDirective: this.defaultDirective })\n\n        // extendResolvers option\n        if (this.userResolversPath) {\n            // read user resolvers\n            const userResolvers = await readFile(join(dirname(this.prismaSchemaPath), this.userResolversPath), {\n                encoding: 'utf8',\n            })\n\n            // merge with generated resolvers\n            resolvers = await builder.mergeResolvers(resolvers, userResolvers)\n        }\n\n        // output yaml resolvers\n        await outputFile(join(this.outputDir, 'resolvers.yaml'), resolvers, 'utf-8')\n    }\n\n    public async makeClientRuntimeConfig() {\n        const builder = new ClientConfigBuilder()\n\n        // create config from prisma dmmf\n        const runtimeConfig = await builder.createRuntimeConfig(this.prismaDmmf, { defaultDirective: this.defaultDirective })\n\n        // copy client to outputDir\n        await copy(join(__dirname, './client'), join(this.outputDir, 'client'))\n\n        // client files (js + ts defs)\n        await this.replaceInFile(\n            join(this.outputDir, 'client', 'index.js'),\n            /((?: )*{}\\;*\\s*\\/\\/\\!\\s+inject:config)/g,\n            JSON.stringify(runtimeConfig),\n        )\n\n        // inject in client ts defs\n        await this.replaceInFile(\n            join(this.outputDir, 'client', 'core.d.ts'),\n            /((?: )*(\\'|\\\")\\/\\/\\!\\s+inject:type:operations(\\'|\\\"))/g,\n            runtimeConfig.operations\n                .sort()\n                .map((o: string) => `\"${o}\"`)\n                .join(' | '),\n        )\n    }\n\n    private async replaceInFile(file: string, findRegex: RegExp, replace: string) {\n        const content = await readFile(file, 'utf-8')\n        const newContent = content.replace(findRegex, replace)\n        await outputFile(file, newContent, 'utf-8')\n\n        return newContent\n    }\n}\n\nexport type GeneratorOption = {\n    outputDir: string\n    prismaDmmf: DMMF.Document\n    prismaSchemaPath: string\n    userGraphQLPath?: string\n    userResolversPath?: string\n    defaultDirective?: string\n}\n"
  },
  {
    "path": "packages/generator/src/handler.ts",
    "content": "/* eslint-disable no-console */\n// Dependencies\nimport { generatorHandler } from '@prisma/generator-helper'\nimport PrismaAppSyncGenerator from './generator'\n\n// Read Prisma AppSync version\n// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\nconst generatorVersion = require('../../../package.json').version\n\n// Prisma AppSync Generator Handler\ngeneratorHandler({\n    onManifest() {\n        return {\n            defaultOutput: 'generated/prisma-appsync',\n            prettyName: 'Prisma-AppSync',\n            requiresEngines: ['queryEngine'],\n            version: generatorVersion,\n        }\n    },\n    async onGenerate(options: any) {\n        if (options?.generator?.output) {\n            try {\n                // Default client generator\n                const clientGenerator = options?.otherGenerators?.find(g => g?.provider?.value === 'prisma-client-js')\n\n                // Is debug mode enabled?\n                const debug: boolean = typeof options?.generator?.config?.debug !== 'undefined'\n                    ? Boolean(options.generator.config.debug)\n                    : false\n\n                // Read output dir (ensures previous version of prisma are still supported)\n                const outputDir: string = options?.generator?.output?.value || String()\n\n                // Read preview features\n                const previewFeatures: string[] = clientGenerator?.previewFeatures || []\n\n                if (debug) {\n                    console.log('[Prisma-AppSync] Generator config: ', {\n                        ...options.generator.config,\n                        output: outputDir,\n                        previewFeatures,\n                    })\n                }\n\n                // Initiate generator\n                const generator = new PrismaAppSyncGenerator({\n                    outputDir, // output directory\n                    prismaDmmf: options.dmmf, // prisma dmmf object\n                    prismaSchemaPath: options.schemaPath, // prisma schema path\n                    userGraphQLPath: options.generator?.config?.extendSchema, // user gql path\n                    userResolversPath: options.generator?.config?.extendResolvers, // user resolvers path\n                    defaultDirective: options?.generator?.config?.defaultDirective, // default directive(s)\n                })\n\n                // Make appsync schema\n                console.log('[Prisma-AppSync] Generating AppSync Schema.')\n                await generator.makeAppSyncSchema()\n\n                // Make appsync resolvers\n                console.log('[Prisma-AppSync] Generating AppSync Resolvers.')\n                await generator.makeAppSyncResolvers()\n\n                // Make client config\n                console.log('[Prisma-AppSync] Generating Client Runtime Config.')\n                await generator.makeClientRuntimeConfig()\n            }\n            catch (e) {\n                console.error('Error: unable to compile files for Prisma AppSync Generator')\n                throw e\n            }\n        }\n        else {\n            throw new Error('No output was specified for Prisma AppSync Generator')\n        }\n    },\n})\n"
  },
  {
    "path": "packages/generator/src/index.ts",
    "content": "#!/usr/bin/env node\nimport './handler'\n"
  },
  {
    "path": "packages/generator/src/resolvers.ts",
    "content": "import type { DMMF } from '@prisma/generator-helper'\nimport { plural } from 'pluralize'\nimport * as prettier from 'prettier'\nimport { type ModelDirectives, extractUniqueAuthzModes, parseModelDirectives } from './directives'\n\nexport default class ResolversBuilder {\n    private resolvers: Resolver[] = []\n\n    public async createResolvers(dmmf: DMMF.Document, options?: { defaultDirective?: string }): Promise<string> {\n        // get all schema authz modes\n        const schemaAuthzModes = extractUniqueAuthzModes(dmmf.datamodel, options)\n\n        // schema models\n        dmmf.datamodel?.models.forEach((modelDMMF: DMMF.Model) => {\n            const model = this.parseModelDMMF(modelDMMF, { ...options, schemaAuthzModes })\n\n            this.createQueryResolvers(model)\n            this.createMutationResolvers(model)\n            this.createSubscriptionResolvers(model)\n        })\n\n        // return appsync gql resolvers (yaml)\n        return await this.buildAppSyncResolvers()\n    }\n\n    public async mergeResolvers(baseResolvers: string, mergeResolvers: string): Promise<string> {\n        return await this.prettyYaml(`${baseResolvers}\\n${mergeResolvers}`)\n    }\n\n    private async prettyYaml(yaml: string) {\n        let prettyYaml = yaml\n\n        try {\n            prettyYaml = await prettier.format(yaml, {\n                parser: 'yaml',\n            })\n        }\n        catch (err) {\n            console.error(err)\n        }\n\n        return prettyYaml\n    }\n\n    private parseModelDMMF(modelDMMF: DMMF.Model, options?: { defaultDirective?: string; schemaAuthzModes: string[] }): ParsedModel {\n        const directives = parseModelDirectives({\n            modelDMMF,\n            defaultDirective: options?.defaultDirective || '',\n            schemaAuthzModes: options?.schemaAuthzModes || [],\n        })\n\n        return {\n            singular: modelDMMF.name,\n            plural: plural(modelDMMF.name),\n            directives,\n        }\n    }\n\n    private async buildAppSyncResolvers() {\n        const yaml = this.resolvers.map((r) => {\n            return [\n                `- typeName: ${r.typeName}`,\n                `  fieldName: ${r.fieldName}`,\n                `  dataSource: ${r.dataSource}`,\n            ].join('\\n')\n        }).join('\\n')\n\n        return await this.prettyYaml(yaml)\n    }\n\n    private createQueryResolvers(model: ParsedModel) {\n        // get\n        if (model?.directives.isActionEligibleForGQL('get')) {\n            this.resolvers.push({\n                typeName: 'Query',\n                fieldName: `get${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // list\n        if (model?.directives.isActionEligibleForGQL('list')) {\n            this.resolvers.push({\n                typeName: 'Query',\n                fieldName: `list${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // count\n        if (model?.directives.isActionEligibleForGQL('count')) {\n            this.resolvers.push({\n                typeName: 'Query',\n                fieldName: `count${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n    }\n\n    private createMutationResolvers(model: ParsedModel) {\n        // create\n        if (model?.directives.isActionEligibleForGQL('create')) {\n            this.resolvers.push({\n                typeName: 'Mutation',\n                fieldName: `create${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // createMany\n        if (model?.directives.isActionEligibleForGQL('createMany')) {\n            this.resolvers.push({\n                typeName: 'Mutation',\n                fieldName: `createMany${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // update\n        if (model?.directives.isActionEligibleForGQL('update')) {\n            this.resolvers.push({\n                typeName: 'Mutation',\n                fieldName: `update${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // updateMany\n        if (model?.directives.isActionEligibleForGQL('updateMany')) {\n            this.resolvers.push({\n                typeName: 'Mutation',\n                fieldName: `updateMany${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // upsert\n        if (model?.directives.isActionEligibleForGQL('upsert')) {\n            this.resolvers.push({\n                typeName: 'Mutation',\n                fieldName: `upsert${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // delete\n        if (model?.directives.isActionEligibleForGQL('delete')) {\n            this.resolvers.push({\n                typeName: 'Mutation',\n                fieldName: `delete${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // deleteMany\n        if (model?.directives.isActionEligibleForGQL('deleteMany')) {\n            this.resolvers.push({\n                typeName: 'Mutation',\n                fieldName: `deleteMany${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n    }\n\n    private createSubscriptionResolvers(model: ParsedModel) {\n        // onCreated\n        if (model?.directives.isActionEligibleForGQL('onCreated')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onCreated${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onUpdated\n        if (model?.directives.isActionEligibleForGQL('onUpdated')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onUpdated${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onUpserted\n        if (model?.directives.isActionEligibleForGQL('onUpserted')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onUpserted${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onDeleted\n        if (model?.directives.isActionEligibleForGQL('onDeleted')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onDeleted${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onMutated\n        if (model?.directives.isActionEligibleForGQL('onMutated')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onMutated${model.singular}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onCreatedMany\n        if (model?.directives.isActionEligibleForGQL('onCreatedMany')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onCreatedMany${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onUpdatedMany\n        if (model?.directives.isActionEligibleForGQL('onUpdatedMany')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onUpdatedMany${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onDeletedMany\n        if (model?.directives.isActionEligibleForGQL('onDeletedMany')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onDeletedMany${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n\n        // onMutatedMany\n        if (model?.directives.isActionEligibleForGQL('onMutatedMany')) {\n            this.resolvers.push({\n                typeName: 'Subscription',\n                fieldName: `onMutatedMany${model.plural}`,\n                dataSource: 'prisma-appsync',\n            })\n        }\n    }\n}\n\ntype ParsedModel = {\n    singular: string\n    plural: string\n    directives: ModelDirectives\n}\n\nexport type Resolver = {\n    typeName: string\n    fieldName: string\n    dataSource: string\n    requestMappingTemplate?: string\n    responseMappingTemplate?: string\n}\n"
  },
  {
    "path": "packages/generator/src/schema.ts",
    "content": "import type { DMMF } from '@prisma/generator-helper'\nimport { plural } from 'pluralize'\nimport flow from 'lodash/flow'\nimport camelCase from 'lodash/camelCase'\nimport upperFirst from 'lodash/upperFirst'\nimport { uniqBy } from '@client/utils'\nimport * as prettier from 'prettier'\nimport { type ModelDirectives, extractUniqueAuthzModes, parseModelDirectives } from './directives'\n\nconst pascalCase = flow(camelCase, upperFirst)\n\n// AppSync schema helper\n// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\nconst { convertSchemas } = require('appsync-schema-converter')\n\nexport default class SchemaBuilder {\n    private types: GqlType[] = []\n    private inputs: GqlInput[] = []\n    private enums: GqlEnum[] = []\n    private queries: GqlQuery[] = []\n    private mutations: GqlMutation[] = []\n    private subscriptions: GqlSubscription[] = []\n\n    public async createSchema(dmmf: DMMF.Document, options?: { defaultDirective?: string }) {\n        // schema base\n        this.createBaseTypes()\n        this.createBaseEnums()\n        this.createBaseInputs()\n\n        // schema enums\n        this.createEnumsInputs(dmmf.datamodel)\n        this.createEnumsTypes(dmmf.datamodel)\n\n        // get all schema authz modes\n        const schemaAuthzModes = extractUniqueAuthzModes(dmmf.datamodel, options)\n\n        // parse all models\n        const models: ParsedModel[] = dmmf.datamodel?.models\n            ?.map(modelDMMF => this.parseModelDMMF(modelDMMF, { ...options, schemaAuthzModes })) || []\n\n        // schema models\n        dmmf.datamodel?.models.forEach((modelDMMF: DMMF.Model) => {\n            const model = models\n                .find(m => m.singular === modelDMMF.name)\n\n            if (model) {\n                this.createModelTypes(model)\n                this.createModelInputs(model, models)\n                this.createModelQueries(model)\n                this.createModelMutations(model)\n                this.createModelSubscriptions(model)\n            }\n        })\n\n        // return appsync gql schema (string)\n        return await this.buildAppSyncSchema()\n    }\n\n    public async mergeSchemas(baseSchema: string, mergeSchema: string) {\n        const mergedSchema = await convertSchemas([baseSchema, mergeSchema], {\n            commentDescriptions: true,\n            includeDirectives: true,\n        })\n\n        return await this.perttyGraphQL(mergedSchema)\n    }\n\n    private async perttyGraphQL(schema: string) {\n        let perttyGraphQL = schema\n\n        try {\n            perttyGraphQL = await prettier.format(schema, {\n                semi: false,\n                parser: 'graphql',\n                tabWidth: 4,\n                trailingComma: 'none',\n                singleQuote: true,\n                printWidth: 60,\n            })\n        }\n        catch (err) {\n            console.error(err)\n        }\n\n        return perttyGraphQL\n    }\n\n    private parseModelDMMF(modelDMMF: DMMF.Model, options?: { defaultDirective?: string; schemaAuthzModes?: string[] }): ParsedModel {\n        const directives = parseModelDirectives({\n            modelDMMF,\n            defaultDirective: options?.defaultDirective || '',\n            schemaAuthzModes: options?.schemaAuthzModes || [],\n        })\n\n        const fields = modelDMMF.fields.map(field => ({\n            ...field,\n            isWriteOnly: directives?.gql?.fields?.[field.name] === null\n        }))\n\n        const getScalar = (field: DMMF.Field, inject?: FieldScalarOptions) => {\n            return this.getFieldScalar(field, { scalar: directives?.gql?.scalars?.[field.name], ...inject })\n        }\n\n        const uniqueComposites = [\n            modelDMMF.primaryKey,\n            ...modelDMMF.uniqueIndexes,\n        ]\n            .filter(composite => composite?.fields?.length)\n            .map((composite) => {\n                const compositeFields = ((composite as DMMF.PrimaryKey).fields\n                    .map(compositeField => fields.find(f => f.name === compositeField))\n                    .filter(Boolean)\n                ) as DMMF.Field[]\n\n                const name = (composite as DMMF.PrimaryKey)?.name\n                    || compositeFields\n                        .map(compositeField => compositeField.name)\n                        .join('_')\n\n                const scalar = `${pascalCase(\n                    compositeFields\n                        .map(compositeField => compositeField.name)\n                        .join(' '),\n                )}FieldsInput`\n\n                const subfields: GqlField[] = compositeFields\n                    .map((compositeField) => {\n                        return {\n                            name: compositeField.name,\n                            scalar: getScalar(compositeField),\n                        }\n                    })\n\n                return {\n                    name,\n                    scalar,\n                    fields: subfields,\n                }\n            })\n\n        const operationsFields = fields\n            ?.filter(field => !field?.isWriteOnly && !field?.relationName && !field?.isReadOnly && !field.isId && ['Int', 'Float'].includes(getScalar(field)))\n            ?.map(field => ({ name: field.name, scalar: getScalar(field, { after: 'Operation' }) })) || []\n\n        const whereInputFields = fields\n            .filter(field => !field?.isWriteOnly)\n            .map((field) => {\n                let scalar\n\n                if (field?.relationName) {\n                    if (field.isList)\n                        scalar = getScalar(field, { after: 'Filter', required: false, list: false })\n                    else\n                        scalar = getScalar(field, { after: 'WhereInput', required: false })\n                }\n                else if (field.isList) {\n                    if (field.kind === 'enum')\n                        scalar = getScalar(field, { after: 'EnumListFilter', required: false, list: false })\n                    else\n                        scalar = getScalar(field, { after: 'ListFilter', required: false, list: false })\n                }\n                else {\n                    if (field.kind === 'enum')\n                        scalar = getScalar(field, { after: 'EnumFilter', required: false })\n                    else\n                        scalar = getScalar(field, { after: `${!field.isRequired ? 'Nullable' : ''}Filter`, required: false })\n                }\n\n                return { name: field.name, scalar }\n            })\n            .filter(field => field.scalar)\n\n        const whereUniqueInputFields = [\n            ...fields\n                ?.filter(field => !field?.isWriteOnly)\n                ?.filter(field => field?.isUnique || field?.isId)\n                ?.map(field => ({ name: field.name, scalar: getScalar(field, { required: false }) })) || [],\n            ...uniqueComposites?.map(field => ({ name: field.name, scalar: field.scalar })),\n        ]\n\n        const extendedWhereUniqueInputFields = uniqBy([\n            ...whereUniqueInputFields,\n            ...whereInputFields,\n        ], 'name')\n\n        const scalarWhereInputFields = fields\n            ?.filter(field => !field?.isWriteOnly)\n            ?.map((field) => {\n                let scalar\n\n                if (!field?.relationName) {\n                    if (field.isList) {\n                        if (field.kind === 'enum')\n                            scalar = getScalar(field, { after: 'EnumListFilter', required: false, list: false })\n                        else\n                            scalar = getScalar(field, { after: 'ListFilter', required: false, list: false })\n                    }\n                    else {\n                        if (field.kind === 'enum')\n                            scalar = getScalar(field, { after: 'EnumFilter', required: false })\n                        else\n                            scalar = getScalar(field, { after: `${!field.isRequired ? 'Nullable' : ''}Filter`, required: false })\n                    }\n                }\n\n                return { name: field.name, scalar }\n            })\n            ?.filter(field => field.scalar) || []\n\n        return {\n            singular: modelDMMF.name,\n            plural: plural(modelDMMF.name),\n            fields,\n            directives,\n            gqlFields: {\n                operations: operationsFields,\n                whereInput: whereInputFields,\n                whereUniqueInput: whereUniqueInputFields,\n                extendedWhereUniqueInput: extendedWhereUniqueInputFields,\n                scalarWhereInput: scalarWhereInputFields,\n                uniqueComposites,\n            },\n            getScalar,\n            documentation: modelDMMF.documentation || '',\n            defaultDirective: options?.defaultDirective || '',\n        }\n    }\n\n    private createBaseTypes() {\n        this.types.push({\n            name: 'BatchPayload',\n            fields: [\n                { name: 'count', scalar: 'Int!' },\n            ],\n        })\n    }\n\n    private createBaseInputs() {\n        this.inputs.push({\n            name: 'IntOperation',\n            fields: [\n                { name: 'set', scalar: 'Int' },\n                { name: 'increment', scalar: 'Int' },\n                { name: 'decrement', scalar: 'Int' },\n                { name: 'multiply', scalar: 'Int' },\n                { name: 'divide', scalar: 'Int' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'FloatOperation',\n            fields: [\n                { name: 'set', scalar: 'Float' },\n                { name: 'increment', scalar: 'Float' },\n                { name: 'decrement', scalar: 'Float' },\n                { name: 'multiply', scalar: 'Float' },\n                { name: 'divide', scalar: 'Float' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSDateTimeFilter',\n            fields: [\n                { name: 'equals', scalar: 'AWSDateTime' },\n                { name: 'gt', scalar: 'AWSDateTime' },\n                { name: 'gte', scalar: 'AWSDateTime' },\n                { name: 'in', scalar: '[AWSDateTime!]' },\n                { name: 'lt', scalar: 'AWSDateTime' },\n                { name: 'lte', scalar: 'AWSDateTime' },\n                { name: 'not', scalar: 'AWSDateTimeFilter' },\n                { name: 'notIn', scalar: '[AWSDateTime!]' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSDateTimeNullableFilter',\n            fields: [\n                { name: 'equals', scalar: 'AWSDateTime' },\n                { name: 'gt', scalar: 'AWSDateTime' },\n                { name: 'gte', scalar: 'AWSDateTime' },\n                { name: 'in', scalar: '[AWSDateTime!]' },\n                { name: 'lt', scalar: 'AWSDateTime' },\n                { name: 'lte', scalar: 'AWSDateTime' },\n                { name: 'not', scalar: 'AWSDateTimeFilter' },\n                { name: 'notIn', scalar: '[AWSDateTime!]' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSDateTimeListFilter',\n            fields: [\n                { name: 'equals', scalar: '[AWSDateTime!]' },\n                { name: 'has', scalar: 'AWSDateTime' },\n                { name: 'hasEvery', scalar: '[AWSDateTime!]' },\n                { name: 'hasSome', scalar: '[AWSDateTime!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSDateFilter',\n            fields: [\n                { name: 'equals', scalar: 'AWSDate' },\n                { name: 'gt', scalar: 'AWSDate' },\n                { name: 'gte', scalar: 'AWSDate' },\n                { name: 'in', scalar: '[AWSDate!]' },\n                { name: 'lt', scalar: 'AWSDate' },\n                { name: 'lte', scalar: 'AWSDate' },\n                { name: 'not', scalar: 'AWSDateFilter' },\n                { name: 'notIn', scalar: '[AWSDate!]' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSDateNullableFilter',\n            fields: [\n                { name: 'equals', scalar: 'AWSDate' },\n                { name: 'gt', scalar: 'AWSDate' },\n                { name: 'gte', scalar: 'AWSDate' },\n                { name: 'in', scalar: '[AWSDate!]' },\n                { name: 'lt', scalar: 'AWSDate' },\n                { name: 'lte', scalar: 'AWSDate' },\n                { name: 'not', scalar: 'AWSDateFilter' },\n                { name: 'notIn', scalar: '[AWSDate!]' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSDateListFilter',\n            fields: [\n                { name: 'equals', scalar: '[AWSDate!]' },\n                { name: 'has', scalar: 'AWSDate' },\n                { name: 'hasEvery', scalar: '[AWSDate!]' },\n                { name: 'hasSome', scalar: '[AWSDate!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'FloatFilter',\n            fields: [\n                { name: 'equals', scalar: 'Float' },\n                { name: 'gt', scalar: 'Float' },\n                { name: 'gte', scalar: 'Float' },\n                { name: 'in', scalar: '[Float!]' },\n                { name: 'lt', scalar: 'Float' },\n                { name: 'lte', scalar: 'Float' },\n                { name: 'not', scalar: 'FloatFilter' },\n                { name: 'notIn', scalar: '[Float!]' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'FloatNullableFilter',\n            fields: [\n                { name: 'equals', scalar: 'Float' },\n                { name: 'gt', scalar: 'Float' },\n                { name: 'gte', scalar: 'Float' },\n                { name: 'in', scalar: '[Float!]' },\n                { name: 'lt', scalar: 'Float' },\n                { name: 'lte', scalar: 'Float' },\n                { name: 'not', scalar: 'FloatFilter' },\n                { name: 'notIn', scalar: '[Float!]' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'FloatListFilter',\n            fields: [\n                { name: 'equals', scalar: '[Float!]' },\n                { name: 'has', scalar: 'Float' },\n                { name: 'hasEvery', scalar: '[Float!]' },\n                { name: 'hasSome', scalar: '[Float!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'IntFilter',\n            fields: [\n                { name: 'equals', scalar: 'Int' },\n                { name: 'gt', scalar: 'Int' },\n                { name: 'gte', scalar: 'Int' },\n                { name: 'in', scalar: '[Int!]' },\n                { name: 'lt', scalar: 'Int' },\n                { name: 'lte', scalar: 'Int' },\n                { name: 'not', scalar: 'IntFilter' },\n                { name: 'notIn', scalar: '[Int!]' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'IntNullableFilter',\n            fields: [\n                { name: 'equals', scalar: 'Int' },\n                { name: 'gt', scalar: 'Int' },\n                { name: 'gte', scalar: 'Int' },\n                { name: 'in', scalar: '[Int!]' },\n                { name: 'lt', scalar: 'Int' },\n                { name: 'lte', scalar: 'Int' },\n                { name: 'not', scalar: 'IntFilter' },\n                { name: 'notIn', scalar: '[Int!]' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'IntListFilter',\n            fields: [\n                { name: 'equals', scalar: '[Int!]' },\n                { name: 'has', scalar: 'Int' },\n                { name: 'hasEvery', scalar: '[Int!]' },\n                { name: 'hasSome', scalar: '[Int!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSJSONFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'AWSJSON' },\n                { name: 'in', scalar: '[AWSJSON!]' },\n                { name: 'not', scalar: 'AWSJSONFilter' },\n                { name: 'notIn', scalar: '[AWSJSON!]' },\n                { name: 'startsWith', scalar: 'String' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSJSONNullableFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'AWSJSON' },\n                { name: 'in', scalar: '[AWSJSON!]' },\n                { name: 'not', scalar: 'AWSJSONFilter' },\n                { name: 'notIn', scalar: '[AWSJSON!]' },\n                { name: 'startsWith', scalar: 'String' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSJSONListFilter',\n            fields: [\n                { name: 'equals', scalar: '[AWSJSON!]' },\n                { name: 'has', scalar: 'AWSJSON' },\n                { name: 'hasEvery', scalar: '[AWSJSON!]' },\n                { name: 'hasSome', scalar: '[AWSJSON!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSEmailFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'AWSEmail' },\n                { name: 'in', scalar: '[AWSEmail!]' },\n                { name: 'not', scalar: 'AWSEmailFilter' },\n                { name: 'notIn', scalar: '[AWSEmail!]' },\n                { name: 'startsWith', scalar: 'String' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSEmailNullableFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'AWSEmail' },\n                { name: 'in', scalar: '[AWSEmail!]' },\n                { name: 'not', scalar: 'AWSEmailFilter' },\n                { name: 'notIn', scalar: '[AWSEmail!]' },\n                { name: 'startsWith', scalar: 'String' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSEmailListFilter',\n            fields: [\n                { name: 'equals', scalar: '[AWSEmail!]' },\n                { name: 'has', scalar: 'AWSEmail' },\n                { name: 'hasEvery', scalar: '[AWSEmail!]' },\n                { name: 'hasSome', scalar: '[AWSEmail!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSURLFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'AWSURL' },\n                { name: 'in', scalar: '[AWSURL!]' },\n                { name: 'not', scalar: 'AWSURLFilter' },\n                { name: 'notIn', scalar: '[AWSURL!]' },\n                { name: 'startsWith', scalar: 'String' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSURLNullableFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'AWSURL' },\n                { name: 'in', scalar: '[AWSURL!]' },\n                { name: 'not', scalar: 'AWSURLFilter' },\n                { name: 'notIn', scalar: '[AWSURL!]' },\n                { name: 'startsWith', scalar: 'String' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'AWSURLListFilter',\n            fields: [\n                { name: 'equals', scalar: '[AWSURL!]' },\n                { name: 'has', scalar: 'AWSURL' },\n                { name: 'hasEvery', scalar: '[AWSURL!]' },\n                { name: 'hasSome', scalar: '[AWSURL!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'StringFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'String' },\n                { name: 'in', scalar: '[String!]' },\n                { name: 'not', scalar: 'StringFilter' },\n                { name: 'notIn', scalar: '[String!]' },\n                { name: 'startsWith', scalar: 'String' },\n                { name: 'mode', scalar: 'String' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'StringNullableFilter',\n            fields: [\n                { name: 'contains', scalar: 'String' },\n                { name: 'endsWith', scalar: 'String' },\n                { name: 'equals', scalar: 'String' },\n                { name: 'in', scalar: '[String!]' },\n                { name: 'not', scalar: 'StringFilter' },\n                { name: 'notIn', scalar: '[String!]' },\n                { name: 'startsWith', scalar: 'String' },\n                { name: 'mode', scalar: 'String' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'StringListFilter',\n            fields: [\n                { name: 'equals', scalar: '[String!]' },\n                { name: 'has', scalar: 'String' },\n                { name: 'hasEvery', scalar: '[String!]' },\n                { name: 'hasSome', scalar: '[String!]' },\n                { name: 'isEmpty', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'BooleanFilter',\n            fields: [\n                { name: 'equals', scalar: 'Boolean' },\n                { name: 'not', scalar: 'BooleanFilter' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'BooleanNullableFilter',\n            fields: [\n                { name: 'equals', scalar: 'Boolean' },\n                { name: 'not', scalar: 'BooleanFilter' },\n                { name: 'isNull', scalar: 'Boolean' },\n            ],\n        })\n\n        this.inputs.push({\n            name: 'BooleanListFilter',\n            fields: [\n                { name: 'equals', scalar: '[Boolean!]' },\n                { name: 'has', scalar: 'Boolean' },\n                { name: 'hasEvery', scalar: '[Boolean!]' },\n                { name: 'hasSome', scalar: '[Boolean!]' },\n            ],\n        })\n    }\n\n    private createBaseEnums() {\n        this.enums.push({\n            name: 'OrderByArg',\n            options: ['ASC', 'DESC'],\n        })\n\n        this.enums.push({\n            name: 'NullArg',\n            options: ['NULL'],\n        })\n    }\n\n    private createEnumsInputs(datamodel: DMMF.Datamodel) {\n        datamodel?.enums.forEach((thisEnum: DMMF.DatamodelEnum) => {\n            this.inputs.push({\n                name: `${thisEnum.name}EnumFilter`,\n                fields: [\n                    { name: 'equals', scalar: thisEnum.name },\n                    { name: 'in', scalar: `[${thisEnum.name}!]` },\n                    { name: 'not', scalar: `${thisEnum.name}EnumFilter` },\n                    { name: 'notIn', scalar: `[${thisEnum.name}!]` },\n                ],\n            })\n\n            this.inputs.push({\n                name: `${thisEnum.name}EnumListFilter`,\n                fields: [\n                    { name: 'equals', scalar: `[${thisEnum.name}!]` },\n                    { name: 'has', scalar: thisEnum.name },\n                    { name: 'hasEvery', scalar: `[${thisEnum.name}!]` },\n                    { name: 'hasSome', scalar: `[${thisEnum.name}!]` },\n                    { name: 'isEmpty', scalar: 'Boolean' },\n                ],\n            })\n        })\n    }\n\n    private createEnumsTypes(datamodel: DMMF.Datamodel) {\n        datamodel?.enums.forEach((thisEnum: DMMF.DatamodelEnum) => {\n            this.enums.push({\n                name: thisEnum.name,\n                options: thisEnum.values.map(e => e.name),\n            })\n        })\n    }\n\n    private createModelTypes(model: ParsedModel) {\n        this.types.push({\n            name: model.singular,\n            fields: model.fields\n                ?.filter(field => !field?.isWriteOnly)\n                ?.map((field) => {\n                    return {\n                        name: field.name,\n                        scalar: model.getScalar(field, { required: field.isRequired }),\n                        directives: model?.directives?.getGQLDirectivesForField(field.name),\n                    }\n                }),\n            directives: model?.directives?.getGQLDirectivesForModel(),\n        })\n    }\n\n    private createModelInputs(model: ParsedModel, allModels: ParsedModel[]) {\n        model.gqlFields?.uniqueComposites?.forEach((uniqueComposite) => {\n            this.inputs.push({\n                name: uniqueComposite.scalar,\n                fields: uniqueComposite.fields,\n            })\n        })\n\n        this.inputs.push({\n            name: `${model.singular}Filter`,\n            fields: [\n                { name: 'some', scalar: `${model.singular}WhereInputWithoutNullables` },\n                { name: 'every', scalar: `${model.singular}WhereInputWithoutNullables` },\n                { name: 'none', scalar: `${model.singular}WhereInputWithoutNullables` },\n            ],\n        })\n\n        this.inputs.push({\n            name: `${model.singular}WhereInputWithoutNullables`,\n            fields: [\n                { name: 'OR', scalar: `[${model.singular}WhereInput!]` },\n                { name: 'NOT', scalar: `[${model.singular}WhereInput!]` },\n                { name: 'AND', scalar: `[${model.singular}WhereInput!]` },\n                ...model.gqlFields.whereInput,\n            ],\n        })\n\n        this.inputs.push({\n            name: `${model.singular}WhereInput`,\n            fields: [\n                { name: 'is', scalar: 'NullArg' },\n                { name: 'isNot', scalar: 'NullArg' },\n                { name: 'OR', scalar: `[${model.singular}WhereInput!]` },\n                { name: 'NOT', scalar: `[${model.singular}WhereInput!]` },\n                { name: 'AND', scalar: `[${model.singular}WhereInput!]` },\n                ...model.gqlFields.whereInput,\n            ],\n        })\n\n        this.inputs.push({\n            name: `${model.singular}ScalarWhereInput`,\n            fields: [\n                { name: 'OR', scalar: `[${model.singular}ScalarWhereInput!]` },\n                { name: 'NOT', scalar: `[${model.singular}ScalarWhereInput!]` },\n                { name: 'AND', scalar: `[${model.singular}ScalarWhereInput!]` },\n                ...model.gqlFields.scalarWhereInput,\n            ],\n        })\n\n        if (model.gqlFields.whereUniqueInput?.length) {\n            this.inputs.push({\n                name: `${model.singular}WhereUniqueInput`,\n                fields: model.gqlFields.whereUniqueInput,\n            })\n        }\n\n        if (model.gqlFields.extendedWhereUniqueInput?.length) {\n            this.inputs.push({\n                name: `${model.singular}ExtendedWhereUniqueInput`,\n                fields: [\n                    { name: 'OR', scalar: `[${model.singular}WhereInput!]` },\n                    { name: 'NOT', scalar: `[${model.singular}WhereInput!]` },\n                    { name: 'AND', scalar: `[${model.singular}WhereInput!]` },\n                    ...model.gqlFields.extendedWhereUniqueInput,\n                ],\n            })\n        }\n\n        this.inputs.push({\n            name: `${model.singular}OrderByInput`,\n            fields: model.fields\n                ?.filter(field => !field?.isWriteOnly)\n                ?.map((field) => {\n                    if (field?.relationName)\n                        return { name: field.name, scalar: model.getScalar(field, { after: 'OrderByInput', required: false, list: false }) }\n                    else\n                        return { name: field.name, scalar: 'OrderByArg' }\n                }) || [],\n        })\n\n        const nestedCreateInputs = uniqBy(\n            model.fields\n                ?.filter(field => !field?.isReadOnly && field?.relationName)\n                ?.map((field) => {\n                    const name = `${model.singular}${upperFirst(field.name)}CreateNestedInput`\n                    const refModel = allModels.find(m => m.singular === field.type)\n                    const fields: GqlField[] = []\n\n                    if (field.isList) {\n                        fields.push({ name: 'connect', scalar: `[${field.type}WhereUniqueInput!]` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('create')) {\n                            fields.push({ name: 'create', scalar: `[${field.type}CreateWithout${model.singular}Input!]` })\n                            fields.push({ name: 'connectOrCreate', scalar: `[${field.type}ConnectOrCreateWithout${model.singular}Input!]` })\n                        }\n                    }\n                    else {\n                        fields.push({ name: 'connect', scalar: `${field.type}WhereUniqueInput` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('create')) {\n                            fields.push({ name: 'create', scalar: `${field.type}CreateWithout${model.singular}Input` })\n                            fields.push({ name: 'connectOrCreate', scalar: `${field.type}ConnectOrCreateWithout${model.singular}Input` })\n                        }\n                    }\n\n                    return {\n                        name,\n                        fields,\n                    }\n                }) || []\n            , 'name')\n\n        nestedCreateInputs.forEach((nestedCreateInput) => {\n            this.inputs.push(nestedCreateInput)\n        })\n\n        const nestedUpdateInputs = uniqBy(\n            model.fields\n                ?.filter(field => !field?.isReadOnly && field?.relationName)\n                ?.map((field) => {\n                    const name = `${model.singular}${upperFirst(field.name)}UpdateNestedInput`\n                    const refModel = allModels.find(m => m.singular === field.type)\n                    const fields: GqlField[] = []\n\n                    if (field.isList) {\n                        fields.push({ name: 'connect', scalar: `[${field.type}WhereUniqueInput!]` })\n                        fields.push({ name: 'disconnect', scalar: `[${field.type}ExtendedWhereUniqueInput!]` })\n                        fields.push({ name: 'set', scalar: `[${field.type}WhereUniqueInput!]` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('create')) {\n                            fields.push({ name: 'create', scalar: `[${field.type}CreateWithout${model.singular}Input!]` })\n                            fields.push({ name: 'connectOrCreate', scalar: `[${field.type}ConnectOrCreateWithout${model.singular}Input!]` })\n                        }\n\n                        if (refModel?.directives.isActionEligibleForGQL('update'))\n                            fields.push({ name: 'update', scalar: `[${field.type}UpdateWithWhereUniqueWithout${model.singular}Input!]` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('upsert'))\n                            fields.push({ name: 'upsert', scalar: `[${field.type}UpsertWithWhereUniqueWithout${model.singular}Input!]` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('delete'))\n                            fields.push({ name: 'delete', scalar: `[${field.type}ExtendedWhereUniqueInput!]` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('deleteMany'))\n                            fields.push({ name: 'deleteMany', scalar: `[${field.type}ScalarWhereInput!]` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('updateMany'))\n                            fields.push({ name: 'updateMany', scalar: `[${field.type}UpdateManyInput!]` })\n                    }\n                    else {\n                        fields.push({ name: 'connect', scalar: `${field.type}WhereUniqueInput` })\n                        fields.push({ name: 'disconnect', scalar: 'Boolean' })\n\n                        if (refModel?.directives.isActionEligibleForGQL('create')) {\n                            fields.push({ name: 'create', scalar: `${field.type}CreateWithout${model.singular}Input` })\n                            fields.push({ name: 'connectOrCreate', scalar: `${field.type}ConnectOrCreateWithout${model.singular}Input` })\n                        }\n\n                        if (refModel?.directives.isActionEligibleForGQL('update'))\n                            fields.push({ name: 'update', scalar: `${field.type}UpdateWithout${model.singular}Input` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('upsert'))\n                            fields.push({ name: 'upsert', scalar: `${field.type}UpsertWithout${model.singular}Input` })\n\n                        if (refModel?.directives.isActionEligibleForGQL('delete'))\n                            fields.push({ name: 'delete', scalar: 'Boolean' })\n                    }\n\n                    return {\n                        name,\n                        fields,\n                    }\n                }) || []\n            , 'name')\n\n        nestedUpdateInputs.forEach((nestedUpdateInput) => {\n            this.inputs.push(nestedUpdateInput)\n        })\n\n        if (model?.directives.isActionEligibleForGQL('create')) {\n            this.inputs.push({\n                name: `${model.singular}CreateInput`,\n                fields: model.fields\n                    ?.filter(field => !field?.isReadOnly)\n                    ?.map((field) => {\n                        if (field?.relationName) {\n                            const scalar = `${model.singular}${upperFirst(field.name)}CreateNestedInput`\n\n                            return {\n                                name: field.name,\n                                scalar: model.getScalar(field, { scalar, required: false, list: false }),\n                            }\n                        }\n                        else {\n                            return {\n                                name: field.name,\n                                scalar: model.getScalar(field),\n                                default: { value: field.default, kind: field.kind },\n                            }\n                        }\n                    }) || [],\n            })\n\n            model.fields\n                ?.filter(field => field?.relationName)\n                ?.forEach((fieldWithRelation) => {\n                    const fieldsForCreateWithout = model.fields\n                        ?.filter((field) => {\n                            return field.name !== fieldWithRelation.name\n                                && !fieldWithRelation.relationFromFields?.includes(field.name)\n                        })\n\n                    const enforcedOptionalFields: string[] = []\n\n                    fieldsForCreateWithout\n                        ?.forEach(field => {\n                            if (field?.relationName) {\n                                field?.relationFromFields?.forEach(fieldName => {\n                                    enforcedOptionalFields.push(fieldName)\n                                })\n                            }\n                        })\n\n                    this.inputs.push({\n                        name: `${model.singular}CreateWithout${upperFirst(fieldWithRelation.type)}Input`,\n                        fields: fieldsForCreateWithout\n                            ?.map((field) => {\n                                if (field?.relationName) {\n                                    const scalar = `${model.singular}${upperFirst(field.name)}CreateNestedInput`\n\n                                    return {\n                                        name: field.name,\n                                        scalar: model.getScalar(field, { scalar, required: false, list: false }),\n                                    }\n                                }\n                                else {\n                                    const required = enforcedOptionalFields.includes(field.name) ? false : undefined\n\n                                    return {\n                                        name: field.name,\n                                        scalar: model.getScalar(field, {required }),\n                                        default: { value: field.default, kind: field.kind },\n                                    }\n                                }\n                            }) || [],\n                    })\n                })\n        }\n\n        if (model?.directives.isActionEligibleForGQL('create')) {\n            model.fields\n                ?.filter(field => field?.relationName)\n                ?.forEach((fieldWithRelation) => {\n                    this.inputs.push({\n                        name: `${model.singular}ConnectOrCreateWithout${upperFirst(fieldWithRelation.type)}Input`,\n                        fields: [\n                            { name: 'where', scalar: `${model.singular}WhereUniqueInput!` },\n                            { name: 'create', scalar: `${model.singular}CreateWithout${upperFirst(fieldWithRelation.type)}Input!` },\n                        ],\n                    })\n                })\n        }\n\n        if (model?.directives.isActionEligibleForGQL('createMany')) {\n            this.inputs.push({\n                name: `${model.singular}CreateManyInput`,\n                fields: model.fields\n                    ?.filter(field => !field?.relationName && !field?.isReadOnly)\n                    ?.map(field => ({\n                        name: field.name,\n                        scalar: model.getScalar(field),\n                        default: { value: field.default, kind: field.kind },\n                    })) || [],\n            })\n        }\n\n        if (model?.directives.isActionEligibleForGQL('update')) {\n            this.inputs.push({\n                name: `${model.singular}UpdateInput`,\n                fields: model.fields\n                    ?.filter(field => !field?.isReadOnly)\n                    ?.map((field) => {\n                        if (field?.relationName) {\n                            const scalar = `${model.singular}${upperFirst(field.name)}UpdateNestedInput`\n\n                            return {\n                                name: field.name,\n                                scalar: model.getScalar(field, { scalar, required: false, list: false }),\n                            }\n                        }\n                        else {\n                            return { name: field.name, scalar: model.getScalar(field, { required: false }) }\n                        }\n                    }) || [],\n            })\n\n            model.fields\n                ?.filter(field => field?.relationName)\n                ?.forEach((fieldWithRelation) => {\n                    this.inputs.push({\n                        name: `${model.singular}UpdateWithout${upperFirst(fieldWithRelation.type)}Input`,\n                        fields: model.fields\n                            ?.filter((field) => {\n                                return field.name !== fieldWithRelation.name\n                                    && !fieldWithRelation.relationFromFields?.includes(field.name)\n                            })\n                            ?.map((field) => {\n                                if (field?.relationName) {\n                                    const scalar = `${model.singular}${upperFirst(field.name)}UpdateNestedInput`\n\n                                    return {\n                                        name: field.name,\n                                        scalar: model.getScalar(field, { scalar, required: false, list: false }),\n                                    }\n                                }\n                                else {\n                                    return { name: field.name, scalar: model.getScalar(field, { required: false }) }\n                                }\n                            }) || [],\n                    })\n                })\n\n            model.fields\n                ?.filter(field => field?.relationName)\n                ?.forEach((fieldWithRelation) => {\n                    this.inputs.push({\n                        name: `${model.singular}UpdateWithWhereUniqueWithout${upperFirst(fieldWithRelation.type)}Input`,\n                        fields: [\n                            { name: 'data', scalar: `${model.singular}UpdateWithout${upperFirst(fieldWithRelation.type)}Input!` },\n                            { name: 'where', scalar: `${model.singular}ExtendedWhereUniqueInput!` },\n                        ],\n                    })\n                })\n\n            if (model.gqlFields?.operations?.length) {\n                this.inputs.push({\n                    name: `${model.singular}OperationInput`,\n                    fields: model.gqlFields.operations,\n                })\n            }\n        }\n\n        if (model?.directives.isActionEligibleForGQL('updateMany')) {\n            this.inputs.push({\n                name: `${model.singular}UpdateManyInput`,\n                fields: [\n                    { name: 'where', scalar: `${model.singular}ScalarWhereInput!` },\n                    { name: 'data', scalar: `${model.singular}UpdateInput!` },\n                ],\n            })\n        }\n\n        if (model?.directives.isActionEligibleForGQL('upsert')) {\n            model.fields\n                ?.filter(field => field?.relationName)\n                ?.forEach((fieldWithRelation) => {\n                    this.inputs.push({\n                        name: `${model.singular}UpsertWithout${upperFirst(fieldWithRelation.type)}Input`,\n                        fields: [\n                            { name: 'create', scalar: `${model.singular}CreateWithout${upperFirst(fieldWithRelation.type)}Input!` },\n                            { name: 'update', scalar: `${model.singular}UpdateWithout${upperFirst(fieldWithRelation.type)}Input!` },\n                        ],\n                    })\n                })\n\n            model.fields\n                ?.filter(field => field?.relationName)\n                ?.forEach((fieldWithRelation) => {\n                    this.inputs.push({\n                        name: `${model.singular}UpsertWithWhereUniqueWithout${upperFirst(fieldWithRelation.type)}Input`,\n                        fields: [\n                            { name: 'where', scalar: `${model.singular}ExtendedWhereUniqueInput!` },\n                            { name: 'create', scalar: `${model.singular}CreateWithout${upperFirst(fieldWithRelation.type)}Input!` },\n                            { name: 'update', scalar: `${model.singular}UpdateWithout${upperFirst(fieldWithRelation.type)}Input!` },\n                        ],\n                    })\n                })\n        }\n    }\n\n    private createModelQueries(model: ParsedModel) {\n        // get\n        if (model?.directives.isActionEligibleForGQL('get')) {\n            this.queries.push({\n                name: `get${model.singular}`,\n                comment: `Retrieve a single ${model.singular} record by unique identifier.`,\n                args: [\n                    { name: 'where', scalar: `${model.singular}ExtendedWhereUniqueInput!` },\n                ],\n                scalar: `${model.singular}`,\n                directives: model?.directives?.getGQLDirectivesForAction('get'),\n            })\n        }\n\n        // list\n        if (model?.directives.isActionEligibleForGQL('list')) {\n            this.queries.push({\n                name: `list${model.plural}`,\n                comment: `Retrieve a list of ${model.plural} records.`,\n                args: [\n                    { name: 'where', scalar: `${model.singular}WhereInput` },\n                    { name: 'orderBy', scalar: `[${model.singular}OrderByInput!]` },\n                    { name: 'skip', scalar: 'Int' },\n                    { name: 'take', scalar: 'Int' },\n                ],\n                scalar: `[${model.singular}!]`,\n                directives: model?.directives?.getGQLDirectivesForAction('list'),\n            })\n        }\n\n        // count\n        if (model?.directives.isActionEligibleForGQL('count')) {\n            this.queries.push({\n                name: `count${model.plural}`,\n                comment: `Count the number of ${model.plural} records.`,\n                args: [\n                    { name: 'where', scalar: `${model.singular}WhereInput` },\n                    { name: 'orderBy', scalar: `[${model.singular}OrderByInput!]` },\n                    { name: 'skip', scalar: 'Int' },\n                    { name: 'take', scalar: 'Int' },\n                ],\n                scalar: 'Int!',\n                directives: model?.directives?.getGQLDirectivesForAction('count'),\n            })\n        }\n    }\n\n    private createModelMutations(model: ParsedModel) {\n        // create\n        if (model?.directives.isActionEligibleForGQL('create')) {\n            this.mutations.push({\n                name: `create${model.singular}`,\n                comment: `Create a new ${model.singular} record.`,\n                args: [\n                    { name: 'data', scalar: `${model.singular}CreateInput!` },\n                ],\n                scalar: `${model.singular}!`,\n                directives: model?.directives?.getGQLDirectivesForAction('create'),\n            })\n        }\n\n        // createMany\n        if (model?.directives.isActionEligibleForGQL('createMany')) {\n            this.mutations.push({\n                name: `createMany${model.plural}`,\n                comment: `Create multiple new ${model.plural} records.`,\n                args: [\n                    { name: 'data', scalar: `[${model.singular}CreateManyInput!]` },\n                    { name: 'skipDuplicates', scalar: 'Boolean' },\n                ],\n                scalar: 'BatchPayload!',\n                directives: model?.directives?.getGQLDirectivesForAction('createMany'),\n            })\n        }\n\n        // update\n        if (model?.directives.isActionEligibleForGQL('update')) {\n            this.mutations.push({\n                name: `update${model.singular}`,\n                comment: `Update a single existing ${model.singular} record.`,\n                args: [\n                    { name: 'where', scalar: `${model.singular}ExtendedWhereUniqueInput!` },\n                    { name: 'data', scalar: `${model.singular}UpdateInput` },\n                    ...model.gqlFields?.operations?.length ? [{ name: 'operation', scalar: `${model.singular}OperationInput` }] : [],\n                ],\n                scalar: `${model.singular}!`,\n                directives: model?.directives?.getGQLDirectivesForAction('update'),\n            })\n        }\n\n        // updateMany\n        if (model?.directives.isActionEligibleForGQL('updateMany')) {\n            this.mutations.push({\n                name: `updateMany${model.plural}`,\n                comment: `Update multiple existing ${model.plural} records.`,\n                args: [\n                    { name: 'where', scalar: `${model.singular}WhereInput!` },\n                    { name: 'data', scalar: `${model.singular}UpdateInput` },\n                    ...model.gqlFields?.operations?.length ? [{ name: 'operation', scalar: `${model.singular}OperationInput` }] : [],\n                ],\n                scalar: 'BatchPayload!',\n                directives: model?.directives?.getGQLDirectivesForAction('updateMany'),\n            })\n        }\n\n        // upsert\n        if (model?.directives.isActionEligibleForGQL('upsert')) {\n            this.mutations.push({\n                name: `upsert${model.singular}`,\n                comment: `Create a new ${model.singular} record if it does not exist, or updates it if it does.`,\n                args: [\n                    { name: 'create', scalar: `${model.singular}CreateInput!` },\n                    { name: 'update', scalar: `${model.singular}UpdateInput!` },\n                    { name: 'where', scalar: `${model.singular}ExtendedWhereUniqueInput!` },\n                ],\n                scalar: `${model.singular}!`,\n                directives: model?.directives?.getGQLDirectivesForAction('upsert'),\n            })\n        }\n\n        // delete\n        if (model?.directives.isActionEligibleForGQL('delete')) {\n            this.mutations.push({\n                name: `delete${model.singular}`,\n                comment: `Delete a single existing ${model.singular} record.`,\n                args: [\n                    { name: 'where', scalar: `${model.singular}ExtendedWhereUniqueInput!` },\n                ],\n                scalar: `${model.singular}!`,\n                directives: model?.directives?.getGQLDirectivesForAction('delete'),\n            })\n        }\n\n        // deleteMany\n        if (model?.directives.isActionEligibleForGQL('deleteMany')) {\n            this.mutations.push({\n                name: `deleteMany${model.plural}`,\n                comment: `Delete multiple existing ${model.plural} records.`,\n                args: [\n                    { name: 'where', scalar: `${model.singular}WhereInput!` },\n                ],\n                scalar: 'BatchPayload!',\n                directives: model?.directives?.getGQLDirectivesForAction('deleteMany'),\n            })\n        }\n    }\n\n    private createModelSubscriptions(model: ParsedModel) {\n        // onCreated\n        if (model?.directives.isActionEligibleForGQL('onCreated')) {\n            this.subscriptions.push({\n                name: `onCreated${model.singular}`,\n                comment: `Event triggered when a new ${model.singular} record is created.`,\n                args: model.gqlFields.whereUniqueInput.slice(0, 8),\n                scalar: `${model.singular}!`,\n                directives: [`@aws_subscribe(mutations: [\"create${model.singular}\"])`, ...model?.directives?.getGQLDirectivesForAction('onCreated')],\n            })\n        }\n\n        // onUpdated\n        if (model?.directives.isActionEligibleForGQL('onUpdated')) {\n            this.subscriptions.push({\n                name: `onUpdated${model.singular}`,\n                comment: `Event triggered when an existing ${model.singular} record is updated.`,\n                args: model.gqlFields.whereUniqueInput.slice(0, 8),\n                scalar: `${model.singular}!`,\n                directives: [`@aws_subscribe(mutations: [\"update${model.singular}\"])`, ...model?.directives?.getGQLDirectivesForAction('onUpdated')],\n            })\n        }\n\n        // onUpserted\n        if (model?.directives.isActionEligibleForGQL('onUpserted')) {\n            this.subscriptions.push({\n                name: `onUpserted${model.singular}`,\n                comment: `Event triggered when a ${model.singular} record is either created or updated.`,\n                args: model.gqlFields.whereUniqueInput.slice(0, 8),\n                scalar: `${model.singular}!`,\n                directives: [`@aws_subscribe(mutations: [\"upsert${model.singular}\"])`, ...model?.directives?.getGQLDirectivesForAction('onUpserted')],\n            })\n        }\n\n        // onDeleted\n        if (model?.directives.isActionEligibleForGQL('onDeleted')) {\n            this.subscriptions.push({\n                name: `onDeleted${model.singular}`,\n                comment: `Event triggered when an existing ${model.singular} record is deleted.`,\n                args: model.gqlFields.whereUniqueInput.slice(0, 8),\n                scalar: `${model.singular}!`,\n                directives: [`@aws_subscribe(mutations: [\"delete${model.singular}\"])`, ...model?.directives?.getGQLDirectivesForAction('onDeleted')],\n            })\n        }\n\n        // onMutated\n        if (model?.directives.isActionEligibleForGQL('onMutated')) {\n            this.subscriptions.push({\n                name: `onMutated${model.singular}`,\n                comment: `Event triggered when a ${model.singular} record is either created, updated, or deleted.`,\n                args: model.gqlFields.whereUniqueInput.slice(0, 8),\n                scalar: `${model.singular}!`,\n                directives: [`@aws_subscribe(mutations: [\"create${model.singular}\", \"update${model.singular}\", \"upsert${model.singular}\", \"delete${model.singular}\"])`, ...model?.directives?.getGQLDirectivesForAction('onMutated')],\n            })\n        }\n\n        // onCreatedMany\n        if (model?.directives.isActionEligibleForGQL('onCreatedMany')) {\n            this.subscriptions.push({\n                name: `onCreatedMany${model.plural}`,\n                comment: `Event triggered when multiple new ${model.plural} records are created.`,\n                args: [],\n                scalar: 'BatchPayload!',\n                directives: [`@aws_subscribe(mutations: [\"createMany${model.plural}\"])`, ...model?.directives?.getGQLDirectivesForAction('onCreatedMany')],\n            })\n        }\n\n        // onUpdatedMany\n        if (model?.directives.isActionEligibleForGQL('onUpdatedMany')) {\n            this.subscriptions.push({\n                name: `onUpdatedMany${model.plural}`,\n                comment: `Event triggered when multiple existing ${model.plural} records are updated.`,\n                args: [],\n                scalar: 'BatchPayload!',\n                directives: [`@aws_subscribe(mutations: [\"updateMany${model.plural}\"])`, ...model?.directives?.getGQLDirectivesForAction('onUpdatedMany')],\n            })\n        }\n\n        // onDeletedMany\n        if (model?.directives.isActionEligibleForGQL('onDeletedMany')) {\n            this.subscriptions.push({\n                name: `onDeletedMany${model.plural}`,\n                comment: `Event triggered when multiple existing ${model.plural} records are deleted.`,\n                args: [],\n                scalar: 'BatchPayload!',\n                directives: [`@aws_subscribe(mutations: [\"deleteMany${model.plural}\"])`, ...model?.directives?.getGQLDirectivesForAction('onDeletedMany')],\n            })\n        }\n\n        // onMutatedMany\n        if (model?.directives.isActionEligibleForGQL('onMutatedMany')) {\n            this.subscriptions.push({\n                name: `onMutatedMany${model.plural}`,\n                comment: `Event triggered when multiple ${model.plural} records are either created, updated, or deleted.`,\n                args: [],\n                scalar: 'BatchPayload!',\n                directives: [`@aws_subscribe(mutations: [\"createMany${model.plural}\", \"updateMany${model.plural}\", \"deleteMany${model.plural}\"])`, ...model?.directives?.getGQLDirectivesForAction('onMutatedMany')],\n            })\n        }\n    }\n\n    private getFieldScalar(field: DMMF.Field, inject?: FieldScalarOptions) {\n        const isRequired = typeof inject?.required !== 'undefined'\n            ? inject.required\n            : (field.isRequired && !field.hasDefaultValue && !field.isUpdatedAt)\n        const isList = typeof inject?.list !== 'undefined'\n            ? inject.list\n            : field.isList\n\n        let type = 'String'\n\n        if (field.kind === 'scalar' && typeof field.type === 'string') {\n            const lowerType = field.type.toLocaleLowerCase()\n\n            if (lowerType === 'int')\n                type = 'Int'\n            else if (lowerType === 'datetime')\n                type = 'AWSDateTime'\n            else if (lowerType === 'date')\n                type = 'AWSDate'\n            else if (lowerType === 'json')\n                type = 'AWSJSON'\n            else if (lowerType === 'float')\n                type = 'Float'\n            else if (lowerType === 'boolean')\n                type = 'Boolean'\n            else if (lowerType === 'string')\n                type = 'String'\n\n            if (type === 'String') {\n                switch (field.name.toLocaleLowerCase()) {\n                    case 'email':\n                        type = 'AWSEmail'\n                        break\n                    case 'url':\n                        type = 'AWSURL'\n                        break\n                }\n            }\n        }\n\n        else if (field.kind === 'enum') {\n            type = field.type\n        }\n\n        else if (typeof field.type === 'string') {\n            type = pascalCase(field.type)\n        }\n\n        if (\n            inject?.scalar\n            && ['Int', 'AWSDateTime', 'AWSURL', 'AWSEmail', 'AWSDate', 'AWSJSON', 'Float', 'Boolean', 'String'].includes(inject.scalar)\n        )\n            type = [inject?.before || '', inject.scalar, inject?.after || ''].filter(Boolean).join('')\n\n        else if (inject?.scalar)\n            type = inject.scalar\n\n        else\n            type = [inject?.before || '', type, inject?.after || ''].filter(Boolean).join('')\n\n        const scalar = [\n            isList ? '[' : '',\n            type,\n            isList ? '!' : '',\n            isList ? ']' : '',\n            isRequired ? '!' : '',\n        ].filter(Boolean).join('')\n\n        return scalar\n    }\n\n    private async buildAppSyncSchema() {\n        const doc = [\n            this.buildTypes(),\n            this.buildEnums(),\n            this.buildInputs(),\n            this.buildQueries(),\n            this.buildMutations(),\n            this.buildSubscriptions(),\n        ].join('\\n\\n')\n\n        return await this.perttyGraphQL(doc)\n    }\n\n    private buildTypes() {\n        return this.types.map((t) => {\n            return [\n                `type ${t.name}${t?.directives?.length ? ` ${t.directives.join(' ')}` : ''} {`,\n                t.fields.map((f) => {\n                    const d = f?.directives ? ` ${f?.directives?.join(' ')}` : ''\n                    return `${f.name}: ${f.scalar}${d}`\n                }).join('\\n'),\n                '}',\n            ].join('\\n')\n        }).join('\\n\\n')\n    }\n\n    private buildEnums() {\n        return this.enums.map((e) => {\n            return [\n                `enum ${e.name} {`,\n                e.options.join('\\n'),\n                '}',\n            ].join('\\n')\n        }).join('\\n\\n')\n    }\n\n    private buildInputs() {\n        return uniqBy(this.inputs, 'name').map((i) => {\n            return [\n                `input ${i.name} {`,\n                i.fields.map((f) => {\n                    let defaultValue = ``\n                    if (f?.default && ['boolean', 'number'].includes(typeof f.default.value)) {\n                        defaultValue = ` = ${f.default?.value}`\n                    } else if (f?.default && ['string'].includes(typeof f.default.value)) {\n                        defaultValue = f.default.kind === 'enum'\n                            ? ` = ${String(f.default?.value)}`\n                            : ` = \"${String(f.default?.value).replace(/\"/g, \"\\\\\\\"\")}\"`\n                    }\n                    return `${f.name}: ${f.scalar}${defaultValue}`\n                }).join('\\n'),\n                '}',\n            ].join('\\n')\n        }).join('\\n\\n')\n    }\n\n    private buildQueries() {\n        return this.buildOperations(this.queries, 'Query')\n    }\n\n    private buildMutations() {\n        return this.buildOperations(this.mutations, 'Mutation')\n    }\n\n    private buildSubscriptions() {\n        return this.buildOperations(this.subscriptions, 'Subscription')\n    }\n\n    private buildOperations(operations, keyword) {\n        return operations?.length\n            ? [\n                `type ${keyword} {`,\n                operations.map(operation => this.formatOperation(operation)).join('\\n\\n'),\n                '}',\n                ].join('\\n')\n            : ''\n    }\n\n    private formatOperation(operation) {\n        const args = operation.args?.map(arg => `${arg.name}: ${arg.scalar}`) || []\n\n        return [\n            operation?.comment ? `\"\"\"\\n${operation.comment}\\n\"\"\"` : '',\n            [\n                operation.name,\n                args.length ? `(\\n${args.join(',\\n')}\\n)` : '',\n                `: ${operation.scalar}`,\n                operation?.directives?.join(' ') || '',\n            ].filter(Boolean).join(''),\n        ].filter(Boolean).join('\\n')\n    }\n}\n\ntype ParsedModel = {\n    singular: string\n    plural: string\n    fields: (DMMF.Field & { isWriteOnly: boolean })[]\n    gqlFields: {\n        operations: GqlField[]\n        whereInput: GqlField[]\n        whereUniqueInput: GqlField[]\n        extendedWhereUniqueInput: GqlField[]\n        scalarWhereInput: GqlField[]\n        uniqueComposites: {\n            name: string\n            scalar: string\n            fields: GqlField[]\n        }[]\n    }\n    directives: ModelDirectives\n    getScalar: (field: DMMF.Field, inject?: FieldScalarOptions) => string\n    documentation: string\n    defaultDirective: string\n}\n\ntype GqlField = {\n    name: string\n    scalar: string\n    default?: {\n        value: any\n        kind: DMMF.Field['kind']\n    }\n    directives?: string[]\n}\n\ntype GqlArg = {\n    name: string\n    scalar: string\n}\n\ntype GqlType = {\n    name: string\n    comment?: string\n    fields: GqlField[]\n    directives?: string[]\n}\n\ntype GqlInput = {\n    name: string\n    comment?: string\n    fields: GqlField[]\n}\n\ntype GqlEnum = {\n    name: string\n    comment?: string\n    options: string[]\n}\n\ntype GqlQuery = {\n    name: string\n    comment?: string\n    args: GqlArg[]\n    scalar: string\n    directives?: string[]\n}\n\ntype GqlMutation = {\n    name: string\n    comment?: string\n    args: GqlArg[]\n    scalar: string\n    directives?: string[]\n}\n\ntype GqlSubscription = {\n    name: string\n    comment?: string\n    args: GqlArg[]\n    scalar: string\n    directives: string[]\n}\n\ntype FieldScalarOptions = {\n    scalar?: string\n    before?: string\n    after?: string\n    required?: boolean\n    list?: boolean\n}\n"
  },
  {
    "path": "packages/generator/tsconfig.json",
    "content": "{\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n    \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/installer/package.json",
    "content": "{\n    \"name\": \"create-prisma-appsync-app\",\n    \"private\": true,\n    \"version\": \"1.0.2\",\n    \"author\": \"maoosi <hello@sylvainsimao.fr>\",\n    \"license\": \"BSD-2-Clause\",\n    \"bin\": \"./bin/index.js\",\n    \"devDependencies\": {\n        \"@types/degit\": \"^2.8.6\",\n        \"@types/prompts\": \"^2.4.9\",\n        \"degit\": \"^2.8.4\",\n        \"detect-package-manager\": \"^3.0.1\",\n        \"execa\": \"8.0.1\",\n        \"fs-jetpack\": \"^5.1.0\",\n        \"kolorist\": \"^1.8.0\",\n        \"prompts\": \"^2.4.2\"\n    }\n}\n"
  },
  {
    "path": "packages/installer/src/index.ts",
    "content": "#!/usr/bin/env node\n/* eslint-disable n/prefer-global/process */\nimport { Installer } from './installer'\n\nasync function main(): Promise<any> {\n    const installer = new Installer()\n    return await installer.start()\n}\n\nmain().catch((e) => {\n    console.error(e)\n    process.exit()\n})\n"
  },
  {
    "path": "packages/installer/src/installer.ts",
    "content": "import path from 'node:path'\nimport * as jetpack from 'fs-jetpack'\nimport prompts from 'prompts'\nimport degit from 'degit'\nimport { execa } from 'execa'\nimport { detect as detectPackageManager } from 'detect-package-manager'\nimport { bold, cyan, dim } from 'kolorist'\n\nexport class Installer {\n    private gitBranch: string\n    private installPackage: string\n    private cwd: string\n    private isContributorMode: boolean\n    private timestamp: number\n    private detected: {\n        projectName: string\n        rootPath: string\n        prismaSchemaPath: string | null\n        packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun'\n        tmpDirPath: string\n    }\n\n    private userChoices: {\n        projectDirectory: string\n        useExistingSchema: boolean\n        generateSchema: boolean\n        prismaSchemaPath: string | null\n        createLocalDevServer: boolean\n        useCdkBoilerplate: boolean\n    }\n\n    private installConfig: {\n        dependencies: { package: string; dev: boolean }[]\n        clones: { from: string; to: string; deleteSource?: boolean }[]\n        scripts: { name: string; cmd: string }[]\n        injects: { file: string; find: RegExp; replace: string }[]\n        shells: { cmd: string; dir: string; when: 'before' | 'after' }[]\n        recommendations: string[]\n    }\n\n    constructor() {\n        this.gitBranch = 'maoosi/prisma-appsync#main'\n        this.installPackage = 'prisma-appsync'\n\n        if (String(process.env?.COMPILE_MODE) === 'preview') {\n            this.gitBranch = 'maoosi/prisma-appsync#dev'\n            this.installPackage = 'prisma-appsync@preview'\n        }\n\n        if (['preview', 'contributor'].includes(String(process.env?.INSTALL_MODE))) {\n            this.gitBranch = 'maoosi/prisma-appsync#dev'\n            this.installPackage = 'prisma-appsync@preview'\n        }\n\n        this.cwd = process.cwd()\n        this.timestamp = new Date().getTime()\n        this.isContributorMode = String(process.env?.INSTALL_MODE) === 'contributor'\n        this.detected = {\n            projectName: '',\n            rootPath: this.cwd,\n            prismaSchemaPath: null,\n            packageManager: 'npm',\n            tmpDirPath: this.cwd,\n        }\n        this.userChoices = {\n            projectDirectory: '',\n            useExistingSchema: false,\n            generateSchema: false,\n            prismaSchemaPath: null,\n            createLocalDevServer: false,\n            useCdkBoilerplate: false,\n        }\n        this.installConfig = {\n            dependencies: [],\n            clones: [],\n            scripts: [],\n            injects: [],\n            shells: [],\n            recommendations: [],\n        }\n    }\n\n    public async start(): Promise<void> {\n        await this.printBranding()\n        await this.askQuestions()\n        await this.prepare()\n        await this.install()\n\n        if (!this.isContributorMode)\n            await this.printQuickstart()\n    }\n\n    private async printBranding(): Promise<void> {\n        let version = '> Undefined Version'\n\n        if (!this.isContributorMode) {\n            try {\n                const pkg = jetpack.read(path.join(__dirname, '../package.json'), 'json')\n                const detectedVersion = pkg?.version\n                version = `v${detectedVersion}`\n            }\n            catch { }\n        }\n        else {\n            version = '> Contributor Mode'\n        }\n\n        console.log()\n        console.log('    ___      _                             _               __                  ')\n        console.log('   / _ \\\\_ __(◭)___ _ __ ___   __ _        /_\\\\  _ __  _ __ / _\\\\_   _ _ __   ___ ')\n        console.log('  / /◭)/ \\'__| / __| \\'_ ` _ \\\\ / _` |_____ //◭\\\\\\\\| \\'_ \\\\| \\'_ \\\\\\\\ \\\\| | | | \\'_ \\\\ / __|')\n        console.log(' / ___/| |  | \\\\__ \\\\ | | | | | (◭| |_____/  _  \\\\ |◭) | |◭) |\\\\ \\\\ |_| | | | | (__ ')\n        console.log(' \\\\/    |_|  |_|___/_| |_| |_|\\\\__,_|     \\\\_/ \\\\_/ .__/| .__/\\\\__/\\\\__, |_| |_|\\\\___|')\n        console.log('                                              |_|   |_|       |___/            ')\n        console.log(`${bold('  ◭ Prisma-AppSync') + dim(' Installer')} ${cyan(version)}`)\n        console.log()\n    }\n\n    private async printQuickstart(): Promise<void> {\n        const devCmd = this.detected.packageManager === 'pnpm'\n            ? 'pnpm run dev'\n            : this.detected.packageManager === 'yarn'\n                ? 'yarn run dev'\n                : 'npm run dev'\n\n        console.log()\n        console.log(bold('  ◭ Prisma-AppSync Install Done!'))\n        console.log()\n        console.log(`  1. Run '${devCmd}'`)\n        console.log('  2. Enjoy!')\n        console.log()\n    }\n\n    private async askQuestions(): Promise<void> {\n        // project dir\n        if (!this.isContributorMode) {\n            this.userChoices.projectDirectory = (\n                await prompts({\n                    type: 'text',\n                    name: 'projectDirectory',\n                    message: 'Project directory (default: current dir)',\n                    initial: this.userChoices.projectDirectory,\n                })\n            ).projectDirectory.trim()\n        }\n\n        this.detected.projectName = String(path.join(this.cwd, this.userChoices.projectDirectory).split(/\\/|\\\\/).pop())\n        this.detected.rootPath = path.join(this.cwd, this.userChoices.projectDirectory)\n        this.detected.packageManager = await detectPackageManager({ cwd: this.cwd })\n        this.detected.prismaSchemaPath = jetpack.find(\n            this.detected.rootPath, { matching: '*.prisma', ignoreCase: true }\n        )?.[0] || null\n        this.detected.tmpDirPath = path.join(this.detected.rootPath, '.prisma-appsync')\n\n        // prisma schema\n        if (!this.isContributorMode) {\n            if (this.detected.prismaSchemaPath) {\n                this.userChoices.useExistingSchema = (\n                    await prompts({\n                        type: 'confirm',\n                        name: 'useExistingSchema',\n                        initial: true,\n                        message: `Use existing \\`${path.relative(this.cwd, this.detected.prismaSchemaPath)}\\` file?`,\n                    })\n                ).useExistingSchema\n\n                if (this.userChoices.useExistingSchema)\n                    this.userChoices.prismaSchemaPath = this.detected.prismaSchemaPath\n            }\n\n            if (!this.userChoices.useExistingSchema) {\n                this.userChoices.generateSchema = (\n                    await prompts({\n                        type: 'confirm',\n                        name: 'generateSchema',\n                        initial: true,\n                        message: 'Generate new `prisma/schema.prisma` file?',\n                    })\n                ).generateSchema\n\n                if (this.userChoices.generateSchema)\n                    this.userChoices.prismaSchemaPath = path.join(this.detected.rootPath, 'prisma/schema.prisma')\n            }\n        }\n        else {\n            this.userChoices.useExistingSchema = false\n            this.userChoices.generateSchema = true\n            this.userChoices.prismaSchemaPath = path.join(this.detected.rootPath, 'prisma/schema.prisma')\n        }\n\n        // cdk boilerplate\n        if (!this.isContributorMode) {\n            this.userChoices.useCdkBoilerplate = (\n                await prompts({\n                    type: 'confirm',\n                    name: 'useCdkBoilerplate',\n                    initial: true,\n                    message: 'Use provided CDK boilerplate to deploy on AWS?',\n                })\n            ).useCdkBoilerplate\n        }\n        else {\n            this.userChoices.useCdkBoilerplate = true\n        }\n\n        // local dev server\n        if (!this.isContributorMode) {\n            this.userChoices.createLocalDevServer = (\n                await prompts({\n                    type: 'confirm',\n                    name: 'createLocalDevServer',\n                    initial: true,\n                    message: 'Create local dev server?',\n                })\n            ).createLocalDevServer\n        }\n        else {\n            this.userChoices.createLocalDevServer = true\n        }\n    }\n\n    private async prepare(): Promise<void> {\n        const emitter = degit(this.gitBranch, { cache: false, force: true, verbose: true })\n        await emitter.clone(this.detected.tmpDirPath)\n\n        // core deps\n        if (!this.isContributorMode) {\n            this.installConfig.dependencies = [\n                ...this.installConfig.dependencies,\n                ...[\n                    { package: 'prisma', dev: true },\n                    { package: '@prisma/client', dev: true },\n                    { package: this.installPackage, dev: true },\n                ],\n            ]\n        }\n        else {\n            this.installConfig.dependencies = [\n                ...this.installConfig.dependencies,\n                ...[\n                    { package: 'prisma', dev: true },\n                    { package: '@prisma/client', dev: true },\n                ],\n            ]\n        }\n\n        // handler\n        if (!this.isContributorMode) {\n            this.installConfig.clones.push({\n                from: path.join(this.detected.tmpDirPath, 'packages/boilerplate/handler.ts'),\n                to: path.join(this.detected.rootPath, 'handler.ts'),\n            })\n        }\n        else {\n            this.installConfig.clones.push({\n                from: path.join(this.detected.rootPath, '../', 'packages/boilerplate/handler.ts'),\n                to: path.join(this.detected.rootPath, 'handler.ts'),\n            })\n            this.installConfig.clones.push({\n                from: path.join(this.detected.rootPath, '../', 'packages/boilerplate/tsconfig.json'),\n                to: path.join(this.detected.rootPath, 'tsconfig.json'),\n            })\n        }\n\n        // prisma schema\n        if (!this.isContributorMode && this.userChoices.prismaSchemaPath) {\n            if (this.userChoices.useExistingSchema) {\n                const schemaContent = await jetpack.readAsync(this.userChoices.prismaSchemaPath, 'utf8') || ''\n\n                if (!schemaContent.match(/generator\\s+appsync\\s+{/g)) {\n                    this.installConfig.injects.push({\n                        file: this.userChoices.prismaSchemaPath,\n                        find: /((?: )*generator\\s+client\\s+{[^}]*})/g,\n                        replace: '$1\\n\\ngenerator appsync {\\n\\tprovider = \"prisma-appsync\"\\n}',\n                    })\n                }\n\n                if (!schemaContent.match(/binaryTargets\\s*=\\s*\\[(.)*\\]/g)) {\n                    this.installConfig.injects.push({\n                        file: this.userChoices.prismaSchemaPath,\n                        find: /( *)provider\\s*=\\s*\"prisma-client-js\"(?:\\r|\\n)/g,\n                        replace: '$1provider = \"prisma-client-js\"\\n$1binaryTargets = [\"native\", \"rhel-openssl-1.0.x\"]\\n',\n                    })\n                }\n                else {\n                    this.installConfig.recommendations.push(\n                        'Make sure the `binaryTargets` inside your `schema.prisma` file include both \"native\" and \"rhel-openssl-1.0.x\"',\n                    )\n                }\n            }\n            else if (this.userChoices.generateSchema) {\n                this.installConfig.clones.push({\n                    from: path.join(this.detected.tmpDirPath, 'packages/boilerplate/prisma/sqlite.prisma'),\n                    to: this.userChoices.prismaSchemaPath,\n                })\n            }\n        }\n        else if (this.userChoices.prismaSchemaPath) {\n            this.installConfig.clones.push({\n                from: path.join(this.detected.rootPath, '../', 'packages/boilerplate/prisma/sqlite.prisma'),\n                to: this.userChoices.prismaSchemaPath,\n            })\n            this.installConfig.injects.push({\n                file: this.userChoices.prismaSchemaPath,\n                find: /((?: )*generator\\s+appsync\\s+{[^}]*})/g,\n                replace: 'generator appsync {\\n\\tprovider = \"../dist/generator.js\"\\n}',\n            })\n        }\n        this.installConfig.scripts.push({\n            name: 'generate',\n            cmd: 'npx prisma generate',\n        })\n\n        // local dev server\n        if (this.userChoices.createLocalDevServer && this.userChoices.prismaSchemaPath) {\n            this.installConfig.dependencies = [\n                ...this.installConfig.dependencies,\n                ...[\n                    { package: '@types/node', dev: true },\n                    { package: 'js-yaml', dev: true },\n                    { package: 'amplify-appsync-simulator', dev: true },\n                ],\n            ]\n\n            if (!this.isContributorMode) {\n                this.installConfig.clones.push({\n                    from: path.join(this.detected.tmpDirPath, 'packages/boilerplate/server/server.ts'),\n                    to: path.join(this.detected.rootPath, 'server.ts'),\n                })\n\n                const databaseUrl = 'file:local.sqlite'\n\n                const gqlSchemaPath = path.relative(\n                    path.join(this.detected.rootPath),\n                    path.join(path.dirname(this.userChoices.prismaSchemaPath), 'generated/prisma-appsync/schema.gql'),\n                )\n\n                const yamlResolversPath = path.relative(\n                    path.join(this.detected.rootPath),\n                    path.join(path.dirname(this.userChoices.prismaSchemaPath), 'generated/prisma-appsync/resolvers.yaml'),\n                )\n\n                const devCmd = [\n                    'npx prisma generate',\n                    `DATABASE_URL='${databaseUrl}' npx prisma db push --accept-data-loss`,\n                    `DATABASE_URL='${databaseUrl}' npx vite-node ./server.ts --watch -- --schema ${gqlSchemaPath} --resolvers ${yamlResolversPath} --watchers '[{\"watch\":[\"**/*.prisma\",\"*.prisma\"],\"exec\":\"npx prisma generate && DATABASE_URL='${databaseUrl}' npx prisma db push --accept-data-loss && touch ./server.ts\"},{\"watch\":[\"handler.ts\"],\"exec\":\"manual-restart\"}]'`,\n                ]\n\n                this.installConfig.scripts.push({\n                    name: 'dev',\n                    cmd: devCmd.join(' && '),\n                })\n            }\n            else {\n                this.installConfig.clones.push({\n                    from: path.join(this.detected.rootPath, '../', 'packages/boilerplate/server/server.ts'),\n                    to: path.join(this.detected.rootPath, 'server.ts'),\n                })\n\n                const databaseUrl = 'file:dev.sqlite'\n\n                const gqlSchemaPath = path.relative(\n                    path.join(this.detected.rootPath),\n                    path.join(path.dirname(this.userChoices.prismaSchemaPath), 'generated/prisma-appsync/schema.gql'),\n                )\n\n                const yamlResolversPath = path.relative(\n                    path.join(this.detected.rootPath),\n                    path.join(path.dirname(this.userChoices.prismaSchemaPath), 'generated/prisma-appsync/resolvers.yaml'),\n                )\n\n                const devCmd = [\n                    'npx prisma generate',\n                    `DATABASE_URL='${databaseUrl}' npx prisma db push --accept-data-loss`,\n                    `DATABASE_URL='${databaseUrl}' npx vite-node ./server.ts --watch -- --schema ${gqlSchemaPath} --resolvers ${yamlResolversPath} --watchers '[{\"watch\":\"../packages/(client|generator)/**\",\"exec\":\"cd ../ && pnpm run build --ignoreServer && cd playground && npx prisma generate && touch ./server.ts\"},{\"watch\":[\"**/*.prisma\",\"*.prisma\"],\"exec\":\"npx prisma generate && DATABASE_URL='${databaseUrl}' npx prisma db push --accept-data-loss && touch ./server.ts\"},{\"watch\":[\"handler.ts\"],\"exec\":\"manual-restart\"}]'`,\n                ]\n\n                this.installConfig.scripts.push({\n                    name: 'dev',\n                    cmd: devCmd.join(' && '),\n                })\n\n                this.installConfig.injects.push({\n                    file: path.join(this.detected.rootPath, 'server.ts'),\n                    find: /prisma-appsync\\/dist\\/server/g,\n                    replace: '../packages/server/src',\n                })\n            }\n        }\n\n        // package\n        if (!jetpack.exists(path.join(this.detected.rootPath, 'package.json'))) {\n            this.installConfig.shells.push({\n                cmd: `${this.detected.packageManager === 'pnpm' ? 'pnpm init' : `${this.detected.packageManager} init -y`}`,\n                dir: this.detected.rootPath,\n                when: 'before',\n            })\n        }\n\n        // cdk deps\n        if (this.userChoices.useCdkBoilerplate) {\n            if (!this.isContributorMode) {\n                this.installConfig.clones.push({\n                    from: path.join(this.detected.tmpDirPath, 'packages/boilerplate/cdk'),\n                    to: path.join(this.detected.rootPath, 'cdk'),\n                })\n                this.installConfig.injects.push({\n                    file: path.join(this.detected.rootPath, 'cdk/src/index.ts'),\n                    find: /nodeModules\\: \\[(.+)\\]/g,\n                    replace: 'nodeModules: [$1, \\'prisma-appsync\\']',\n                })\n                this.installConfig.clones.push({\n                    from: path.join(this.detected.tmpDirPath, 'packages/boilerplate/cdk.json'),\n                    to: path.join(this.detected.rootPath, 'cdk.json'),\n                })\n            }\n            else {\n                this.installConfig.clones.push({\n                    from: path.join(this.detected.rootPath, '../', 'packages/boilerplate/cdk'),\n                    to: path.join(this.detected.rootPath, 'cdk'),\n                })\n                this.installConfig.clones.push({\n                    from: path.join(this.detected.rootPath, '../', 'packages/boilerplate/cdk.json'),\n                    to: path.join(this.detected.rootPath, 'cdk.json'),\n                })\n            }\n\n            this.installConfig.shells.push({\n                cmd: `${this.detected.packageManager} install`,\n                dir: path.join(this.detected.rootPath, 'cdk'),\n                when: 'before',\n            })\n            this.installConfig.injects.push({\n                file: path.join(this.detected.rootPath, 'cdk/src/index.ts'),\n                find: /\\{\\{ projectName \\}\\}/g,\n                replace: this.detected.projectName,\n            })\n            this.installConfig.injects.push({\n                file: path.join(this.detected.rootPath, 'cdk/src/index.ts'),\n                find: /\\{\\{ relativeHandlerPath \\}\\}/g,\n                replace: path.relative(this.detected.rootPath, path.join(this.detected.rootPath, 'handler.ts')),\n            })\n            this.installConfig.scripts.push({\n                name: 'deploy',\n                cmd: 'cdk synth && cdk bootstrap && cdk deploy',\n            })\n\n            if (this.userChoices.prismaSchemaPath) {\n                this.installConfig.injects.push({\n                    file: path.join(this.detected.rootPath, 'cdk/src/index.ts'),\n                    find: /\\{\\{ relativeGqlSchemaPath \\}\\}/g,\n                    replace: path.relative(\n                        this.detected.rootPath,\n                        path.join(\n                            path.dirname(this.userChoices.prismaSchemaPath),\n                            'generated/prisma-appsync/schema.gql',\n                        ),\n                    ),\n                })\n                this.installConfig.injects.push({\n                    file: path.join(this.detected.rootPath, 'cdk/src/index.ts'),\n                    find: /\\{\\{ relativePrismaSchemaPath \\}\\}/g,\n                    replace: path.relative(this.detected.rootPath, this.userChoices.prismaSchemaPath),\n                })\n                this.installConfig.injects.push({\n                    file: path.join(this.detected.rootPath, 'cdk/src/index.ts'),\n                    find: /\\{\\{ relativeYmlResolversPath \\}\\}/g,\n                    replace: path.relative(\n                        this.detected.rootPath,\n                        path.join(\n                            path.dirname(this.userChoices.prismaSchemaPath),\n                            'generated/prisma-appsync/resolvers.yaml',\n                        ),\n                    ),\n                })\n            }\n        }\n\n        // prisma generate\n        if (this.userChoices.prismaSchemaPath) {\n            this.installConfig.shells.push({\n                cmd: 'npx prisma generate',\n                dir: this.detected.rootPath,\n                when: 'after',\n            })\n        }\n    }\n\n    private async install(): Promise<void> {\n        const add = this.detected.packageManager === 'npm' ? 'install' : 'add'\n        const saveDev = this.detected.packageManager === 'npm' ? '--save-dev' : '-D'\n\n        // clones\n        for (let j = 0; j < this.installConfig.clones.length; j++) {\n            const clone = this.installConfig.clones[j]\n\n            if (jetpack.exists(clone.to)) {\n                const parts = clone.to.split('/')\n                jetpack.rename(\n                    clone.to,\n                    [\n                        ...parts.splice(0, parts.length > 1 ? parts.length - 1 : 0),\n                        ...[`previous_${this.timestamp}_${parts[parts.length - 1]}`],\n                    ].join('/'),\n                )\n            }\n\n            jetpack.copy(clone.from, clone.to)\n\n            if (typeof clone.deleteSource === 'boolean' && clone.deleteSource === true)\n                jetpack.remove(clone.from)\n        }\n\n        // injects\n        for (let k = 0; k < this.installConfig.injects.length; k++) {\n            const inject = this.installConfig.injects[k]\n            this.replaceInFile(inject.file, inject.find, inject.replace)\n        }\n\n        // shells: before\n        const shellsBefore = this.installConfig.shells.filter(s => s.when === 'before')\n        for (let l = 0; l < shellsBefore.length; l++) {\n            const shell = shellsBefore[l]\n            const [baseCmd, ...execs] = shell.cmd.split(' ')\n\n            await execa(baseCmd, execs, {\n                stdio: 'inherit',\n                cwd: shell.dir,\n            })\n        }\n\n        // dependencies\n        const devDeps = this.installConfig.dependencies.filter(d => d.dev === true).map(d => d.package)\n        const deps = this.installConfig.dependencies.filter(d => d.dev !== true).map(d => d.package)\n\n        if (devDeps.length > 0) {\n            await execa(this.detected.packageManager, [add, ...devDeps, saveDev], {\n                stdio: 'inherit',\n                cwd: this.detected.rootPath,\n            })\n        }\n        if (deps.length > 0) {\n            await execa(this.detected.packageManager, [add, ...deps], {\n                stdio: 'inherit',\n                cwd: this.detected.rootPath,\n            })\n        }\n\n        // scripts\n        const pkg = jetpack.read(path.join(this.detected.rootPath, 'package.json'), 'json')\n\n        if (typeof pkg?.scripts === 'undefined')\n            pkg.scripts = {}\n\n        for (let m = 0; m < this.installConfig.scripts.length; m++) {\n            const script = this.installConfig.scripts[m]\n\n            if (typeof pkg?.scripts?.[script.name] !== 'undefined')\n                pkg.scripts[`previous:${this.timestamp}:${script.name}`] = pkg.scripts[script.name]\n\n            pkg.scripts[script.name] = script.cmd\n        }\n\n        jetpack.write(path.join(this.detected.rootPath, 'package.json'), pkg)\n\n        // shells: after\n        const shellsAfter = this.installConfig.shells.filter(s => s.when === 'after')\n        for (let l = 0; l < shellsAfter.length; l++) {\n            const shell = shellsAfter[l]\n            const [baseCmd, ...execs] = shell.cmd.split(' ')\n\n            await execa(baseCmd, execs, {\n                stdio: 'inherit',\n                cwd: shell.dir,\n            })\n        }\n\n        // recos\n        for (let n = 0; n < this.installConfig.recommendations.length; n++) {\n            const reco = this.installConfig.recommendations[n]\n            console.log(bold(cyan('  Note: ')) + reco + dim(' ...'))\n        }\n\n        // delete tmp dir\n        jetpack.remove(this.detected.tmpDirPath)\n    }\n\n    private replaceInFile(file: string, findRegex: RegExp, replace: string): void {\n        const content = jetpack.read(file, 'utf8') || ''\n        jetpack.write(file, content.replace(findRegex, replace))\n    }\n}\n\n// eslint-disable-next-line no-new\nnew Installer()\n"
  },
  {
    "path": "packages/installer/tsconfig.json",
    "content": "{\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n    \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/server/package.json",
    "content": "{\n    \"name\": \"prisma-appsync-server\",\n    \"version\": \"1.0.0\",\n    \"private\": true,\n    \"author\": \"maoosi <hello@sylvainsimao.fr>\",\n    \"license\": \"BSD-2-Clause\",\n    \"devDependencies\": {\n        \"amplify-appsync-simulator\": \"^2.4.1\",\n        \"chokidar\": \"^3.5.3\",\n        \"cleye\": \"^1.3.2\"\n    }\n}\n"
  },
  {
    "path": "packages/server/src/appsync-simulator.ts",
    "content": "/* eslint-disable no-console */\nimport { readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport { exec as nodeExec } from 'child_process'\nimport chokidar from 'chokidar'\nimport {\n    type AmplifyAppSyncAPIConfig,\n    AmplifyAppSyncSimulator,\n    AmplifyAppSyncSimulatorAuthenticationType,\n    type AmplifyAppSyncSimulatorConfig,\n    type AppSyncMockFile,\n    type AppSyncSimulatorDataSourceConfig,\n    RESOLVER_KIND,\n} from 'amplify-appsync-simulator'\n\ndeclare global {\n    // eslint-disable-next-line no-var, vars-on-top\n    var __prismaAppSyncServer: any\n}\n\nexport function useAppSyncSimulator({\n    lambdaHandler, schema, resolvers, port, wsPort, watchers, appSync, dataSources,\n}: ServerOptions) {\n    const mappingTemplates: AppSyncMockFile[] = [{\n        path: 'lambdaRequest.vtl',\n        content: readFileSync(resolve(__dirname, 'lambdaRequest.vtl'), 'utf8'),\n    }, {\n        path: 'lambdaResponse.vtl',\n        content: readFileSync(resolve(__dirname, 'lambdaResponse.vtl'), 'utf8'),\n    }]\n\n    const appSyncWithDefaults: AmplifyAppSyncAPIConfig = {\n        name: 'Prisma-AppSync',\n        defaultAuthenticationType: {\n            authenticationType: AmplifyAppSyncSimulatorAuthenticationType.API_KEY,\n        },\n        apiKey: 'da2-fakeApiId123456', // this is the default for graphiql\n        additionalAuthenticationProviders: [],\n    }\n\n    const simulatorConfig: AmplifyAppSyncSimulatorConfig = {\n        appSync: appSync || appSyncWithDefaults,\n        schema: { content: schema },\n        mappingTemplates,\n        dataSources: dataSources || [{\n            type: 'AWS_LAMBDA',\n            name: 'prisma-appsync',\n            invoke: lambdaHandler.main,\n        }],\n        resolvers: resolvers.map(resolver => ({\n            ...resolver,\n            dataSourceName: resolver.dataSource,\n            kind: RESOLVER_KIND.UNIT,\n            requestMappingTemplateLocation: 'lambdaRequest.vtl',\n            responseMappingTemplateLocation: 'lambdaResponse.vtl',\n        })),\n    }\n\n    globalThis?.__prismaAppSyncServer?.serverInstance?.stop()\n\n    const serverInstance = new AmplifyAppSyncSimulator({ port, wsPort })\n    const watcherInstances: any[] = globalThis?.__prismaAppSyncServer?.watcherInstances || []\n\n    if (watchers?.length && !globalThis?.__prismaAppSyncServer?.watcherInstances) {\n        const shell = (command: string): Promise<{ err: any; strdout: any; stderr: any }> =>\n            new Promise((resolve) => {\n                nodeExec(\n                    command,\n                    (err: any, strdout: any, stderr: any) => {\n                        if (err)\n                            console.error(stderr)\n                        else if (strdout)\n                            console.log(strdout)\n\n                        resolve({ err, strdout, stderr })\n                    },\n                )\n            })\n\n        watchers.forEach(({ watch, exec }) => {\n            const chok = chokidar.watch(watch, {\n                ignored: '**/node_modules/**',\n                ignoreInitial: true,\n                awaitWriteFinish: true,\n            })\n\n            chok.on('change', async (path) => {\n                if (exec === 'manual-restart') {\n                    console.log(`🚨 You need to manually restart the server to apply changes to ${path}`)\n                } else {\n                    console.log(`Change detected on ${path}`)\n                    console.log(`Executing ${exec}`)\n                    await shell(exec)\n                }\n            })\n\n            watcherInstances.push(chok)\n        })\n    }\n\n    globalThis.__prismaAppSyncServer = { serverInstance, watcherInstances }\n\n    return {\n        start: async () => {\n            await globalThis.__prismaAppSyncServer.serverInstance.start()\n            globalThis.__prismaAppSyncServer.serverInstance.init(simulatorConfig)\n        },\n        stop: () => {\n            globalThis.__prismaAppSyncServer.serverInstance.stop()\n        },\n    }\n}\n\nexport type ServerOptions = {\n    // required\n    schema: string\n    lambdaHandler: any\n    resolvers: {\n        typeName: string\n        fieldName: string\n        dataSource: string\n        requestMappingTemplate: string\n        responseMappingTemplate: string\n    }[]\n    port: number\n\n    // optional\n    wsPort?: number\n    watchers?: { watch: string | string[]; exec: string }[]\n\n    // advanced\n    appSync?: AmplifyAppSyncAPIConfig\n    dataSources?: AppSyncSimulatorDataSourceConfig[]\n}\n\nexport { AmplifyAppSyncSimulatorAuthenticationType as AuthenticationType }\n"
  },
  {
    "path": "packages/server/src/index.d.ts",
    "content": "export { createServer, argv } from './index'\n"
  },
  {
    "path": "packages/server/src/index.ts",
    "content": "/* eslint-disable n/prefer-global/process */\n/* eslint-disable no-console */\nimport { cli as cleye } from 'cleye'\nimport { type ServerOptions, useAppSyncSimulator } from './appsync-simulator'\n\n// npx vite-node ./server.ts --watch --\n//      --handler handler.ts\n//      --schema prisma/generated/prisma-appsync/schema.gql\n//      --resolvers prisma/generated/prisma-appsync/resolvers.yaml\n//      --port 4000\n//      --wsPort 4001\n//      --watchers '[{\"watch\":[\"**/*.prisma\",\"*.prisma\"],\"exec\":\"npx prisma generate && touch ./server.ts\"}]'\nexport const argv = cleye({\n    name: 'prisma-appsync-server',\n    flags: {\n        handler: {\n            type: String,\n            description: 'Lambda handler (.ts file)',\n            default: 'handler.ts',\n        },\n        schema: {\n            type: String,\n            description: 'GraphQL schema (.gql file)',\n            default: 'generated/prisma-appsync/schema.gql',\n        },\n        resolvers: {\n            type: String,\n            description: 'Resolvers (.yaml file)',\n            default: 'generated/prisma-appsync/resolvers.yaml',\n        },\n        port: {\n            type: Number,\n            description: 'HTTP server port',\n            default: 4000,\n        },\n        wsPort: {\n            type: Number,\n            description: 'WS server port',\n            default: 4001,\n        },\n        watchers: {\n            type: String,\n            description: 'Watchers config',\n            default: '',\n        },\n    },\n})\n\nexport async function createServer(serverOptions: ServerOptions): Promise<void> {\n    if (!process?.env?.DATABASE_URL)\n        throw new Error('Missing \"DATABASE_URL\" env var.')\n\n    if (!serverOptions?.lambdaHandler?.main)\n        throw new Error('Handler has no exported function \"main\".')\n\n    const simulator = useAppSyncSimulator(serverOptions)\n\n    await simulator.start()\n\n    console.log(`\\n🧩 GraphQL IDE: http://localhost:${serverOptions.port}`)\n    console.log(`🔌 API endpoint: http://localhost:${serverOptions.port}/graphql`)\n}\n\nexport * from './appsync-simulator'\n"
  },
  {
    "path": "packages/server/src/lambdaRequest.vtl",
    "content": "{\n    \"version\": \"2018-05-29\",\n    \"operation\": \"Invoke\",\n    \"payload\": $util.toJson($context)\n}"
  },
  {
    "path": "packages/server/src/lambdaResponse.vtl",
    "content": "#if($ctx.error)\n     $util.error($ctx.error.message, $ctx.error.type, $ctx.result)\n #end\n $util.toJson($ctx.result)"
  },
  {
    "path": "packages/server/tsconfig.json",
    "content": "{\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n    \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n    - \"packages/server\"\n    - \"packages/client\"\n    - \"packages/installer\"\n    - \"packages/generator\"\n"
  },
  {
    "path": "tests/client/adapter.test.ts",
    "content": "/* eslint-disable n/prefer-global/process */\nimport { describe, expect, test } from 'vitest'\nimport {\n    addNullables,\n    getAction,\n    getAuthIdentity,\n    getContext,\n    getFields,\n    getModel,\n    getOperation,\n    getPaths,\n    getPrismaArgs,\n    getType,\n} from '@client/adapter'\nimport type { Action, Authorization, Options } from '@client/types'\nimport { Actions, ActionsAliases, Authorizations } from '@client/consts'\nimport { Prisma } from '@prisma/client'\nimport { plural } from 'pluralize'\nimport flow from 'lodash/flow'\nimport camelCase from 'lodash/camelCase'\nimport upperFirst from 'lodash/upperFirst'\nimport mockLambdaEvent from './mocks/lambda-event'\nimport mockLambdaIdentity from './mocks/lambda-identity'\nimport { testEach } from './utils'\n\nconst pascalCase = flow(camelCase, upperFirst)\nconst models: {\n    [key: string]: {\n        prismaRef: string\n        singular: string\n        plural: string\n    }\n} = {\n    People: {\n        prismaRef: 'people',\n        singular: 'People',\n        plural: 'Peoples',\n    },\n}\n\nPrisma.dmmf.datamodel.models.forEach((m) => {\n    models[plural(pascalCase(m.name))] = {\n        prismaRef: m.name,\n        singular: pascalCase(m.name),\n        plural: pascalCase(plural(m.name)),\n    }\n    models[pascalCase(m.name)] = {\n        prismaRef: m.name,\n        singular: pascalCase(m.name),\n        plural: pascalCase(plural(m.name)),\n    }\n})\n\nprocess.env.PRISMA_APPSYNC_TESTING = 'true'\nprocess.env.PRISMA_APPSYNC_INJECTED_CONFIG = JSON.stringify({\n    modelsMapping: models,\n})\n\nconst TESTING: {\n    models: typeof models\n    options: Options\n} = {\n    models,\n    options: {\n        connectionString: 'xxx',\n        sanitize: true,\n        logLevel: 'INFO' as const,\n        defaultPagination: false,\n        maxDepth: 3,\n        maxReqPerUserMinute: 200,\n        fieldsMapping: {},\n        modelsMapping: models,\n    },\n}\n\nfunction mockAppSyncEvent(identity: NonNullable<Authorization>) {\n    return mockLambdaEvent({\n        request: {},\n        graphQLParams: {\n            query: 'query getPost { getPost { title } }',\n            variables: {},\n            operationName: 'getPost',\n            raw: {},\n        },\n        identity: mockLambdaIdentity(identity, {\n            sourceIp: 'xxx.xxx.xxx.xxx',\n            username: 'johndoe',\n            sub: 'xxxxxx',\n            resolverContext: {},\n        }),\n    })?.[0] || {}\n}\n\ndescribe('CLIENT #adapter', () => {\n    describe('.getAuthIdentity?', () => {\n        test('expect to detect API_KEY authorization', () => {\n            const result = getAuthIdentity({\n                appsyncEvent: mockAppSyncEvent(Authorizations.API_KEY),\n            })\n            expect(result.authorization).toEqual(Authorizations.API_KEY)\n        })\n\n        test('expect to detect AWS_LAMBDA authorization', () => {\n            const result = getAuthIdentity({\n                appsyncEvent: mockAppSyncEvent(Authorizations.AWS_LAMBDA),\n            })\n            expect(result.authorization).toEqual(Authorizations.AWS_LAMBDA)\n        })\n\n        test('expect to detect AWS_IAM authorization', () => {\n            const result = getAuthIdentity({\n                appsyncEvent: mockAppSyncEvent(Authorizations.AWS_IAM),\n            })\n            expect(result.authorization).toEqual(Authorizations.AWS_IAM)\n        })\n\n        test('expect to detect AMAZON_COGNITO_USER_POOLS authorization', () => {\n            const result = getAuthIdentity({\n                appsyncEvent: mockAppSyncEvent(Authorizations.AMAZON_COGNITO_USER_POOLS),\n            })\n            expect(result.authorization).toEqual(Authorizations.AMAZON_COGNITO_USER_POOLS)\n        })\n\n        test('expect to detect OPENID_CONNECT authorization', () => {\n            const result = getAuthIdentity({\n                appsyncEvent: mockAppSyncEvent(Authorizations.OPENID_CONNECT),\n            })\n            expect(result.authorization).toEqual(Authorizations.OPENID_CONNECT)\n        })\n\n        test('expect to throw when no matching authorization', () => {\n            expect(() =>\n                getAuthIdentity({\n                    appsyncEvent: { identity: 'string' } as any,\n                }),\n            ).toThrow(Error)\n        })\n    })\n\n    describe('.getOperation?', () => {\n        const cases = Object.values(Actions).map((action: Action) => {\n            return [`${action}People`, `${action}People`]\n        })\n        testEach(cases)('when fieldName is \"{0}\", expect operation to equal \"{1}\"', (fieldName, expected) => {\n            const result = getOperation({ fieldName })\n            expect(result).toEqual(expected)\n        })\n    })\n\n    describe('.getAction?', () => {\n        const cases = Object.values(Actions).map((action: Action) => {\n            return [`${action}People`, action]\n        })\n        testEach(cases)('when operation is \"{0}\", expect action to equal \"{1}\"', (operation: any, expected) => {\n            const result = getAction({ operation })\n            expect(result).toEqual(expected)\n        })\n    })\n\n    describe('.getModel?', () => {\n        const cases = Object.values(Actions).map((action: Action) => {\n            return [action, models.People]\n        })\n        testEach(cases)('when operation is \"{0}People\", expect model to equal \"{1}\"', (action: Action, expected) => {\n            const result = getModel({ operation: `${action}People`, action, options: TESTING.options })\n            expect(result).toEqual(expected)\n        })\n    })\n\n    describe('.getContext?', () => {\n        test('expect to extract context from custom resolver', () => {\n            const context = getContext({\n                customResolvers: {\n                    notify: async () => {\n                        return { message: 'Hello world' }\n                    },\n                },\n                options: TESTING.options,\n                operation: 'notify',\n            })\n            expect(context).toEqual({\n                action: 'notify',\n                alias: 'custom',\n                model: null,\n            })\n        })\n    })\n\n    describe('.getFields?', () => {\n        test('expect to extract all first level fields', () => {\n            const result = getFields({\n                _selectionSetList: [\n                    '__typename',\n                    'title',\n                    'description',\n                    'author',\n                    'author/username',\n                    'author/email',\n                    'author/comments',\n                    'author/comments/text',\n                    'author/comments/likes',\n                    'author/comments/likes/user',\n                    'author/comments/likes/user/username',\n                ],\n            })\n            expect(result).toEqual(['title', 'description', 'author'])\n        })\n    })\n\n    describe('.getType?', () => {\n        test('expect type to equal \"Query\"', () => {\n            const result = getType({ _parentTypeName: 'Query' })\n            expect(result).toEqual('Query')\n        })\n        test('expect type to equal \"Mutation\"', () => {\n            const result = getType({ _parentTypeName: 'Mutation' })\n            expect(result).toEqual('Mutation')\n        })\n        test('expect type to equal \"Subscription\"', () => {\n            const result = getType({ _parentTypeName: 'Subscription' })\n            expect(result).toEqual('Subscription')\n        })\n        test('when wrong _parentTypeName field, expect to throw Error()', () => {\n            expect(() => getType({ _parentTypeName: 'User' })).toThrow(Error)\n        })\n    })\n\n    describe('.getPrismaArgs?', () => {\n        test('expect selectionSetList to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.get,\n                _arguments: {},\n                _selectionSetList: ['title', 'createdAt', 'status'],\n                defaultPagination: false,\n            })\n            expect(result).toStrictEqual({\n                select: {\n                    title: true,\n                    createdAt: true,\n                    status: true,\n                },\n            })\n        })\n        test('expect nested selectionSetList to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.list,\n                _arguments: {},\n                _selectionSetList: [\n                    'title',\n                    'createdAt',\n                    'comments',\n                    'comments/post',\n                    'comments/author',\n                    'comments/author/email',\n                ],\n                defaultPagination: false,\n            })\n            expect(result).toEqual({\n                select: {\n                    title: true,\n                    createdAt: true,\n                    comments: {\n                        select: {\n                            post: true,\n                            author: {\n                                select: {\n                                    email: true,\n                                },\n                            },\n                        },\n                    },\n                },\n            })\n        })\n        test('expect \"where\" to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.count,\n                _arguments: {\n                    where: { title: { startsWith: 'Hello' } },\n                },\n                _selectionSetList: [],\n                defaultPagination: false,\n            })\n            expect(result).toStrictEqual({\n                where: { title: { startsWith: 'Hello' } },\n            })\n        })\n        test('expect \"data\" to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.create,\n                _arguments: {\n                    data: { title: 'Hello', content: 'World' },\n                },\n                _selectionSetList: [],\n                defaultPagination: false,\n            })\n            expect(result).toStrictEqual({\n                data: { title: 'Hello', content: 'World' },\n            })\n        })\n        test('expect \"orderBy\" to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.list,\n                _arguments: {\n                    orderBy: [{ title: 'ASC' }, { postedAt: 'DESC' }],\n                },\n                _selectionSetList: [],\n                defaultPagination: false,\n            })\n            expect(result).toStrictEqual({\n                orderBy: [{ title: 'asc' }, { postedAt: 'desc' }],\n            })\n        })\n        test('expect \"orderBy\" to throw an error when using wrong format', () => {\n            expect(() =>\n                getPrismaArgs({\n                    action: Actions.list,\n                    _arguments: {\n                        orderBy: [{ title: 'ASC', content: 'DESC' }, { postedAt: 'DESC' }],\n                    },\n                    _selectionSetList: [],\n                    defaultPagination: false,\n                }),\n            ).toThrow(Error)\n        })\n        test('expect \"skip\" to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.list,\n                _arguments: { skip: '5' },\n                _selectionSetList: [],\n                defaultPagination: false,\n            })\n            expect(result).toStrictEqual({ skip: 5 })\n        })\n        test('expect \"take\" to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.list,\n                _arguments: { take: '3' },\n                _selectionSetList: [],\n                defaultPagination: false,\n            })\n            expect(result).toStrictEqual({ take: 3 })\n        })\n        test('expect \"skipDuplicates\" to be converted to prisma syntax', () => {\n            const result = getPrismaArgs({\n                action: Actions.list,\n                _arguments: { skipDuplicates: true },\n                _selectionSetList: [],\n                defaultPagination: false,\n            })\n            expect(result).toStrictEqual({ skipDuplicates: true })\n        })\n        test('expect default pagination to do nothing when \"take\" is specified', () => {\n            const result = getPrismaArgs({\n                defaultPagination: 50,\n                action: Actions.list,\n                _arguments: { take: '3' },\n                _selectionSetList: [],\n            })\n            expect(result).toStrictEqual({ skip: 0, take: 3 })\n        })\n        test('expect default pagination to apply default take value', () => {\n            const result = getPrismaArgs({\n                defaultPagination: 50,\n                action: Actions.list,\n                _arguments: {},\n                _selectionSetList: [],\n            })\n            expect(result).toStrictEqual({ skip: 0, take: 50 })\n        })\n    })\n\n    describe('.getPaths?', () => {\n        test('expect nested get to return matching paths', () => {\n            const result = getPaths({\n                operation: 'getPost',\n                context: {\n                    action: Actions.get,\n                    alias: ActionsAliases.access,\n                    model: TESTING.models.Post,\n                },\n                prismaArgs: getPrismaArgs({\n                    action: Actions.get,\n                    _selectionSetList: [\n                        '__typename',\n                        'title',\n                        'comment',\n                        'comment/content',\n                        'comment/author',\n                        'comment/author/email',\n                        'comment/author/username',\n                        'comment/author/badges',\n                        'comment/author/badges/label',\n                        'comment/author/badges/owners',\n                        'comment/author/badges/owners/email',\n                    ],\n                    _arguments: {},\n                    defaultPagination: false,\n                }),\n            })\n            expect(result).toEqual([\n                'getPost',\n                'getPost/title',\n                'getPost/comment',\n                'getPost/comment/content',\n                'getPost/comment/author',\n                'getPost/comment/author/email',\n                'getPost/comment/author/username',\n                'getPost/comment/author/badges',\n                'getPost/comment/author/badges/label',\n                'getPost/comment/author/badges/owners',\n                'getPost/comment/author/badges/owners/email',\n            ])\n        })\n\n        test('expect count to return matching paths', () => {\n            const result = getPaths({\n                operation: 'countPosts',\n                context: {\n                    action: Actions.count,\n                    alias: ActionsAliases.access,\n                    model: TESTING.models.Post,\n                },\n                prismaArgs: getPrismaArgs({\n                    action: Actions.count,\n                    _selectionSetList: [],\n                    _arguments: {},\n                    defaultPagination: false,\n                }),\n            })\n            expect(result).toEqual([\n                'countPosts',\n            ])\n        })\n\n        test('expect nested update to return matching paths', () => {\n            const args = {\n                data: {\n                    title: 'New title',\n                    author: {\n                        connect: {\n                            username: 'other user',\n                        },\n                    },\n                },\n            }\n            const result = getPaths({\n                operation: 'updatePost',\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.models.Post,\n                },\n                prismaArgs: getPrismaArgs({\n                    action: Actions.update,\n                    _selectionSetList: [\n                        '__typename',\n                        'title',\n                        'comment',\n                        'comment/content',\n                        'comment/author',\n                        'comment/author/email',\n                        'comment/author/username',\n                        'comment/author/badges',\n                        'comment/author/badges/label',\n                        'comment/author/badges/owners',\n                        'comment/author/badges/owners/email',\n                    ],\n                    _arguments: args,\n                    defaultPagination: false,\n                }),\n            })\n            expect(result).toEqual([\n                'updatePost',\n                'updatePost/title',\n                'updatePost/author',\n                'updatePost/author/connect',\n                'updatePost/author/connect/username',\n                'getPost',\n                'getPost/title',\n                'getPost/comment',\n                'getPost/comment/content',\n                'getPost/comment/author',\n                'getPost/comment/author/email',\n                'getPost/comment/author/username',\n                'getPost/comment/author/badges',\n                'getPost/comment/author/badges/label',\n                'getPost/comment/author/badges/owners',\n                'getPost/comment/author/badges/owners/email',\n            ])\n        })\n\n        test('expect nested createMany to return matching paths', () => {\n            const args = {\n                data: [\n                    {\n                        title: 'First title of many',\n                        author: {\n                            connect: {\n                                username: 'johndoe',\n                            },\n                        },\n                    },\n                ],\n            }\n            const result = getPaths({\n                operation: 'createManyPosts',\n                context: {\n                    action: Actions.createMany,\n                    alias: ActionsAliases.batchCreate,\n                    model: TESTING.models.Post,\n                },\n                prismaArgs: getPrismaArgs({\n                    action: Actions.createMany,\n                    _arguments: args,\n                    _selectionSetList: [\n                        '__typename',\n                        'title',\n                        'comment',\n                        'comment/content',\n                        'comment/author',\n                        'comment/author/email',\n                        'comment/author/username',\n                        'comment/author/badges',\n                        'comment/author/badges/label',\n                        'comment/author/badges/owners',\n                        'comment/author/badges/owners/email',\n                    ],\n                    defaultPagination: false,\n                }),\n            })\n            expect(result).toEqual([\n                'createManyPosts',\n                'createManyPosts/title',\n                'createManyPosts/author',\n                'createManyPosts/author/connect',\n                'createManyPosts/author/connect/username',\n                'listPosts',\n                'listPosts/title',\n                'listPosts/comment',\n                'listPosts/comment/content',\n                'listPosts/comment/author',\n                'listPosts/comment/author/email',\n                'listPosts/comment/author/username',\n                'listPosts/comment/author/badges',\n                'listPosts/comment/author/badges/label',\n                'listPosts/comment/author/badges/owners',\n                'listPosts/comment/author/badges/owners/email',\n            ])\n        })\n\n        test('expect custom resolver notify to return matching paths', () => {\n            const resolver = 'notify'\n            const result = getPaths({\n                operation: resolver,\n                context: {\n                    action: resolver,\n                    alias: 'custom',\n                    model: null,\n                },\n                prismaArgs: getPrismaArgs({\n                    action: resolver,\n                    _arguments: {\n                        message: 'Hello World',\n                    },\n                    _selectionSetList: ['__typename', 'message'],\n                    defaultPagination: false,\n                }),\n            })\n            expect(result).toEqual(['notify', 'notify/message'])\n        })\n    })\n\n    describe('.addNullables?', () => {\n        test('expect addNullables to convert is, isNot and isNull inputs', async () => {\n            const result = await addNullables({\n                post: { is: 'NULL' },\n                user: { isNot: 'NULL' },\n                comment: { isNull: true },\n                blog: { isNull: false },\n            })\n            expect(result).toEqual({\n                post: { is: null },\n                user: { isNot: null },\n                comment: { equals: null },\n                blog: { not: null },\n            })\n        })\n    })\n})\n"
  },
  {
    "path": "tests/client/core.test.ts",
    "content": "/* eslint-disable n/prefer-global/process */\n/* eslint-disable no-new */\nimport { describe, expect, test } from 'vitest'\nimport { PrismaAppSync } from '@client'\nimport { Actions, ActionsAliases, Authorizations } from '@client/consts'\nimport mockLambdaEvent from './mocks/lambda-event'\nimport mockLambdaIdentity from './mocks/lambda-identity'\n\nprocess.env.PRISMA_APPSYNC_TESTING = 'true'\nprocess.env.PRISMA_APPSYNC_INJECTED_CONFIG = JSON.stringify({\n    modelsMapping: {\n        Posts: {\n            prismaRef: 'post',\n            singular: 'Post',\n            plural: 'Posts',\n        },\n        Post: {\n            prismaRef: 'post',\n            singular: 'Post',\n            plural: 'Posts',\n        },\n    },\n})\n\nconst TESTING = {\n    PostModel: {\n        prismaRef: 'post',\n        singular: 'Post',\n        plural: 'Posts',\n    },\n}\n\nfunction mockAppSyncEvent(operationName: string, query: string) {\n    return mockLambdaEvent({\n        request: {\n            headers: {\n                'x-fingerprint': 'fingerprint:abcdef',\n            },\n        },\n        identity: mockLambdaIdentity(Authorizations.API_KEY),\n        graphQLParams: {\n            operationName,\n            query,\n        },\n    })?.[0] || {}\n}\n\ndescribe('CLIENT #core', () => {\n    describe('.connectionString?', () => {\n        test('expect Connection String to be configurable via Class options', () => {\n            const connectionString = `postgres://${(+new Date()).toString(36).slice(-5)}`\n            new PrismaAppSync({ connectionString })\n            expect(process.env.DATABASE_URL).toEqual(connectionString)\n        })\n        test('expect Connection String to be configurable via DATABASE_URL env var', () => {\n            process.env.DATABASE_URL = `postgres://${(+new Date()).toString(36).slice(-5)}`\n            const prismaAppSync = new PrismaAppSync()\n            expect(prismaAppSync.options.connectionString).toEqual(process.env.DATABASE_URL)\n        })\n    })\n\n    describe('.sanitize?', () => {\n        test('expect Sanitize to be TRUE by default', () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            expect(prismaAppSync.options.sanitize).toEqual(true)\n        })\n        test('expect Sanitize to be configurable via Class options', () => {\n            const prismaAppSync = new PrismaAppSync({\n                sanitize: false,\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            expect(prismaAppSync.options.sanitize).toEqual(false)\n        })\n        test('expect Sanitizer to sanitize inputs', async () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            const event = mockAppSyncEvent(\n                'createPost',\n                `query createPost {\n                    createPost(\n                        data: {\n                            title: \"<IMG SRC=\\\\\"javascript:alert('XSS');\\\\\">\"\n                        }\n                    ) {\n                        title\n                    }\n                }`,\n            )\n            const result = await prismaAppSync.resolve({ event })\n            const maliciousXss = result?.__prismaAppsync?.QueryParams?.prismaArgs?.data?.title\n            expect(maliciousXss).toEqual('&lt;img src&gt;')\n        })\n        test('expect Sanitizer to sanitize array inputs', async () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE'\n            })\n            const event = mockAppSyncEvent(\n                'updatePosts',\n                `query updatePosts {\n                    updatePosts(\n                        data: {\n                            pins: [\n                                { title: \"<IMG SRC=\\\\\"javascript:alert('XSS');\\\\\">\", order: 1 }\n                                { title: \"<IMG SRC=\\\\\"javascript:alert('XSS');\\\\\">\", order: 3 }\n                            ]\n                        }\n                    ) {\n                        title\n                    }\n                }`,\n            )\n            const result = await prismaAppSync.resolve({ event })\n            const maliciousXss = result?.__prismaAppsync?.QueryParams?.prismaArgs?.data?.pins\n            expect(maliciousXss).toEqual([\n                { title: '&lt;img src&gt;', order: 1 },\n                { title: '&lt;img src&gt;', order: 3 },\n            ])\n        })\n        test('expect Sanitizer to _not_ sanitize inputs', async () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n                sanitize: false,\n            })\n            const event = mockAppSyncEvent(\n                'createPost',\n                `query createPost {\n                    createPost(\n                        data: {\n                            title: \"<IMG SRC=\\\\\"javascript:alert('XSS');\\\\\">\"\n                        }\n                    ) {\n                        title\n                    }\n                }`,\n            )\n            const result = await prismaAppSync.resolve({ event })\n            const maliciousXss = result?.__prismaAppsync?.QueryParams?.prismaArgs?.data?.title\n            expect(maliciousXss).toEqual('<IMG SRC=\"javascript:alert(\\'XSS\\');\">')\n        })\n        test('expect outputs to be de-sanitize automatically', async () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            const event = mockAppSyncEvent(\n                'createPost',\n                `query createPost {\n                    createPost(\n                        data: {\n                            title: \"<IMG SRC=\\\\\"javascript:alert('XSS');\\\\\">\"\n                        }\n                    ) {\n                        title\n                    }\n                }`,\n            )\n            const result = await prismaAppSync.resolve({ event })\n            expect(result?.title).toEqual('<img src>')\n        })\n    })\n\n    describe('.logLevel?', () => {\n        test('expect Logging Level to be INFO by default', () => {\n            new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            expect(process.env.PRISMA_APPSYNC_LOG_LEVEL).toEqual('INFO')\n        })\n        test('expect Logging Level to be configurable via Class options', () => {\n            new PrismaAppSync({ connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE', logLevel: 'WARN' })\n            expect(process.env.PRISMA_APPSYNC_LOG_LEVEL).toEqual('WARN')\n        })\n    })\n\n    describe('.defaultPagination?', () => {\n        test('expect Pagination to equal 50 by default', () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            expect(prismaAppSync.options.defaultPagination).toEqual(50)\n        })\n        test('expect Pagination to be configurable via Class options', () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n                defaultPagination: 13,\n            })\n            expect(prismaAppSync.options.defaultPagination).toEqual(13)\n        })\n    })\n\n    describe('.maxDepth?', () => {\n        test('expect Max Query Depth to equal 4 by default', () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            expect(prismaAppSync.options.maxDepth).toEqual(4)\n        })\n        test('expect Max Query Depth to be configurable via Class options', () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n                maxDepth: 5,\n            })\n            expect(prismaAppSync.options.maxDepth).toEqual(5)\n        })\n    })\n\n    describe('.resolve?', () => {\n        test('expect Resolve to return matching Query Params', async () => {\n            const prismaAppSync = new PrismaAppSync({\n                connectionString: 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE',\n            })\n            const result = await prismaAppSync.resolve({\n                event: mockAppSyncEvent(\n                    'getPost',\n                    `query getPost {\n                        getPost(where: {\n                            title: { not: { equals: \"Foo\" } }\n                        }) { \n                            title\n                            author {\n                                username\n                            }\n                        }\n                    }`,\n                ),\n            })\n            expect(result?.__prismaAppsync?.QueryParams).toEqual({\n                args: {\n                    where: {\n                        title: { not: { equals: 'Foo' } },\n                    },\n                },\n                authorization: Authorizations.API_KEY,\n                context: {\n                    action: Actions.get,\n                    alias: ActionsAliases.access,\n                    model: TESTING.PostModel,\n                },\n                fields: ['title', 'author/username'],\n                identity: {},\n                operation: 'getPost',\n                paths: ['getPost', 'getPost/title', 'getPost/author', 'getPost/author/username'],\n                prismaArgs: {\n                    where: {\n                        title: { not: { equals: 'Foo' } },\n                    },\n                    select: {\n                        title: true,\n                        author: {\n                            select: { username: true },\n                        },\n                    },\n                },\n                type: 'Query',\n                headers: {\n                    'x-fingerprint': 'fingerprint:abcdef',\n                },\n            })\n        })\n    })\n})\n"
  },
  {
    "path": "tests/client/guard.test.ts",
    "content": "/* eslint-disable n/prefer-global/process */\nimport { describe, expect, test } from 'vitest'\nimport { getDepth, getShieldAuthorization, runHooks } from '@client/guard'\nimport { Actions, ActionsAliases, Authorizations } from '@client/consts'\nimport { PrismaClient } from '@prisma/client'\n\nprocess.env.DATABASE_URL = 'postgresql://USER:PASSWORD@HOST:PORT/DATABASE'\nprocess.env.PRISMA_APPSYNC_TESTING = 'true'\n\nconst TESTING = {\n    PostModel: {\n        prismaRef: 'post',\n        singular: 'Post',\n        plural: 'Posts',\n    },\n}\n\ndescribe('CLIENT #guard', () => {\n    describe('.getShieldAuthorization?', () => {\n        test('expect query to be _denied_ by default', async () => {\n            const authorization = await getShieldAuthorization({\n                shield: { '**': false },\n                paths: ['updatePost', 'updatePost/title'],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n            })\n\n            expect(authorization).toEqual({\n                canAccess: false,\n                reason: 'Matcher: **',\n                matcher: '**',\n                globPattern: '**',\n                prismaFilter: {},\n            })\n        })\n\n        test('expect query to be _denied_ when ** is false', async () => {\n            const authorization = await getShieldAuthorization({\n                shield: { '**': false },\n                paths: ['updatePost', 'updatePost/title'],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n            })\n\n            expect(authorization).toEqual({\n                canAccess: false,\n                reason: 'Matcher: **',\n                matcher: '**',\n                globPattern: '**',\n                prismaFilter: {},\n            })\n        })\n\n        test('expect query to be _allowed_ when ** is true', async () => {\n            const authorization = await getShieldAuthorization({\n                shield: { '**': true },\n                paths: ['updatePost', 'updatePost/title'],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n            })\n\n            expect(authorization).toEqual({\n                canAccess: true,\n                reason: 'Matcher: **',\n                matcher: '**',\n                globPattern: '**',\n                prismaFilter: {},\n            })\n        })\n\n        test('expect query to be _denied_ when custom rule overrides **', async () => {\n            const authorization = await getShieldAuthorization({\n                shield: {\n                    '**': true,\n                    'update{Post,Comment,User}{,/**}': {\n                        rule: false,\n                        reason: ({ model }) => `${model} can only be modified by its owner.`,\n                    },\n                },\n                paths: ['updatePost/title'],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n            })\n\n            expect(authorization).toEqual({\n                canAccess: false,\n                reason: 'Post can only be modified by its owner.',\n                matcher: 'update{Post,Comment,User}{,/**}',\n                globPattern: 'update{Post,Comment,User}{,/**}',\n                prismaFilter: {},\n            })\n        })\n\n        test('expect query to be _allowed_ when custom rule overrides **', async () => {\n            const authorization = await getShieldAuthorization({\n                shield: {\n                    '**': false,\n                    'updateMany{Posts,Comments,Users}{,/**}': { rule: true },\n                },\n                paths: ['updateManyPosts', 'updateManyPosts/title'],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n            })\n\n            expect(authorization).toEqual({\n                canAccess: true,\n                reason: 'Matcher: updateMany{Posts,Comments,Users}{,/**}',\n                matcher: 'updateMany{Posts,Comments,Users}{,/**}',\n                globPattern: 'updateMany{Posts,Comments,Users}{,/**}',\n                prismaFilter: {},\n            })\n        })\n\n        test('expect query to be a _prismaFilter_ when rule is an object', async () => {\n            const isOwner = { owner: { cognitoSub: 'xxx' } }\n\n            const authorization = await getShieldAuthorization({\n                shield: {\n                    '**': false,\n                    'update{Post,Comment,User}{,/**}': { rule: isOwner },\n                },\n                paths: ['updatePost', 'updatePost/title'],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n            })\n\n            expect(authorization).toEqual({\n                canAccess: true,\n                reason: 'Matcher: update{Post,Comment,User}{,/**}',\n                matcher: 'update{Post,Comment,User}{,/**}',\n                globPattern: 'update{Post,Comment,User}{,/**}',\n                prismaFilter: isOwner,\n            })\n        })\n    })\n\n    describe('.runHooks?', () => {\n        test('expect \"before:updatePost\" to run _before_ \"updatePost\"', async () => {\n            const hookResponse = await runHooks({\n                when: 'before',\n                hooks: {\n                    'before:updatePost': async (data) => {\n                        data.test = 'before:updatePost'\n                        return data\n                    },\n                },\n                prismaClient: new PrismaClient(),\n                QueryParams: {\n                    headers: {},\n                    args: {\n                        where: { id: 1 },\n                        data: { title: 'New title' },\n                    },\n                    authorization: Authorizations.API_KEY,\n                    context: {\n                        action: Actions.update,\n                        alias: ActionsAliases.modify,\n                        model: TESTING.PostModel,\n                    },\n                    fields: ['title'],\n                    identity: {},\n                    operation: 'updatePost',\n                    paths: ['updatePost', 'updatePost/title', 'getPost', 'getPost/title'],\n                    prismaArgs: {\n                        where: { id: 1 },\n                        data: { title: 'New title' },\n                        select: { title: true },\n                    },\n                    type: 'Mutation',\n                },\n            })\n\n            expect(hookResponse.test).toEqual('before:updatePost')\n        })\n\n        test('expect \"after:updatePost\" to run _after_ \"updatePost\" and modify result', async () => {\n            const hookResponse = await runHooks({\n                when: 'after',\n                hooks: {\n                    'after:updatePost': async (params) => {\n                        return { ...params, result: 'after:updatePost' }\n                    },\n                },\n                prismaClient: new PrismaClient(),\n                QueryParams: {\n                    headers: {},\n                    args: {\n                        where: { id: 1 },\n                        data: { title: 'New title' },\n                    },\n                    authorization: Authorizations.API_KEY,\n                    context: {\n                        action: Actions.update,\n                        alias: ActionsAliases.modify,\n                        model: TESTING.PostModel,\n                    },\n                    fields: ['title'],\n                    identity: {},\n                    operation: 'updatePost',\n                    paths: ['updatePost', 'updatePost/title', 'getPost', 'getPost/title'],\n                    prismaArgs: {\n                        where: { id: 1 },\n                        data: { title: 'New title' },\n                        select: { title: true },\n                    },\n                    type: 'Mutation',\n                },\n                result: 'hello',\n            })\n\n            expect(hookResponse.result).toEqual('after:updatePost')\n        })\n\n        test('expect \"before:notify\" to run _before_ \"notify\"', async () => {\n            let testValue: any = false\n            await runHooks({\n                when: 'before',\n                hooks: {\n                    'before:notify': async () => {\n                        testValue = 'before:notify'\n                    },\n                },\n                prismaClient: new PrismaClient(),\n                QueryParams: {\n                    headers: {},\n                    args: {\n                        message: 'Hello world',\n                    },\n                    authorization: Authorizations.API_KEY,\n                    context: {\n                        action: 'notify',\n                        alias: 'custom',\n                        model: null,\n                    },\n                    fields: ['message'],\n                    identity: {},\n                    operation: 'notify',\n                    paths: ['notify', 'notify/message'],\n                    prismaArgs: {\n                        select: { message: true },\n                    },\n                    type: 'Mutation',\n                },\n            })\n\n            expect(testValue).toEqual('before:notify')\n        })\n\n        test('expect \"before:**\" to run _before_ everything', async () => {\n            let testValue: any = false\n            await runHooks({\n                when: 'before',\n                hooks: {\n                    'before:**': async () => {\n                        testValue = 'before:**'\n                    },\n                },\n                prismaClient: new PrismaClient(),\n                QueryParams: {\n                    headers: {},\n                    args: {\n                        where: { id: 1 },\n                        data: { title: 'New title' },\n                    },\n                    authorization: Authorizations.API_KEY,\n                    context: {\n                        action: Actions.update,\n                        alias: ActionsAliases.modify,\n                        model: TESTING.PostModel,\n                    },\n                    fields: ['title'],\n                    identity: {},\n                    operation: 'updatePost',\n                    paths: ['updatePost', 'updatePost/title', 'getPost', 'getPost/title'],\n                    prismaArgs: {\n                        where: { id: 1 },\n                        data: { title: 'New title' },\n                        select: { title: true },\n                    },\n                    type: 'Mutation',\n                },\n            })\n\n            expect(testValue).toEqual('before:**')\n        })\n    })\n\n    describe('.getDepth?', () => {\n        test('expect getDepth to return depth', () => {\n            const depth = getDepth({\n                paths: [\n                    'listPost',\n                    'listPost/id',\n                    'listPost/title',\n                    'listPost/json',\n                    'listPost/author',\n                    'listPost/author/name',\n                ],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n                fieldsMapping: {},\n            })\n            expect(depth).toEqual(2)\n        })\n        test('expect getDepth to return depth, excluding Json fields', () => {\n            const depth = getDepth({\n                paths: [\n                    'createPost',\n                    'createPost/title',\n                    'createPost/json',\n                    'createPost/json/menu',\n                    'createPost/json/menu/id',\n                    'createPost/json/menu/value',\n                    'createPost/json/menu/popup',\n                    'createPost/json/menu/popup/menuitem',\n                    'getPost',\n                    'getPost/title',\n                    'getPost/json',\n                ],\n                context: {\n                    action: Actions.update,\n                    alias: ActionsAliases.modify,\n                    model: TESTING.PostModel,\n                },\n                fieldsMapping: {\n                    'createPost/json': { type: 'Json' },\n                    'createPosts/json': { type: 'Json' },\n                    'getPost/json': { type: 'Json' },\n                },\n            })\n            expect(depth).toEqual(1)\n        })\n    })\n})\n"
  },
  {
    "path": "tests/client/mocks/graphql-json.ts",
    "content": "// adapted from: https://github.com/trayio/graphql-query-to-json\nimport { parse } from 'graphql'\nimport mapValues from 'lodash/mapValues'\n\ntype variablesObject = {\n    [variableName: string]: any\n}\n\ntype Argument = {\n    kind: string\n    name: {\n        kind: string\n        value: string\n    }\n    value: {\n        kind: string\n        value: string\n        block: boolean\n        fields?: Argument[]\n        name?: {\n            kind: string\n            value: string\n        }\n        values?: Argument[]\n    }\n}\n\ntype Selection = {\n    kind: string\n    alias: {\n        kind: string\n        value: string\n    }\n    name: {\n        kind: string\n        value: string\n    }\n    arguments?: Argument[]\n    selectionSet?: SelectionSet\n}\n\ntype SelectionSet = {\n    kind: string\n    selections: Selection[]\n}\n\ntype VariableDefinition = {\n    kind: string\n    variable: {\n        kind: string\n        name: {\n            kind: string\n            value: string\n        }\n    }\n    type: {\n        kind: string\n        name: {\n            kind: string\n            value: string\n        }\n    }\n}\n\ntype ActualDefinitionNode = {\n    operation: string\n    selectionSet: SelectionSet\n    variableDefinitions?: VariableDefinition[]\n}\n\nconst undefinedVariableConst = 'undefined_variable'\nconst isVariableDropinConst = '_____isVariableDropinConst'\n\nexport const isArray = Array.isArray\n\nexport function flatMap(arg: any, callback: any) {\n    return arg.reduce((callbackFn: any, initialValue: any) => callbackFn.concat(callback(initialValue)), [])\n}\n\nexport function isString(arg: any): boolean {\n    return typeof arg === 'string'\n}\n\nexport function isObject(arg: any): boolean {\n    return arg instanceof Object\n}\n\nfunction getArgument(arg: any) {\n    if (arg.value.kind === 'ObjectValue')\n        return getArguments(arg.value.fields)\n\n    else if (arg.value.kind === 'Variable')\n        return `${arg.value.name.value}${isVariableDropinConst}`\n\n    else if (arg.selectionSet)\n        return getSelections(arg.selectionSet.selections)\n\n    else if (arg.value.kind === 'EnumValue')\n        return arg.value.value\n\n    else if (arg.value.kind === 'IntValue')\n        return Number.parseInt(arg.value.value)\n\n    else if (arg.value.kind === 'ListValue')\n        return flatMap(arg.value.values, (argValue: any) => getArgument({ value: argValue }))\n\n    else return arg.value.value\n}\n\nfunction getArguments(args: any[]) {\n    const argsObj: any = {}\n\n    args.forEach((arg: any) => {\n        argsObj[arg.name.value] = getArgument(arg)\n    })\n\n    return argsObj\n}\n\nfunction getSelections(selections: Selection[]) {\n    const selObj: any = {}\n\n    selections.forEach((selection) => {\n        const selectionHasAlias = selection.alias\n        const selectionName = selectionHasAlias ? selection.alias.value : selection.name.value\n\n        if (selection.selectionSet) {\n            selObj[selectionName] = getSelections(selection.selectionSet.selections)\n\n            if (selectionHasAlias)\n                selObj[selection.alias.value].__aliasFor = selection.name.value\n\n            if (selection.arguments && selection.arguments.length > 0)\n                selObj[selectionName].__args = getArguments(selection.arguments)\n        }\n        else {\n            if (selection.arguments && selection.arguments.length > 0) {\n                selObj[selectionName] = {\n                    __args: getArguments(selection.arguments),\n                }\n            }\n            else if (!selection.arguments || !selection.arguments.length) {\n                selObj[selectionName] = true\n            }\n        }\n    })\n    return selObj\n}\n\nfunction checkEachVariableInQueryIsDefined(defintion: ActualDefinitionNode, variables: variablesObject) {\n    const varsList = defintion?.variableDefinitions?.reduce((prev: any, curr: any) => {\n        return [\n            ...prev,\n            {\n                key: curr.variable.name.value,\n                value: undefinedVariableConst,\n                required: curr.type.kind === 'NonNullType',\n            },\n        ]\n    }, [])\n\n    Object.entries(variables).forEach(([variableKey, variableValue]) => {\n        const idx = varsList?.findIndex((element) => {\n            return element.key === variableKey\n        })\n\n        if (idx !== -1 && varsList && typeof idx !== 'undefined' && typeof varsList[idx] !== 'undefined')\n            varsList[idx].value = variableValue\n    })\n\n    const undefinedVariable = varsList?.find((varInQuery) => {\n        return varInQuery.value === undefinedVariableConst && varInQuery.required\n    })\n\n    if (undefinedVariable) {\n        throw new Error(\n            'The query you want to parse is using variables. This means that you have to supply for every variable that is used in the query a corresponding value. You can parse these values as a second parameter on the options object, on the \"variables\" key.',\n        )\n    }\n\n    return varsList\n}\n\nfunction replaceVariables(obj: any, variables: any): any {\n    return mapValues(obj, (value) => {\n        if (isString(value) && new RegExp(`${isVariableDropinConst}$`).test(value)) {\n            const variableName = value.replace(isVariableDropinConst, '')\n\n            return variables[variableName]\n        }\n        else if (isObject(value) && !isArray(value)) {\n            return replaceVariables(value, variables)\n        }\n        else {\n            return value\n        }\n    })\n}\n\nexport function graphQlQueryToJson(\n    query: string,\n    options: {\n        variables: variablesObject\n        operationName: string\n    } = {\n        variables: {},\n        operationName: String(),\n    },\n) {\n    const jsonObject: any = {}\n\n    if (!query)\n        return jsonObject\n\n    const parsedQuery = parse(query)\n\n    const operationDefinition = parsedQuery.definitions.find((q: any) => {\n        return options.operationName === q?.name?.value\n    }) || parsedQuery.definitions?.[0]\n\n    // @ts-expect-error: Type 'InputObjectTypeExtensionNode' is missing the following properties from type 'ActualDefinitionNode': operation, selectionSet\n    const definition = operationDefinition as ActualDefinitionNode\n    const operation = definition.operation\n\n    checkEachVariableInQueryIsDefined(definition, options.variables)\n\n    const selections = getSelections(definition.selectionSet.selections)\n    jsonObject[operation] = selections\n\n    const varsReplacedWithValues = replaceVariables(jsonObject, options.variables)\n\n    return varsReplacedWithValues\n}\n"
  },
  {
    "path": "tests/client/mocks/lambda-event.ts",
    "content": "import type { AppSyncEvent, AppSyncIdentity, Identity } from '../../../packages/client/src'\nimport { _ } from '../../../packages/client/src'\nimport { graphQlQueryToJson } from './graphql-json'\n\nexport default function mockLambdaEvent({\n    request,\n    graphQLParams,\n    identity,\n}: {\n    request: any\n    graphQLParams: { query: string; variables?: any; operationName: string; raw?: any }\n    identity: Identity\n}): AppSyncEvent[] {\n    const events: AppSyncEvent[] = []\n    const selectionSetGraphQL = graphQLParams.query\n    const variables = graphQLParams.variables || {}\n    const operationName = graphQLParams.operationName\n    const queries = graphQlQueryToJson(selectionSetGraphQL, { variables, operationName })\n    const parentType: string = Object.keys(queries)[0]\n\n    for (let queryIndex = 0; queryIndex < Object.keys(queries[parentType]).length; queryIndex++) {\n        const fieldName: string = Object.keys(queries[parentType])[queryIndex]\n        const parentTypeName = parentType.charAt(0).toUpperCase() + parentType.slice(1)\n        const selectionSet = queries[parentType][fieldName]\n        const args = typeof selectionSet.__args !== 'undefined' ? selectionSet.__args : {}\n\n        if (Object.keys(args).length > 0)\n            delete selectionSet.__args\n\n        const selectionSetList = Object.keys(_.dotate(selectionSet))\n            .filter(selection => selection !== '.')\n            .map(selection => selection.replace(/\\./g, '/'))\n\n        selectionSetList.unshift('__typename')\n\n        const event: AppSyncEvent = {\n            arguments: args,\n            source: null,\n            identity: identity as AppSyncIdentity,\n            info: {\n                parentTypeName,\n                fieldName,\n                variables,\n                selectionSetList,\n                selectionSetGraphQL,\n            },\n            request,\n            prev: { result: {} },\n            stash: {},\n        }\n\n        events.push(event)\n    }\n\n    return events\n}\n"
  },
  {
    "path": "tests/client/mocks/lambda-identity.ts",
    "content": "import type {\n    AMAZON_COGNITO_USER_POOLS,\n    API_KEY,\n    AWS_IAM,\n    AWS_LAMBDA,\n    Authorization,\n    Identity,\n    OPENID_CONNECT,\n} from '../../../packages/client/src'\nimport {\n    Authorizations,\n} from '../../../packages/client/src'\n\nexport default function mockLambdaIdentity(identity: Authorization, opts?: mockOptions): Identity {\n    if (identity === Authorizations.AWS_IAM) {\n        const mock: AWS_IAM = {\n            accountId: 'string',\n            cognitoIdentityPoolId: 'string',\n            cognitoIdentityId: 'string',\n            sourceIp: [opts?.sourceIp || 'undefined'],\n            username: opts?.username || 'undefined',\n            userArn: 'string',\n            cognitoIdentityAuthType: 'string',\n            cognitoIdentityAuthProvider: 'string',\n        }\n        return mock\n    }\n    else if (identity === Authorizations.AMAZON_COGNITO_USER_POOLS) {\n        // eslint-disable-next-line n/prefer-global/buffer\n        const decodedJWTToken = opts?.jwt ? JSON.parse(Buffer.from(opts?.jwt?.split('.')[1], 'base64').toString()) : {}\n        const mock: AMAZON_COGNITO_USER_POOLS = {\n            sub: decodedJWTToken?.sub || 'undefined',\n            issuer: 'string',\n            username: decodedJWTToken?.['cognito:username'] || 'undefined',\n            claims: decodedJWTToken,\n            sourceIp: [opts?.sourceIp || 'undefined'],\n            defaultAuthStrategy: 'string',\n            groups: ['admin', 'member'],\n        }\n        return mock\n    }\n    else if (identity === Authorizations.AWS_LAMBDA) {\n        const mock: AWS_LAMBDA = {\n            resolverContext: opts?.resolverContext || 'undefined',\n        }\n        return mock\n    }\n    else if (identity === Authorizations.OPENID_CONNECT) {\n        const mock: OPENID_CONNECT = {\n            claims: {\n                sub: opts?.sub || 'undefined',\n                aud: 'string',\n                azp: 'string',\n                iss: 'string',\n                exp: 1630923679,\n                iat: 1630837279,\n                gty: 'string',\n            },\n            issuer: 'string',\n            sub: opts?.sub || 'undefined',\n        }\n        return mock\n    }\n    else {\n        const mock: API_KEY = null\n        return mock\n    }\n}\n\ntype mockOptions = {\n    sub: string\n    username: string\n    sourceIp: string\n    resolverContext: any\n    jwt?: string\n}\n"
  },
  {
    "path": "tests/client/resolver.test.ts",
    "content": "/* eslint-disable n/prefer-global/process */\nimport { describe, expect } from 'vitest'\nimport * as queries from '@client/resolver'\nimport type { Model, QueryParams } from '@client/types'\nimport { Actions, ActionsAliases, Authorizations } from '@client/consts'\nimport mockLambdaIdentity from './mocks/lambda-identity'\nimport { testEach } from './utils'\n\nprocess.env.PRISMA_APPSYNC_TESTING = 'true'\n\nconst TESTING = {\n    PostModel: {\n        prismaRef: 'post',\n        singular: 'Post',\n        plural: 'Posts',\n    },\n}\n\nconst identity = mockLambdaIdentity(Authorizations.AMAZON_COGNITO_USER_POOLS, {\n    sourceIp: 'xxx.xxx.xxx.x',\n    username: 'johndoe',\n    sub: 'xxxxxx',\n    resolverContext: {},\n})\n\ndescribe('CLIENT #queries', () => {\n    const query: QueryParams = {\n        headers: {},\n        args: {},\n        context: {\n            action: Actions.get,\n            alias: ActionsAliases.access,\n            model: TESTING.PostModel,\n        },\n        prismaArgs: {\n            data: { title: 'Hello World' },\n            select: { title: true },\n            where: { id: 2 },\n            orderBy: { title: 'DESC' },\n            skip: 2,\n            take: 1,\n            skipDuplicates: true,\n        },\n        authorization: Authorizations.AMAZON_COGNITO_USER_POOLS,\n        identity,\n        operation: 'getPost',\n        fields: ['title'],\n        type: 'Query',\n        paths: [],\n    }\n\n    const createPrismaClient: any = (model: Model, prismaQuery: string) => {\n        return {\n            [model!.prismaRef]: {\n                [prismaQuery]: (queryObject: any) => {\n                    return queryObject\n                },\n            },\n        }\n    }\n\n    const tests = [\n        {\n            name: 'getQuery',\n            prismaQuery: 'findUnique',\n            expectedResult: {\n                where: query.prismaArgs.where,\n                select: query.prismaArgs.select,\n            },\n        },\n        {\n            name: 'listQuery',\n            prismaQuery: 'findMany',\n            expectedResult: {\n                where: query.prismaArgs.where,\n                select: query.prismaArgs.select,\n                orderBy: query.prismaArgs.orderBy,\n                skip: query.prismaArgs.skip,\n                take: query.prismaArgs.take,\n            },\n        },\n        {\n            name: 'countQuery',\n            prismaQuery: 'count',\n            expectedResult: {\n                where: query.prismaArgs.where,\n                select: query.prismaArgs.select,\n                orderBy: query.prismaArgs.orderBy,\n                skip: query.prismaArgs.skip,\n                take: query.prismaArgs.take,\n            },\n        },\n        {\n            name: 'createQuery',\n            prismaQuery: 'create',\n            expectedResult: {\n                data: query.prismaArgs.data,\n                select: query.prismaArgs.select,\n            },\n        },\n        {\n            name: 'createManyQuery',\n            prismaQuery: 'createMany',\n            expectedResult: {\n                data: query.prismaArgs.data,\n                skipDuplicates: query.prismaArgs.skipDuplicates,\n            },\n        },\n        {\n            name: 'updateQuery',\n            prismaQuery: 'update',\n            expectedResult: {\n                data: query.prismaArgs.data,\n                where: query.prismaArgs.where,\n                select: query.prismaArgs.select,\n            },\n        },\n        {\n            name: 'updateManyQuery',\n            prismaQuery: 'updateMany',\n            expectedResult: {\n                data: query.prismaArgs.data,\n                where: query.prismaArgs.where,\n            },\n        },\n        {\n            name: 'upsertQuery',\n            prismaQuery: 'upsert',\n            expectedResult: {\n                create: query.prismaArgs.create,\n                update: query.prismaArgs.update,\n                where: query.prismaArgs.where,\n                select: query.prismaArgs.select,\n            },\n        },\n        {\n            name: 'deleteQuery',\n            prismaQuery: 'delete',\n            expectedResult: {\n                where: query.prismaArgs.where,\n                select: query.prismaArgs.select,\n            },\n        },\n        {\n            name: 'deleteManyQuery',\n            prismaQuery: 'deleteMany',\n            expectedResult: {\n                where: query.prismaArgs.where,\n            },\n        },\n    ]\n\n    const cases = tests.map((test: any) => {\n        return [test.name, test.prismaQuery, test.expectedResult]\n    })\n\n    testEach(cases)('expect \"{0}\" to call \"{1}\" Prisma Query', async (queryName, prismaQuery, expectedResult) => {\n        const result = await queries[queryName](createPrismaClient(query.context.model, prismaQuery), query)\n        expect(result).toEqual(expectedResult)\n    })\n})\n"
  },
  {
    "path": "tests/client/utils/index.ts",
    "content": "import { test } from 'vitest'\n\nfunction format(str, ...args) {\n    return str.replace(/{(\\d+)}/g, (match, number) => {\n        return typeof args[number] != 'undefined' ? args[number] : match\n    })\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function testEach(cases: any[][]): (name: string, fn: Function) => void {\n    return (name, fn) => {\n        cases.forEach((items) => {\n            test(format(name, ...items), () => fn(...items))\n        })\n    }\n}\n"
  },
  {
    "path": "tests/client/utils.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\nimport {\n    clone,\n    decode,\n    dotate,\n    encode,\n    filterXSS,\n    isEmpty,\n    isMatchingGlob,\n    isObject,\n    isUndefined,\n    lowerFirst,\n    merge,\n    objectToPaths,\n    omit,\n    uniq,\n    upperFirst,\n    walk,\n} from '@client/utils'\n\n// eslint-disable-next-line n/prefer-global/process\nprocess.env.PRISMA_APPSYNC_TESTING = 'true'\n\ndescribe('CLIENT #utils', () => {\n    describe('.merge?', () => {\n        test('expect merge to deep merge objects', () => {\n            const obj1 = {\n                select: {\n                    title: true,\n                    author: {\n                        select: { username: true },\n                    },\n                },\n            }\n            const obj2 = {\n                select: {\n                    description: true,\n                    author: {\n                        select: { email: true },\n                    },\n                },\n            }\n            const obj3 = {\n                data: { where: { id: 1 } },\n            }\n            expect(merge(obj1, obj2, obj3)).toEqual({\n                data: { where: { id: 1 } },\n                select: {\n                    title: true,\n                    description: true,\n                    author: {\n                        select: { username: true, email: true },\n                    },\n                },\n            })\n        })\n\n        test('expect merge to deep merge objects with array', () => {\n            const obj1 = {\n                where: { collectionUuid: 'a' },\n                data: {\n                    pins: [\n                        { uuid: 'b', order: 2 },\n                        { uuid: 'c', order: 5 },\n                    ],\n                },\n            }\n            const obj2 = {\n                select: {\n                    uuid: true,\n                    order: true,\n                },\n            }\n            expect(merge(obj1, obj2)).toEqual({\n                where: { collectionUuid: 'a' },\n                data: {\n                    pins: [\n                        { uuid: 'b', order: 2 },\n                        { uuid: 'c', order: 5 },\n                    ],\n                },\n                select: {\n                    uuid: true,\n                    order: true,\n                },\n            })\n        })\n    })\n    describe('.clone?', () => {\n        test('expect clone to deep clone object', () => {\n            const obj1 = {\n                select: {\n                    title: true,\n                    author: {\n                        select: { username: true },\n                    },\n                },\n            }\n            expect(clone(obj1)).toEqual(obj1)\n        })\n        test('expect clone to deep clone object with array', () => {\n            const obj1 = {\n                where: { collectionUuid: 'a' },\n                data: {\n                    pins: [\n                        { uuid: 'b', order: 2 },\n                        { uuid: 'c', order: 5 },\n                    ],\n                },\n            }\n            expect(clone(obj1)).toEqual(obj1)\n        })\n    })\n    describe('.omit?', () => {\n        test('expect omit to delete object keys', () => {\n            const result = omit({ a: 'a', b: 'b', c: 'c' }, ['a', 'c'])\n            expect(result).toEqual({ b: 'b' })\n        })\n    })\n    describe('.decode?', () => {\n        test('expect decode to decode HTML characters', () => {\n            const result = decode('&lt; &gt; &quot; &apos; &amp;')\n            expect(result).toEqual('< > \" \\' &')\n        })\n    })\n    describe('.encode?', () => {\n        test('expect encode to encode HTML characters', () => {\n            const result = encode('< > \" \\' &')\n            expect(result).toEqual('&lt; &gt; &quot; &apos; &amp;')\n        })\n    })\n    describe('.dotate?', () => {\n        test('expect dotate to transform an object to a dotted-key/value pair', () => {\n            const result = dotate({ data: { title: 'glut' } })\n            expect(result).toEqual({ 'data.title': 'glut' })\n        })\n        test('expect dotate to preserve arrays', () => {\n            const result = dotate({ data: { tags: ['foo', 'bar'] } })\n            expect(result).toEqual({ 'data.tags': ['foo', 'bar'] })\n        })\n    })\n    describe('.objectToPaths?', () => {\n        test('expect objectToPaths to transform an object to to an array of paths.', () => {\n            const result = objectToPaths({ data: { title: 'foo', comment: { user: { id: 2 } } } })\n            expect(result).toEqual([\n                'data',\n                'data/title',\n                'data/comment',\n                'data/comment/user',\n                'data/comment/user/id',\n            ])\n        })\n        test('expect objectToPaths to transform an object to to an array of paths (incl. sub-arrays).', () => {\n            const result = objectToPaths({\n                data: [{\n                    title: 'foo from array',\n                    comment: {\n                        user: { id: 2 },\n                    },\n                }],\n            })\n            expect(result).toEqual([\n                'data',\n                'data/title',\n                'data/comment',\n                'data/comment/user',\n                'data/comment/user/id',\n            ])\n        })\n    })\n    describe('.isMatchingGlob?', () => {\n        test('expect isMatchingGlob to return true if specified path matches any of the glob patterns', () => {\n            const result = isMatchingGlob('get/post/title', ['get/post{,/**}'])\n            expect(result).toEqual(true)\n        })\n        test('expect isMatchingGlob to return false if specified path does not match any of the glob patterns', () => {\n            const result = isMatchingGlob('get/comment/title', ['get/post{,/**}'])\n            expect(result).toEqual(false)\n        })\n    })\n    describe('.filterXSS?', () => {\n        test('expect filterXSS to sanitize untrusted HTML to prevent XSS', () => {\n            const result = filterXSS('<script>alert(\"xss\");</scr' + 'ipt>')\n            expect(result).toEqual('&lt;script&gt;alert(\"xss\");&lt;/script&gt;')\n        })\n    })\n    describe('.isEmpty?', () => {\n        test('expect isEmpty to return true if element is Undefined', () => {\n            const test: any = {}\n            expect(isEmpty(test?.data?.title)).toEqual(true)\n        })\n        test('expect isEmpty to return true if element is an Empty object', () => {\n            const test: any = {}\n            expect(isEmpty(test)).toEqual(true)\n        })\n        test('expect isEmpty to return true if element is an Empty String', () => {\n            const test = ' '\n            expect(isEmpty(test)).toEqual(true)\n        })\n        test('expect isEmpty to return true if element is Null', () => {\n            const test = null\n            expect(isEmpty(test)).toEqual(true)\n        })\n        test('expect isEmpty to return true if element is an Empty Array', () => {\n            const test = []\n            expect(isEmpty(test)).toEqual(true)\n        })\n    })\n    describe('.isUndefined?', () => {\n        test('expect isUndefined to return true if element is Undefined', () => {\n            const test: any = {}\n            expect(isUndefined(test?.data)).toEqual(true)\n        })\n        test('expect isUndefined to return false if element is Defined', () => {\n            const test: any = { data: null }\n            expect(isUndefined(test?.data)).toEqual(false)\n        })\n    })\n    describe('.lowerFirst?', () => {\n        test('expect lowerFirst to return a string with first letter lowercase', () => {\n            expect(lowerFirst('HELLO')).toEqual('hELLO')\n        })\n    })\n    describe('.upperFirst?', () => {\n        test('expect upperFirst to return a string with first letter uppercase', () => {\n            expect(upperFirst('heLLO')).toEqual('HeLLO')\n        })\n    })\n    describe('.isObject?', () => {\n        test('expect isObject to return true if element is an Object', () => {\n            expect(isObject({})).toEqual(true)\n        })\n        test('expect isObject to return false if element is Null', () => {\n            expect(isObject(null)).toEqual(false)\n        })\n        test('expect isObject to return false if element is a Function', () => {\n            expect(isObject(() => 'xxx')).toEqual(false)\n        })\n        test('expect isObject to return false if element is an Array', () => {\n            expect(isObject([])).toEqual(false)\n        })\n    })\n    describe('.walk?', () => {\n        test('expect walk to allow modify an Object', async () => {\n            const result = await walk(\n                {\n                    select: {\n                        title: true,\n                        authors: [\n                            {\n                                select: { username: true },\n                            },\n                        ],\n                    },\n                },\n                async ({ key, value }) => {\n                    if (typeof value === 'boolean')\n                        value = !value\n                    return { key, value }\n                },\n            )\n            expect(result).toEqual({\n                select: {\n                    title: false,\n                    authors: [\n                        {\n                            select: { username: false },\n                        },\n                    ],\n                },\n            })\n        })\n        test('expect walk to allow exclude keys in Object', async () => {\n            const result = await walk(\n                {\n                    select: {\n                        title: true,\n                        authors: [\n                            {\n                                select: { username: true },\n                            },\n                        ],\n                    },\n                },\n                async ({ key, value }, node) => {\n                    if (key === 'authors')\n                        node.ignoreChilds()\n                    if (typeof value === 'boolean')\n                        value = !value\n                    return { key, value }\n                },\n            )\n            expect(result).toEqual({\n                select: {\n                    title: false,\n                    authors: [\n                        {\n                            select: { username: true },\n                        },\n                    ],\n                },\n            })\n        })\n        test('expect walk to allow modify an Array', async () => {\n            const result = await walk(\n                [{ authors: { username: true } }, { comments: { username: true } }],\n                async ({ key, value }) => {\n                    if (typeof value === 'boolean')\n                        value = !value\n                    return { key, value }\n                })\n            expect(result).toEqual([{ authors: { username: false } }, { comments: { username: false } }])\n        })\n        test('expect walk to allow excluding elements in Array', async () => {\n            const result = await walk(\n                [{ authors: { username: true } }, { comments: { username: true } }],\n                async ({ key, value }, node) => {\n                    if (typeof value === 'boolean')\n                        value = !value\n                    if (key === 'comments')\n                        node.ignoreChilds()\n                    return { key, value }\n                },\n            )\n            expect(result).toEqual([{ authors: { username: false } }, { comments: { username: true } }])\n        })\n    })\n    describe('.uniq?', () => {\n        test('expect uniq to return a unique array', () => {\n            expect(uniq(['a', 'b', 'a'])).toEqual(['a', 'b'])\n        })\n    })\n})\n"
  },
  {
    "path": "tests/generator/@gql.test.ts",
    "content": "/* eslint-disable unicorn/prefer-node-protocol */\nimport { readFileSync } from 'fs'\nimport { join } from 'path'\nimport { describe, expect, test } from 'vitest'\nimport EasyGraphQLTester from 'easygraphql-tester'\nimport { makeExecutableSchema } from '@graphql-tools/schema'\n\nconst appsyncDirectives = readFileSync(join(__dirname, './mock/appsync-directives.gql'), 'utf8')\nconst appsyncScalars = readFileSync(join(__dirname, './mock/appsync-scalars.gql'), 'utf8')\nconst generatedSchema = readFileSync(join(__dirname, './schemas/generated/@gql/schema.gql'), 'utf8')\nconst appsyncSchema = [appsyncDirectives, appsyncScalars, generatedSchema].join('\\n\\n').replace(/\\\"\\\"\\\"(.|\\n)*?\\\"\\\"\\\"\\n/gim, '')\nconst gqlSchema = makeExecutableSchema({ typeDefs: appsyncSchema })\nconst tester = new EasyGraphQLTester(appsyncSchema)\n\ndescribe('GENERATOR @gql', () => {\n    describe('disabling entire models', () => {\n        test('expect Badge queries to be disabled', async () => {\n            const invalidQuery = 'query { getBadge { level } }'\n            tester.test(false, invalidQuery)\n        })\n        test('expect Badge mutations to be disabled', async () => {\n            const invalidQuery = `\n                mutation {\n                    createBadge(\n                        data: { level: 1, rank: 1 }\n                    ) {\n                        level\n                        rank\n                    }\n                }`\n            tester.test(false, invalidQuery)\n        })\n    })\n\n    describe('disabling top-level queries, mutations, subscriptions', () => {\n        test('expect User queries to be enabled', async () => {\n            const query = 'query { listUsers { email } }'\n            tester.test(true, query)\n        })\n        test('expect User subscriptions to be disabled', async () => {\n            const invalidQuery = `subscription { onMutatedUser {  id } }`\n            tester.test(false, invalidQuery)\n        })\n    })\n\n    describe('disabling granular operations', () => {\n        test('expect create Post to be enabled', async () => {\n            const query = `\n                mutation {\n                    createPost(\n                        data: { title: \"title\" }\n                    ) {\n                        title\n                    }\n                }`\n            tester.test(true, query)\n        })\n        test('expect delete Post to be disabled', async () => {\n            const invalidQuery = `\n                mutation {\n                    deletePost(\n                        where: { id: 1 }\n                    ) {\n                        title\n                    }\n                }`\n            tester.test(false, invalidQuery)\n        })\n    })\n\n    describe('hidding fields', () => {\n        test('expect querying password field on User to fail', async () => {\n            const invalidQuery = 'query { listUsers { password } }'\n            tester.test(false, invalidQuery)\n        })\n        test('expect querying other fields on User to succeed', async () => {\n            const query = 'query { listUsers { email } }'\n            tester.test(true, query)\n        })\n        test('expect password field to still be writable', async () => {\n            const query = `mutation {\n                createUser (\n                    data: {\n                        email: \"user@email.com\"\n                        password: \"123456\"\n                    }\n                ) {\n                    email\n                }\n            }`\n            tester.test(true, query)\n        })\n    })\n\n    describe('custom scalars', () => {\n        test('expect source field on Post to be \"AWSURL\"', async () => {\n            const postType: any = gqlSchema.getType('Post')\n            const sourceField = postType.getFields()?.source\n            const sourceFieldScalar = sourceField?.type?.toString()\n            expect(sourceFieldScalar).toEqual('AWSURL')\n        })\n    })\n})\n"
  },
  {
    "path": "tests/generator/crud.test.ts",
    "content": "/* eslint-disable unicorn/prefer-node-protocol */\nimport { readFileSync } from 'fs'\nimport { join } from 'path'\nimport { describe, test } from 'vitest'\nimport EasyGraphQLTester from 'easygraphql-tester'\n\nconst appsyncDirectives = readFileSync(join(__dirname, './mock/appsync-directives.gql'), 'utf8')\nconst appsyncScalars = readFileSync(join(__dirname, './mock/appsync-scalars.gql'), 'utf8')\nconst generatedSchema = readFileSync(join(__dirname, './schemas/generated/crud/schema.gql'), 'utf8')\nconst appsyncSchema = [appsyncDirectives, appsyncScalars, generatedSchema].join('\\n\\n').replace(/\\\"\\\"\\\"(.|\\n)*?\\\"\\\"\\\"\\n/gim, '')\nconst tester = new EasyGraphQLTester(appsyncSchema)\n\ndescribe('GENERATOR CRUD', () => {\n    describe('queries', () => {\n        test('expect \"get<Model>\" query to be valid', async () => {\n            const query = `\n                query ($id: Int!) {\n                    getPost(where: { id: $id }) {\n                        id\n                        title\n                        authorUuid\n                        published\n                        views\n                        lastSavedAt\n                    }\n                }\n            `\n            tester.test(true, query, { id: 1 })\n        })\n        test('expect \"list<Model>\" query to be valid', async () => {\n            const query = `\n                query {\n                    listUsers {\n                        uuid\n                        username\n                        email\n                        role\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"count<Model>\" query to be valid', async () => {\n            const query = `\n                query {\n                    countUsers\n                }\n            `\n            tester.test(true, query)\n        })\n    })\n\n    describe('mutations', () => {\n        test('expect \"create<Model>\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    createPost(\n                        data: { title: \"Hello world\" }\n                    ) {\n                        title\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"update<Model>\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    updatePost(\n                        where: { id: 1 }\n                        data: { title: \"Hello world\" }\n                    ) {\n                        title\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"upsert<Model>\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    upsertPost(\n                        where: { id: 1 }\n                        create: { title: \"Hello world\" }\n                        update: { title: \"Hello world\" }\n                    ) {\n                        title\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"delete<Model>\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    deletePost(\n                        where: { id: 1 }\n                    ) {\n                        title\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"createMany<Model>\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    createManyPosts(\n                        data: [\n                            { title: \"Hello world 1\" },\n                            { title: \"Hello world 2\" }\n                        ]\n                    ) {\n                        count\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"updateMany<Model>\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    updateManyPosts(\n                        where: { title: { equals: \"Hello\" } }\n                        data: { title: \"Hello world\" }\n                    ) {\n                        count\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"deleteMany<Model>\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    deleteManyPosts(\n                        where: { title: { equals: \"Hello world\" } }\n                    ) {\n                        count\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n    })\n\n    describe('relation queries', () => {\n        test('expect \"deeply nested read\" query to be valid', async () => {\n            const query = `\n                query {\n                    listUsers {\n                        uuid\n                        username\n                        email\n                        role\n\n                        posts {\n                            id\n                            title\n                            authorUuid\n                            published\n                            views\n                            lastSavedAt\n                            \n                            comments {\n                                id\n                                message\n                                lastSavedAt\n                            }\n                        }\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"nested write\" query to be valid', async () => {\n            const query = `\n                mutation {\n                    createUser(\n                        data: {\n                            username: \"username\"\n                            email: \"email@gmail.com\"\n\n                            posts: {\n                                create: [\n                                    {\n                                        id: 1\n                                        title: \"Post 1\" \n                                    },\n                                    { \n                                        id: 2\n                                        title: \"Post 2\"\n                                    }\n                                ]\n                            }\n                        }\n                    ) {\n                        uuid\n                        username\n                        email\n                        role\n\n                        posts {\n                            id\n                            title\n                            authorUuid\n                            published\n                            views\n                            lastSavedAt\n                        }\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"relation to-one filter\" query to be valid', async () => {\n            const query = `\n                query {\n                    listComments(\n                        where: {\n                            author: {\n                                username: {\n                                    equals: \"username\"\n                                }\n                            }\n                        }\n                    ) {\n                        message\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"relation to-many filter\" query to be valid', async () => {\n            const query = `\n                query {\n                    listUsers(\n                        where: {\n                            posts: {\n                                every: {\n                                    published: {\n                                        equals: true\n                                    }\n                                }\n                            }\n                        }\n                    ) {\n                        username\n                        email\n                        role\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"deeply nested relation to-one-to-many filter\" query to be valid', async () => {\n            const query = `\n                query {\n                    listComments(\n                        where: {\n                            author: {\n                                posts: {\n                                    every: {\n                                        published: { equals: true }\n                                    }\n                                }\n                            }\n                        }\n                    ) {\n                        message\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"deeply nested relation to-many-to-many filter\" query to be valid', async () => {\n            const query = `\n                query {\n                    listUsers(\n                        where: {\n                            posts: {\n                                every: {\n                                    comments: {\n                                        every: {\n                                            message: { startsWith: \"hello\" }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    ) {\n                        username\n                        email\n                        role\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"deeply nested relation to-one-to-one filter\" query to be valid', async () => {\n            const query = `\n                query {\n                    listComments(\n                        where: {\n                            author: {\n                                profile: {\n                                    bio: { contains: \"hello\" }\n                                }\n                            }\n                        }\n                    ) {\n                        message\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n        test('expect \"deeply nested relation to-many-to-one filter\" query to be valid', async () => {\n            const query = `\n                query {\n                    listUsers(\n                        where: {\n                            posts: {\n                                every: {\n                                    author: {\n                                        username: {\n                                            equals: \"username\"\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    ) {\n                        username\n                        email\n                        role\n                    }\n                }\n            `\n            tester.test(true, query)\n        })\n    })\n\n    describe('custom resolvers', () => {\n        test('expect \"custom resolver\" query to be valid', async () => {\n            const query = `\n                mutation ($message: String!) {\n                    notify(message: $message) {\n                        message\n                    }\n                }\n            `\n            tester.test(true, query, { message: 'Hello world' })\n        })\n    })\n})\n"
  },
  {
    "path": "tests/generator/mock/appsync-directives.gql",
    "content": "directive @aws_subscribe(mutations: [String!]!) on FIELD_DEFINITION\ndirective @deprecated(reason: String) on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ENUM | ENUM_VALUE\ndirective @aws_auth(cognito_groups: [String!]!) on FIELD_DEFINITION\ndirective @aws_api_key on FIELD_DEFINITION | OBJECT\ndirective @aws_iam on FIELD_DEFINITION | OBJECT\ndirective @aws_oidc on FIELD_DEFINITION | OBJECT\ndirective @aws_cognito_user_pools(cognito_groups: [String!]) on FIELD_DEFINITION | OBJECT\ndirective @aws_lambda on FIELD_DEFINITION | OBJECT\n"
  },
  {
    "path": "tests/generator/mock/appsync-scalars.gql",
    "content": "scalar AWSDate\nscalar AWSTime\nscalar AWSDateTime\nscalar AWSTimestamp\nscalar AWSEmail\nscalar AWSJSON\nscalar AWSURL\nscalar AWSPhone\nscalar AWSIPAddress\nscalar BigInt\nscalar Double"
  },
  {
    "path": "tests/generator/schemas/@gql.prisma",
    "content": "datasource db {\n    provider = \"postgres\"\n    url      = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n    provider      = \"prisma-client-js\"\n    binaryTargets = [\"native\", \"rhel-openssl-1.0.x\"]\n}\n\ngenerator appsync {\n    provider = \"./dist/generator.js\"\n    output   = \"./generated/@gql\"\n}\n\n/// @gql(fields: { password: null }, subscriptions: null)\nmodel User {\n    id        Int       @id @default(autoincrement())\n    email     String    @unique\n    password  String\n    posts     Post[]\n    createdAt DateTime? @default(now())\n}\n\n/// @gql(subscriptions: null, mutations: { delete: null, deleteMany: null })\n/// @gql(scalars: { source: \"AWSURL\" })\nmodel Post {\n    id        Int       @id @default(autoincrement())\n    title     String\n    source    String?\n    author    User?     @relation(fields: [authorId], references: [id])\n    authorId  Int?\n    views     Int?      @default(1)\n    status    Status?   @default(DRAFT)\n    createdAt DateTime? @default(now())\n}\n\nenum Status {\n    DRAFT\n    PUBLISHED\n    DELETED\n}\n\n/// @gql(model: null)\nmodel Badge {\n    level Int\n    rank  Int\n\n    @@id([level, rank])\n    @@index([level, rank])\n}\n"
  },
  {
    "path": "tests/generator/schemas/crud.gql",
    "content": "type PublishNotification {\n    message: String!\n}\n\nextend type Mutation {\n    \"\"\"\n    Send a notification.\n    \"\"\"\n    notify(message: String!): PublishNotification\n}\n\nextend type Subscription {\n    \"\"\"\n    Triggered from `notify` mutation.\n    \"\"\"\n    onNotification: PublishNotification @aws_subscribe(mutations: [\"notify\"])\n}\n"
  },
  {
    "path": "tests/generator/schemas/crud.prisma",
    "content": "datasource db {\n  provider = \"postgres\"\n  url      = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n  provider      = \"prisma-client-js\"\n  binaryTargets = [\"native\", \"rhel-openssl-1.0.x\"]\n}\n\ngenerator appsync {\n  provider     = \"./dist/generator.js\"\n  output       = \"./generated/crud\"\n  extendSchema = \"./crud.gql\"\n}\n\nmodel User {\n  uuid        String    @id @default(uuid()) @db.VarChar(200)\n  username    String    @unique\n  email       String    @unique\n  website     String?\n  hiddenField String?\n  role        Role?     @default(USER)\n  posts       Post[]\n  profile     Profile?\n  comments    Comment[]\n}\n\nmodel Profile {\n  uuid      String  @id @default(uuid()) @db.VarChar(200)\n  owner     User?   @relation(fields: [ownerUuid], references: [uuid])\n  ownerUuid String? @unique @db.VarChar(200)\n  bio       String?\n}\n\nmodel Post {\n  id          Int       @id @default(autoincrement())\n  title       String\n  author      User?     @relation(fields: [authorUuid], references: [uuid])\n  authorUuid  String?   @db.VarChar(200)\n  published   Boolean?  @default(false)\n  comments    Comment[]\n  views       Int?      @default(0)\n  lastSavedAt DateTime? @default(now())\n}\n\nmodel Comment {\n  id          Int       @id @default(autoincrement())\n  author      User?     @relation(fields: [authorUuid], references: [uuid])\n  authorUuid  String?   @db.VarChar(200)\n  post        Post      @relation(fields: [postId], references: [id])\n  postId      Int\n  message     String\n  lastSavedAt DateTime? @default(now())\n}\n\nmodel Like {\n  id         Int    @id @default(autoincrement())\n  authorUuid String @db.VarChar(200)\n  postId     Int\n\n  @@unique([authorUuid, postId])\n}\n\nenum Role {\n  USER\n  ADMIN\n}\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/adapter.d.ts",
    "content": "import type { Action, ActionsAlias, AppSyncEvent, Authorization, Context, GraphQLType, Identity, Model, Options, PrismaArgs, QueryParams } from './types';\n/**\n * #### Parse AppSync direct resolver `event` and returns Query Params.\n *\n * @param  {AppSyncEvent} appsyncEvent - AppSync event received in Lambda.\n * @param  {Required<PrismaAppSyncOptionsType>} options - PrismaAppSync Client options.\n * @param  {any|null} customResolvers? - Custom Resolvers.\n * @returns `{ type, operation, context, fields, paths, args, prismaArgs, authorization, identity }` - QueryParams\n */\nexport declare function parseEvent(appsyncEvent: AppSyncEvent, options: Options, customResolvers?: any | null): Promise<QueryParams>;\n/**\n * #### Convert `is: <enum>NULL` and `isNot: <enum>NULL` to `is: null` and `isNot: null`\n *\n * @param {any} data\n * @returns any\n */\nexport declare function addNullables(data: any): Promise<any>;\n/**\n * #### Returns authorization and identity.\n *\n * @param {any} options\n * @param {AppSyncEvent} options.appsyncEvent - AppSync event received in Lambda.\n * @returns `{ authorization, identity }`\n *\n * https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-identity\n */\nexport declare function getAuthIdentity({ appsyncEvent }: {\n    appsyncEvent: AppSyncEvent;\n}): {\n    identity: Identity;\n    authorization: Authorization;\n};\n/**\n * #### Returns context (`action`, `alias` and `model`).\n *\n * @param  {any} options\n * @param  {any|null} options.customResolvers\n * @param  {string} options.operation\n * @param  {Options} options.options\n * @returns Context\n */\nexport declare function getContext({ customResolvers, operation, options, }: {\n    customResolvers?: any | null;\n    operation: string;\n    options: Options;\n}): Context;\n/**\n * #### Returns operation (`getPost`, `listUsers`, ..).\n *\n * @param  {any} options\n * @param  {string} options.fieldName\n * @returns Operation\n */\nexport declare function getOperation({ fieldName }: {\n    fieldName: string;\n}): string;\n/**\n * #### Returns action (`get`, `list`, `create`, ...).\n *\n * @param  {any} options\n * @param  {string} options.operation\n * @returns Action\n */\nexport declare function getAction({ operation }: {\n    operation: string;\n}): Action;\n/**\n * #### Returns action alias (`access`, `create`, `modify`, `subscribe`).\n *\n * @param  {any} options\n * @param  {Action} options.action\n * @returns ActionsAlias\n */\nexport declare function getActionAlias({ action }: {\n    action: Action;\n}): ActionsAlias;\n/**\n * #### Returns model (`Post`, `User`, ...).\n *\n * @param  {any} options\n * @param  {string} options.operation\n * @param  {Action} options.action\n * @param  {Options} options.options\n * @returns Model\n */\nexport declare function getModel({ operation, action, options }: {\n    operation: string;\n    action: Action;\n    options: Options;\n}): Model;\n/**\n * #### Returns fields (`title`, `author`, ...).\n *\n * @param  {any} options\n * @param  {string[]} options._selectionSetList\n * @returns string[]\n */\nexport declare function getFields({ _selectionSetList }: {\n    _selectionSetList: string[];\n}): string[];\n/**\n * #### Returns GraphQL type (`Query`, `Mutation` or `Subscription`).\n *\n * @param {any} options\n * @param {string} options._parentTypeName\n * @returns GraphQLType\n */\nexport declare function getType({ _parentTypeName }: {\n    _parentTypeName: string;\n}): GraphQLType;\n/**\n * #### Returns Prisma args (`where`, `data`, `orderBy`, ...).\n *\n * @param {any} options\n * @param {Action} options.action\n * @param {Options['defaultPagination']} options.defaultPagination\n * @param {any} options._arguments\n * @param {any} options._selectionSetList\n * @returns PrismaArgs\n */\nexport declare function getPrismaArgs({ action, defaultPagination, _arguments, _selectionSetList, }: {\n    action: Action;\n    defaultPagination: Options['defaultPagination'];\n    _arguments: any;\n    _selectionSetList: any;\n}): PrismaArgs;\n/**\n * #### Returns req and res paths (`updatePost/title`, `getPost/date`, ..).\n *\n * @param {any} options\n * @param {string} options.operation\n * @param {Context} options.context\n * @param {PrismaArgs} options.prismaArgs\n * @returns string[]\n */\nexport declare function getPaths({ operation, context, prismaArgs, }: {\n    operation: string;\n    context: Context;\n    prismaArgs: PrismaArgs;\n}): string[];\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/consts.d.ts",
    "content": "export declare enum Actions {\n    get = \"get\",\n    list = \"list\",\n    count = \"count\",\n    createMany = \"createMany\",\n    updateMany = \"updateMany\",\n    deleteMany = \"deleteMany\",\n    create = \"create\",\n    update = \"update\",\n    upsert = \"upsert\",\n    delete = \"delete\",\n    onCreatedMany = \"onCreatedMany\",\n    onUpdatedMany = \"onUpdatedMany\",\n    onDeletedMany = \"onDeletedMany\",\n    onMutatedMany = \"onMutatedMany\",\n    onCreated = \"onCreated\",\n    onUpdated = \"onUpdated\",\n    onUpserted = \"onUpserted\",\n    onDeleted = \"onDeleted\",\n    onMutated = \"onMutated\"\n}\nexport declare enum ActionsAliases {\n    access = \"access\",\n    batchAccess = \"batchAccess\",\n    create = \"create\",\n    batchCreate = \"batchCreate\",\n    delete = \"delete\",\n    batchDelete = \"batchDelete\",\n    modify = \"modify\",\n    batchModify = \"batchModify\",\n    subscribe = \"subscribe\",\n    batchSubscribe = \"batchSubscribe\"\n}\n/**\n * ### Authorizations\n *\n * - `API_KEY`: Via hard-coded API key passed into `x-api-key` header.\n * - `AWS_IAM`: Via IAM identity and associated IAM policy rules.\n * - `AMAZON_COGNITO_USER_POOLS`: Via Amazon Cognito user token.\n * - `AWS_LAMBDA`: Via an AWS Lambda function.\n * - `OPENID_CONNECT`: Via Open ID connect such as Auth0.\n *\n * https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html\n */\nexport declare enum Authorizations {\n    API_KEY = \"API_KEY\",\n    AWS_IAM = \"AWS_IAM\",\n    AMAZON_COGNITO_USER_POOLS = \"AMAZON_COGNITO_USER_POOLS\",\n    AWS_LAMBDA = \"AWS_LAMBDA\",\n    OPENID_CONNECT = \"OPENID_CONNECT\"\n}\nexport declare const Prisma_QueryOptions: string[];\nexport declare const Prisma_NestedQueries: string[];\nexport declare const Prisma_FilterConditionsAndOperatos: string[];\nexport declare const Prisma_FilterRelationFilters: string[];\nexport declare const Prisma_ScalarListMethods: string[];\nexport declare const Prisma_ScalarListFilters: string[];\nexport declare const Prisma_CompositeTypeMethods: string[];\nexport declare const Prisma_CompositeTypeFilters: string[];\nexport declare const Prisma_AtomicNumberOperations: string[];\nexport declare const Prisma_JSONFilters: string[];\nexport declare const Prisma_ReservedKeysForPaths: string[];\nexport declare const Prisma_ReservedKeys: string[];\nexport declare const ActionsAliasesList: {\n    readonly access: readonly [Actions.get, Actions.list, Actions.count];\n    readonly batchAccess: readonly [Actions.list, Actions.count];\n    readonly create: readonly [Actions.create, Actions.createMany];\n    readonly batchCreate: readonly [Actions.createMany];\n    readonly modify: readonly [Actions.upsert, Actions.update, Actions.updateMany, Actions.delete, Actions.deleteMany];\n    readonly batchModify: readonly [Actions.updateMany, Actions.deleteMany];\n    readonly delete: readonly [Actions.delete, Actions.deleteMany];\n    readonly batchDelete: readonly [Actions.deleteMany];\n    readonly subscribe: readonly [Actions.onCreatedMany, Actions.onUpdatedMany, Actions.onDeletedMany, Actions.onMutatedMany, Actions.onCreated, Actions.onUpdated, Actions.onUpserted, Actions.onDeleted, Actions.onMutated];\n    readonly batchSubscribe: readonly [Actions.onCreatedMany, Actions.onUpdatedMany, Actions.onDeletedMany, Actions.onMutatedMany];\n};\nexport declare const ActionsList: string[];\nexport declare const BatchActionsList: string[];\nexport declare const DebugTestingKey = \"__prismaAppsync\";\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/core.d.ts",
    "content": "import type { Options, PrismaAppSyncOptionsType, ResolveParams } from './types';\nimport { Prisma, PrismaClient } from './types';\n/**\n * ##  Prisma-AppSync Client ʲˢ\n *\n * Type-safe Prisma AppSync client for TypeScript & Node.js\n * @example\n * ```\n * const prismaAppSync = new PrismaAppSync()\n *\n * // lambda handler (AppSync Direct Lambda Resolver)\n * export const resolver = async (event: any, context: any) => {\n *     return await prismaAppSync.resolve({ event })\n * }\n * ```\n *\n *\n * Read more in our [docs](https://prisma-appsync.vercel.app).\n */\nexport declare class PrismaAppSync {\n    options: Options;\n    prismaClient: PrismaClient<Prisma.PrismaClientOptions, 'query' | 'info' | 'warn' | 'error'>;\n    /**\n   * ### Client Constructor\n   *\n   * Instantiate Prisma-AppSync Client.\n   * @example\n   * ```\n   * const prismaAppSync = new PrismaAppSync()\n   * ```\n   *\n   * @param {PrismaAppSyncOptionsType} options\n   * @param {string} options.connectionString? - Prisma connection string (database connection URL).\n   * @param {boolean} options.sanitize? - Enable sanitize inputs (parse xss + encode html).\n   * @param {'INFO' | 'WARN' | 'ERROR'} options.logLevel? - Server logs level (visible in CloudWatch).\n   * @param {number|false} options.defaultPagination? - Default pagination for list Query (items per page).\n   * @param {number} options.maxDepth? - Maximum allowed GraphQL query depth.\n   * @param {number} options.maxReqPerUserMinute? - Maximum allowed requests per user, per minute.\n   *\n   * @default\n   * ```\n   * {\n   *   connectionString: process.env.DATABASE_URL,\n   *   sanitize: true,\n   *   logLevel: 'INFO',\n   *   defaultPagination: 50,\n   *   maxDepth: 4,\n   *   maxReqPerUserMinute: 200\n   * }\n   * ```\n   *\n   *\n   * Read more in our [docs](https://prisma-appsync.vercel.app).\n   */\n    constructor(options?: PrismaAppSyncOptionsType);\n    /**\n   * ###  Resolver\n   *\n   * Resolve the API request, based on the AppSync `event` received by the Direct Lambda Resolver.\n   * @example\n   * ```\n   * await prismaAppSync.resolve({ event })\n   *\n   * // custom resolvers\n   * await prismaAppSync.resolve<'notify'|'listPosts'>(\n   *     event,\n   *     resolvers: {\n   *         // extend CRUD API with a custom `notify` query\n   *         notify: async ({ args }) => { return { message: args.message } },\n   *\n   *         // disable one of the generated CRUD API query\n   *         listPosts: false,\n   *     }\n   * })\n   * ```\n   *\n   * @param {ResolveParams} resolveParams\n   * @param {any} resolveParams.event - AppSync event received by the Direct Lambda Resolver.\n   * @param {any} resolveParams.resolvers? - Custom resolvers (to extend the CRUD API).\n   * @param {function} resolveParams.shield? - Shield configuration (to protect your API).\n   * @param {function} resolveParams.hooks? - Hooks (to trigger functions based on events).\n   * @returns Promise<result>\n   *\n   *\n   * Read more in our [docs](https://prisma-appsync.vercel.app).\n   */\n    resolve<CustomResolvers = void>(resolveParams: ResolveParams<\"countPosts\" | \"countUsers\" | \"createManyPosts\" | \"createManyUsers\" | \"createPost\" | \"createUser\" | \"deleteManyUsers\" | \"deleteUser\" | \"getPost\" | \"getUser\" | \"listPosts\" | \"listUsers\" | \"updateManyPosts\" | \"updateManyUsers\" | \"updatePost\" | \"updateUser\" | \"upsertPost\" | \"upsertUser\", Extract<CustomResolvers, string>>): Promise<any>;\n}\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/guard.d.ts",
    "content": "import type { Context, PrismaClient, QueryParams, Shield, ShieldAuthorization } from './types';\n/**\n * #### Sanitize data (parse xss + encode html).\n *\n * @param {any} data\n * @returns any\n */\nexport declare function sanitize(data: any): Promise<any>;\n/**\n * #### Clarify data (decode html).\n *\n * @param {any} data\n * @returns any\n */\nexport declare function clarify(data: any): Promise<any>;\n/**\n * #### Returns an authorization object from a Shield configuration passed as input.\n *\n * @param {Shield} options.shield\n * @param {string[]} options.paths\n * @param {Context} options.context\n * @returns ShieldAuthorization\n */\nexport declare function getShieldAuthorization({ shield, paths, context, }: {\n    shield: Shield;\n    paths: string[];\n    context: Context;\n}): Promise<ShieldAuthorization>;\n/**\n * #### Returns GraphQL query depth for any given Query.\n *\n * @param {any} options\n * @param {string[]} options.paths\n * @param {Context} options.context\n * @param {any} options.fieldsMapping\n * @returns number\n */\nexport declare function getDepth({ paths, context, fieldsMapping }: {\n    paths: string[];\n    context: Context;\n    fieldsMapping: any;\n}): number;\n/**\n * #### Execute hooks that apply to a given Query.\n *\n * @param {any} options\n * @param {'before' | 'after'} options.when\n * @param {any} options.hooks\n * @param {PrismaClient} options.prismaClient\n * @param {QueryParams} options.QueryParams\n * @param {any | any[]} options.result\n * @returns Promise<void | any>\n */\nexport declare function runHooks({ when, hooks, prismaClient, QueryParams, result, }: {\n    when: 'before' | 'after';\n    hooks: any;\n    prismaClient: PrismaClient;\n    QueryParams: QueryParams;\n    result?: any | any[];\n}): Promise<void | any>;\nexport declare function preventDOS({ callerUuid, maxReqPerMinute, }: {\n    callerUuid: string;\n    maxReqPerMinute: number;\n}): Promise<{\n    limitExceeded: boolean;\n    count: number;\n}>;\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/index.d.ts",
    "content": "import { clone, decode, dotate, encode, filterXSS, isEmpty, isMatchingGlob, isUndefined, lowerFirst, merge, replaceAll, walk } from './utils';\nexport { PrismaAppSync } from './core';\nexport { CustomError, log } from './inspector';\nexport { queryBuilder } from './resolver';\nexport { QueryParams, QueryParamsCustom, BeforeHookParams, AfterHookParams, Authorization, AppSyncEvent, Identity, API_KEY, AWS_IAM, AMAZON_COGNITO_USER_POOLS, AWS_LAMBDA, OPENID_CONNECT, AppSyncResolverHandler, AppSyncResolverEvent, AppSyncIdentity, } from './types';\nexport { Authorizations } from './consts';\ndeclare const _: {\n    merge: typeof merge;\n    clone: typeof clone;\n    decode: typeof decode;\n    encode: typeof encode;\n    dotate: typeof dotate;\n    isMatchingGlob: typeof isMatchingGlob;\n    filterXSS: typeof filterXSS;\n    isEmpty: typeof isEmpty;\n    isUndefined: typeof isUndefined;\n    lowerFirst: typeof lowerFirst;\n    isObject: (val: any) => val is object;\n    walk: typeof walk;\n    replaceAll: typeof replaceAll;\n};\nexport { _ };\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/index.js",
    "content": "\"use strict\";var Ea=Object.create;var De=Object.defineProperty;var xa=Object.getOwnPropertyDescriptor;var va=Object.getOwnPropertyNames;var Ra=Object.getPrototypeOf,wa=Object.prototype.hasOwnProperty;var n=(e,t)=>De(e,\"name\",{value:t,configurable:!0});var L=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),ti=(e,t)=>{for(var r in t)De(e,r,{get:t[r],enumerable:!0})},ri=(e,t,r,i)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let s of va(t))!wa.call(e,s)&&s!==r&&De(e,s,{get:()=>t[s],enumerable:!(i=xa(t,s))||i.enumerable});return e};var Ie=(e,t,r)=>(r=e!=null?Ea(Ra(e)):{},ri(t||!e||!e.__esModule?De(r,\"default\",{value:e,enumerable:!0}):r,e)),Sa=e=>ri(De({},\"__esModule\",{value:!0}),e);var ht=L(ie=>{\"use strict\";ie.isInteger=e=>typeof e==\"number\"?Number.isInteger(e):typeof e==\"string\"&&e.trim()!==\"\"?Number.isInteger(Number(e)):!1;ie.find=(e,t)=>e.nodes.find(r=>r.type===t);ie.exceedsLimit=(e,t,r=1,i)=>i===!1||!ie.isInteger(e)||!ie.isInteger(t)?!1:(Number(t)-Number(e))/Number(r)>=i;ie.escapeNode=(e,t=0,r)=>{let i=e.nodes[t];i&&(r&&i.type===r||i.type===\"open\"||i.type===\"close\")&&i.escaped!==!0&&(i.value=\"\\\\\"+i.value,i.escaped=!0)};ie.encloseBrace=e=>e.type!==\"brace\"||e.commas>>0+e.ranges>>0?!1:(e.invalid=!0,!0);ie.isInvalidBrace=e=>e.type!==\"brace\"?!1:e.invalid===!0||e.dollar?!0:!(e.commas>>0+e.ranges>>0)||e.open!==!0||e.close!==!0?(e.invalid=!0,!0):!1;ie.isOpenOrClose=e=>e.type===\"open\"||e.type===\"close\"?!0:e.open===!0||e.close===!0;ie.reduce=e=>e.reduce((t,r)=>(r.type===\"text\"&&t.push(r.value),r.type===\"range\"&&(r.type=\"text\"),t),[]);ie.flatten=(...e)=>{let t=[],r=n(i=>{for(let s=0;s<i.length;s++){let a=i[s];Array.isArray(a)?r(a,t):a!==void 0&&t.push(a)}return t},\"flat\");return r(e),t}});var gt=L((lh,ji)=>{\"use strict\";var Vi=ht();ji.exports=(e,t={})=>{let r=n((i,s={})=>{let a=t.escapeInvalid&&Vi.isInvalidBrace(s),o=i.invalid===!0&&t.escapeInvalid===!0,l=\"\";if(i.value)return(a||o)&&Vi.isOpenOrClose(i)?\"\\\\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let c of i.nodes)l+=r(c);return l},\"stringify\");return r(e)}});var Ki=L((uh,Qi)=>{\"use strict\";/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */Qi.exports=function(e){return typeof e==\"number\"?e-e===0:typeof e==\"string\"&&e.trim()!==\"\"?Number.isFinite?Number.isFinite(+e):isFinite(+e):!1}});var is=L((ph,rs)=>{\"use strict\";/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */var Wi=Ki(),Ae=n((e,t,r)=>{if(Wi(e)===!1)throw new TypeError(\"toRegexRange: expected the first argument to be a number\");if(t===void 0||e===t)return String(e);if(Wi(t)===!1)throw new TypeError(\"toRegexRange: expected the second argument to be a number.\");let i={relaxZeros:!0,...r};typeof i.strictZeros==\"boolean\"&&(i.relaxZeros=i.strictZeros===!1);let s=String(i.relaxZeros),a=String(i.shorthand),o=String(i.capture),l=String(i.wrap),c=e+\":\"+t+\"=\"+s+a+o+l;if(Ae.cache.hasOwnProperty(c))return Ae.cache[c].result;let u=Math.min(e,t),p=Math.max(e,t);if(Math.abs(u-p)===1){let y=e+\"|\"+t;return i.capture?`(${y})`:i.wrap===!1?y:`(?:${y})`}let d=ts(e)||ts(t),f={min:e,max:t,a:u,b:p},E=[],b=[];if(d&&(f.isPadded=d,f.maxLen=String(f.max).length),u<0){let y=p<0?Math.abs(p):1;b=Yi(y,Math.abs(u),f,i),u=f.a=0}return p>=0&&(E=Yi(u,p,f,i)),f.negatives=b,f.positives=E,f.result=el(b,E,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&E.length+b.length>1&&(f.result=`(?:${f.result})`),Ae.cache[c]=f,f.result},\"toRegexRange\");function el(e,t,r){let i=br(e,t,\"-\",!1,r)||[],s=br(t,e,\"\",!1,r)||[],a=br(e,t,\"-?\",!0,r)||[];return i.concat(a).concat(s).join(\"|\")}n(el,\"collatePatterns\");function tl(e,t){let r=1,i=1,s=Zi(e,r),a=new Set([t]);for(;e<=s&&s<=t;)a.add(s),r+=1,s=Zi(e,r);for(s=Ji(t+1,i)-1;e<s&&s<=t;)a.add(s),i+=1,s=Ji(t+1,i)-1;return a=[...a],a.sort(sl),a}n(tl,\"splitToRanges\");function rl(e,t,r){if(e===t)return{pattern:e,count:[],digits:0};let i=il(e,t),s=i.length,a=\"\",o=0;for(let l=0;l<s;l++){let[c,u]=i[l];c===u?a+=c:c!==\"0\"||u!==\"9\"?a+=nl(c,u,r):o++}return o&&(a+=r.shorthand===!0?\"\\\\d\":\"[0-9]\"),{pattern:a,count:[o],digits:s}}n(rl,\"rangeToPattern\");function Yi(e,t,r,i){let s=tl(e,t),a=[],o=e,l;for(let c=0;c<s.length;c++){let u=s[c],p=rl(String(o),String(u),i),d=\"\";if(!r.isPadded&&l&&l.pattern===p.pattern){l.count.length>1&&l.count.pop(),l.count.push(p.count[0]),l.string=l.pattern+es(l.count),o=u+1;continue}r.isPadded&&(d=al(u,r,i)),p.string=d+p.pattern+es(p.count),a.push(p),o=u+1,l=p}return a}n(Yi,\"splitToPatterns\");function br(e,t,r,i,s){let a=[];for(let o of e){let{string:l}=o;!i&&!Xi(t,\"string\",l)&&a.push(r+l),i&&Xi(t,\"string\",l)&&a.push(r+l)}return a}n(br,\"filterPatterns\");function il(e,t){let r=[];for(let i=0;i<e.length;i++)r.push([e[i],t[i]]);return r}n(il,\"zip\");function sl(e,t){return e>t?1:t>e?-1:0}n(sl,\"compare\");function Xi(e,t,r){return e.some(i=>i[t]===r)}n(Xi,\"contains\");function Zi(e,t){return Number(String(e).slice(0,-t)+\"9\".repeat(t))}n(Zi,\"countNines\");function Ji(e,t){return e-e%Math.pow(10,t)}n(Ji,\"countZeros\");function es(e){let[t=0,r=\"\"]=e;return r||t>1?`{${t+(r?\",\"+r:\"\")}}`:\"\"}n(es,\"toQuantifier\");function nl(e,t,r){return`[${e}${t-e===1?\"\":\"-\"}${t}]`}n(nl,\"toCharacterClass\");function ts(e){return/^-?(0+)\\d/.test(e)}n(ts,\"hasPadding\");function al(e,t,r){if(!t.isPadded)return e;let i=Math.abs(t.maxLen-String(e).length),s=r.relaxZeros!==!1;switch(i){case 0:return\"\";case 1:return s?\"0?\":\"0\";case 2:return s?\"0{0,2}\":\"00\";default:return s?`0{0,${i}}`:`0{${i}}`}}n(al,\"padZeros\");Ae.cache={};Ae.clearCache=()=>Ae.cache={};rs.exports=Ae});var xr=L((dh,ps)=>{\"use strict\";/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */var ol=require(\"util\"),as=is(),ss=n(e=>e!==null&&typeof e==\"object\"&&!Array.isArray(e),\"isObject\"),ll=n(e=>t=>e===!0?Number(t):String(t),\"transform\"),Ar=n(e=>typeof e==\"number\"||typeof e==\"string\"&&e!==\"\",\"isValidValue\"),$e=n(e=>Number.isInteger(+e),\"isNumber\"),Er=n(e=>{let t=`${e}`,r=-1;if(t[0]===\"-\"&&(t=t.slice(1)),t===\"0\")return!1;for(;t[++r]===\"0\";);return r>0},\"zeros\"),cl=n((e,t,r)=>typeof e==\"string\"||typeof t==\"string\"?!0:r.stringify===!0,\"stringify\"),ul=n((e,t,r)=>{if(t>0){let i=e[0]===\"-\"?\"-\":\"\";i&&(e=e.slice(1)),e=i+e.padStart(i?t-1:t,\"0\")}return r===!1?String(e):e},\"pad\"),ns=n((e,t)=>{let r=e[0]===\"-\"?\"-\":\"\";for(r&&(e=e.slice(1),t--);e.length<t;)e=\"0\"+e;return r?\"-\"+e:e},\"toMaxLen\"),pl=n((e,t)=>{e.negatives.sort((o,l)=>o<l?-1:o>l?1:0),e.positives.sort((o,l)=>o<l?-1:o>l?1:0);let r=t.capture?\"\":\"?:\",i=\"\",s=\"\",a;return e.positives.length&&(i=e.positives.join(\"|\")),e.negatives.length&&(s=`-(${r}${e.negatives.join(\"|\")})`),i&&s?a=`${i}|${s}`:a=i||s,t.wrap?`(${r}${a})`:a},\"toSequence\"),os=n((e,t,r,i)=>{if(r)return as(e,t,{wrap:!1,...i});let s=String.fromCharCode(e);if(e===t)return s;let a=String.fromCharCode(t);return`[${s}-${a}]`},\"toRange\"),ls=n((e,t,r)=>{if(Array.isArray(e)){let i=r.wrap===!0,s=r.capture?\"\":\"?:\";return i?`(${s}${e.join(\"|\")})`:e.join(\"|\")}return as(e,t,r)},\"toRegex\"),cs=n((...e)=>new RangeError(\"Invalid range arguments: \"+ol.inspect(...e)),\"rangeError\"),us=n((e,t,r)=>{if(r.strictRanges===!0)throw cs([e,t]);return[]},\"invalidRange\"),fl=n((e,t)=>{if(t.strictRanges===!0)throw new TypeError(`Expected step \"${e}\" to be a number`);return[]},\"invalidStep\"),dl=n((e,t,r=1,i={})=>{let s=Number(e),a=Number(t);if(!Number.isInteger(s)||!Number.isInteger(a)){if(i.strictRanges===!0)throw cs([e,t]);return[]}s===0&&(s=0),a===0&&(a=0);let o=s>a,l=String(e),c=String(t),u=String(r);r=Math.max(Math.abs(r),1);let p=Er(l)||Er(c)||Er(u),d=p?Math.max(l.length,c.length,u.length):0,f=p===!1&&cl(e,t,i)===!1,E=i.transform||ll(f);if(i.toRegex&&r===1)return os(ns(e,d),ns(t,d),!0,i);let b={negatives:[],positives:[]},y=n(T=>b[T<0?\"negatives\":\"positives\"].push(Math.abs(T)),\"push\"),x=[],R=0;for(;o?s>=a:s<=a;)i.toRegex===!0&&r>1?y(s):x.push(ul(E(s,R),d,f)),s=o?s-r:s+r,R++;return i.toRegex===!0?r>1?pl(b,i):ls(x,null,{wrap:!1,...i}):x},\"fillNumbers\"),hl=n((e,t,r=1,i={})=>{if(!$e(e)&&e.length>1||!$e(t)&&t.length>1)return us(e,t,i);let s=i.transform||(f=>String.fromCharCode(f)),a=`${e}`.charCodeAt(0),o=`${t}`.charCodeAt(0),l=a>o,c=Math.min(a,o),u=Math.max(a,o);if(i.toRegex&&r===1)return os(c,u,!1,i);let p=[],d=0;for(;l?a>=o:a<=o;)p.push(s(a,d)),a=l?a-r:a+r,d++;return i.toRegex===!0?ls(p,null,{wrap:!1,options:i}):p},\"fillLetters\"),mt=n((e,t,r,i={})=>{if(t==null&&Ar(e))return[e];if(!Ar(e)||!Ar(t))return us(e,t,i);if(typeof r==\"function\")return mt(e,t,1,{transform:r});if(ss(r))return mt(e,t,0,r);let s={...i};return s.capture===!0&&(s.wrap=!0),r=r||s.step||1,$e(r)?$e(e)&&$e(t)?dl(e,t,r,s):hl(e,t,Math.max(Math.abs(r),1),s):r!=null&&!ss(r)?fl(r,s):mt(e,t,1,r)},\"fill\");ps.exports=mt});var hs=L((gh,ds)=>{\"use strict\";var gl=xr(),fs=ht(),ml=n((e,t={})=>{let r=n((i,s={})=>{let a=fs.isInvalidBrace(s),o=i.invalid===!0&&t.escapeInvalid===!0,l=a===!0||o===!0,c=t.escapeInvalid===!0?\"\\\\\":\"\",u=\"\";if(i.isOpen===!0||i.isClose===!0)return c+i.value;if(i.type===\"open\")return l?c+i.value:\"(\";if(i.type===\"close\")return l?c+i.value:\")\";if(i.type===\"comma\")return i.prev.type===\"comma\"?\"\":l?i.value:\"|\";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let p=fs.reduce(i.nodes),d=gl(...p,{...t,wrap:!1,toRegex:!0});if(d.length!==0)return p.length>1&&d.length>1?`(${d})`:d}if(i.nodes)for(let p of i.nodes)u+=r(p,i);return u},\"walk\");return r(e)},\"compile\");ds.exports=ml});var ys=L((yh,ms)=>{\"use strict\";var yl=xr(),gs=gt(),Se=ht(),Ee=n((e=\"\",t=\"\",r=!1)=>{let i=[];if(e=[].concat(e),t=[].concat(t),!t.length)return e;if(!e.length)return r?Se.flatten(t).map(s=>`{${s}}`):t;for(let s of e)if(Array.isArray(s))for(let a of s)i.push(Ee(a,t,r));else for(let a of t)r===!0&&typeof a==\"string\"&&(a=`{${a}}`),i.push(Array.isArray(a)?Ee(s,a,r):s+a);return Se.flatten(i)},\"append\"),bl=n((e,t={})=>{let r=t.rangeLimit===void 0?1e3:t.rangeLimit,i=n((s,a={})=>{s.queue=[];let o=a,l=a.queue;for(;o.type!==\"brace\"&&o.type!==\"root\"&&o.parent;)o=o.parent,l=o.queue;if(s.invalid||s.dollar){l.push(Ee(l.pop(),gs(s,t)));return}if(s.type===\"brace\"&&s.invalid!==!0&&s.nodes.length===2){l.push(Ee(l.pop(),[\"{}\"]));return}if(s.nodes&&s.ranges>0){let d=Se.reduce(s.nodes);if(Se.exceedsLimit(...d,t.step,r))throw new RangeError(\"expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.\");let f=yl(...d,t);f.length===0&&(f=gs(s,t)),l.push(Ee(l.pop(),f)),s.nodes=[];return}let c=Se.encloseBrace(s),u=s.queue,p=s;for(;p.type!==\"brace\"&&p.type!==\"root\"&&p.parent;)p=p.parent,u=p.queue;for(let d=0;d<s.nodes.length;d++){let f=s.nodes[d];if(f.type===\"comma\"&&s.type===\"brace\"){d===1&&u.push(\"\"),u.push(\"\");continue}if(f.type===\"close\"){l.push(Ee(l.pop(),u,c));continue}if(f.value&&f.type!==\"open\"){u.push(Ee(u.pop(),f.value));continue}f.nodes&&i(f,s)}return u},\"walk\");return Se.flatten(i(e))},\"expand\");ms.exports=bl});var As=L((Ah,bs)=>{\"use strict\";bs.exports={MAX_LENGTH:1024*64,CHAR_0:\"0\",CHAR_9:\"9\",CHAR_UPPERCASE_A:\"A\",CHAR_LOWERCASE_A:\"a\",CHAR_UPPERCASE_Z:\"Z\",CHAR_LOWERCASE_Z:\"z\",CHAR_LEFT_PARENTHESES:\"(\",CHAR_RIGHT_PARENTHESES:\")\",CHAR_ASTERISK:\"*\",CHAR_AMPERSAND:\"&\",CHAR_AT:\"@\",CHAR_BACKSLASH:\"\\\\\",CHAR_BACKTICK:\"`\",CHAR_CARRIAGE_RETURN:\"\\r\",CHAR_CIRCUMFLEX_ACCENT:\"^\",CHAR_COLON:\":\",CHAR_COMMA:\",\",CHAR_DOLLAR:\"$\",CHAR_DOT:\".\",CHAR_DOUBLE_QUOTE:'\"',CHAR_EQUAL:\"=\",CHAR_EXCLAMATION_MARK:\"!\",CHAR_FORM_FEED:\"\\f\",CHAR_FORWARD_SLASH:\"/\",CHAR_HASH:\"#\",CHAR_HYPHEN_MINUS:\"-\",CHAR_LEFT_ANGLE_BRACKET:\"<\",CHAR_LEFT_CURLY_BRACE:\"{\",CHAR_LEFT_SQUARE_BRACKET:\"[\",CHAR_LINE_FEED:`\n`,CHAR_NO_BREAK_SPACE:\"\\xA0\",CHAR_PERCENT:\"%\",CHAR_PLUS:\"+\",CHAR_QUESTION_MARK:\"?\",CHAR_RIGHT_ANGLE_BRACKET:\">\",CHAR_RIGHT_CURLY_BRACE:\"}\",CHAR_RIGHT_SQUARE_BRACKET:\"]\",CHAR_SEMICOLON:\";\",CHAR_SINGLE_QUOTE:\"'\",CHAR_SPACE:\" \",CHAR_TAB:\"\t\",CHAR_UNDERSCORE:\"_\",CHAR_VERTICAL_LINE:\"|\",CHAR_ZERO_WIDTH_NOBREAK_SPACE:\"\\uFEFF\"}});var ws=L((Eh,Rs)=>{\"use strict\";var Al=gt(),{MAX_LENGTH:Es,CHAR_BACKSLASH:vr,CHAR_BACKTICK:El,CHAR_COMMA:xl,CHAR_DOT:vl,CHAR_LEFT_PARENTHESES:Rl,CHAR_RIGHT_PARENTHESES:wl,CHAR_LEFT_CURLY_BRACE:Sl,CHAR_RIGHT_CURLY_BRACE:Tl,CHAR_LEFT_SQUARE_BRACKET:xs,CHAR_RIGHT_SQUARE_BRACKET:vs,CHAR_DOUBLE_QUOTE:Cl,CHAR_SINGLE_QUOTE:_l,CHAR_NO_BREAK_SPACE:Ol,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Pl}=As(),Ll=n((e,t={})=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");let r=t||{},i=typeof r.maxLength==\"number\"?Math.min(Es,r.maxLength):Es;if(e.length>i)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${i})`);let s={type:\"root\",input:e,nodes:[]},a=[s],o=s,l=s,c=0,u=e.length,p=0,d=0,f,E={},b=n(()=>e[p++],\"advance\"),y=n(x=>{if(x.type===\"text\"&&l.type===\"dot\"&&(l.type=\"text\"),l&&l.type===\"text\"&&x.type===\"text\"){l.value+=x.value;return}return o.nodes.push(x),x.parent=o,x.prev=l,l=x,x},\"push\");for(y({type:\"bos\"});p<u;)if(o=a[a.length-1],f=b(),!(f===Pl||f===Ol)){if(f===vr){y({type:\"text\",value:(t.keepEscaping?f:\"\")+b()});continue}if(f===vs){y({type:\"text\",value:\"\\\\\"+f});continue}if(f===xs){c++;let x=!0,R;for(;p<u&&(R=b());){if(f+=R,R===xs){c++;continue}if(R===vr){f+=b();continue}if(R===vs&&(c--,c===0))break}y({type:\"text\",value:f});continue}if(f===Rl){o=y({type:\"paren\",nodes:[]}),a.push(o),y({type:\"text\",value:f});continue}if(f===wl){if(o.type!==\"paren\"){y({type:\"text\",value:f});continue}o=a.pop(),y({type:\"text\",value:f}),o=a[a.length-1];continue}if(f===Cl||f===_l||f===El){let x=f,R;for(t.keepQuotes!==!0&&(f=\"\");p<u&&(R=b());){if(R===vr){f+=R+b();continue}if(R===x){t.keepQuotes===!0&&(f+=R);break}f+=R}y({type:\"text\",value:f});continue}if(f===Sl){d++;let R={type:\"brace\",open:!0,close:!1,dollar:l.value&&l.value.slice(-1)===\"$\"||o.dollar===!0,depth:d,commas:0,ranges:0,nodes:[]};o=y(R),a.push(o),y({type:\"open\",value:f});continue}if(f===Tl){if(o.type!==\"brace\"){y({type:\"text\",value:f});continue}let x=\"close\";o=a.pop(),o.close=!0,y({type:x,value:f}),d--,o=a[a.length-1];continue}if(f===xl&&d>0){if(o.ranges>0){o.ranges=0;let x=o.nodes.shift();o.nodes=[x,{type:\"text\",value:Al(o)}]}y({type:\"comma\",value:f}),o.commas++;continue}if(f===vl&&d>0&&o.commas===0){let x=o.nodes;if(d===0||x.length===0){y({type:\"text\",value:f});continue}if(l.type===\"dot\"){if(o.range=[],l.value+=f,l.type=\"range\",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,l.type=\"text\";continue}o.ranges++,o.args=[];continue}if(l.type===\"range\"){x.pop();let R=x[x.length-1];R.value+=l.value+f,l=R,o.ranges--;continue}y({type:\"dot\",value:f});continue}y({type:\"text\",value:f})}do if(o=a.pop(),o.type!==\"root\"){o.nodes.forEach(T=>{T.nodes||(T.type===\"open\"&&(T.isOpen=!0),T.type===\"close\"&&(T.isClose=!0),T.nodes||(T.type=\"text\"),T.invalid=!0)});let x=a[a.length-1],R=x.nodes.indexOf(o);x.nodes.splice(R,1,...o.nodes)}while(a.length>0);return y({type:\"eos\"}),s},\"parse\");Rs.exports=Ll});var Cs=L((vh,Ts)=>{\"use strict\";var Ss=gt(),Nl=hs(),ql=ys(),kl=ws(),Z=n((e,t={})=>{let r=[];if(Array.isArray(e))for(let i of e){let s=Z.create(i,t);Array.isArray(s)?r.push(...s):r.push(s)}else r=[].concat(Z.create(e,t));return t&&t.expand===!0&&t.nodupes===!0&&(r=[...new Set(r)]),r},\"braces\");Z.parse=(e,t={})=>kl(e,t);Z.stringify=(e,t={})=>Ss(typeof e==\"string\"?Z.parse(e,t):e,t);Z.compile=(e,t={})=>(typeof e==\"string\"&&(e=Z.parse(e,t)),Nl(e,t));Z.expand=(e,t={})=>{typeof e==\"string\"&&(e=Z.parse(e,t));let r=ql(e,t);return t.noempty===!0&&(r=r.filter(Boolean)),t.nodupes===!0&&(r=[...new Set(r)]),r};Z.create=(e,t={})=>e===\"\"||e.length<3?[e]:t.expand!==!0?Z.compile(e,t):Z.expand(e,t);Ts.exports=Z});var Be=L((wh,Ns)=>{\"use strict\";var Dl=require(\"path\"),ce=\"\\\\\\\\/\",_s=`[^${ce}]`,he=\"\\\\.\",Il=\"\\\\+\",Hl=\"\\\\?\",yt=\"\\\\/\",Ml=\"(?=.)\",Os=\"[^/]\",Rr=`(?:${yt}|$)`,Ps=`(?:^|${yt})`,wr=`${he}{1,2}${Rr}`,Ul=`(?!${he})`,Fl=`(?!${Ps}${wr})`,$l=`(?!${he}{0,1}${Rr})`,Bl=`(?!${wr})`,zl=`[^.${yt}]`,Gl=`${Os}*?`,Ls={DOT_LITERAL:he,PLUS_LITERAL:Il,QMARK_LITERAL:Hl,SLASH_LITERAL:yt,ONE_CHAR:Ml,QMARK:Os,END_ANCHOR:Rr,DOTS_SLASH:wr,NO_DOT:Ul,NO_DOTS:Fl,NO_DOT_SLASH:$l,NO_DOTS_SLASH:Bl,QMARK_NO_DOT:zl,STAR:Gl,START_ANCHOR:Ps},Vl={...Ls,SLASH_LITERAL:`[${ce}]`,QMARK:_s,STAR:`${_s}*?`,DOTS_SLASH:`${he}{1,2}(?:[${ce}]|$)`,NO_DOT:`(?!${he})`,NO_DOTS:`(?!(?:^|[${ce}])${he}{1,2}(?:[${ce}]|$))`,NO_DOT_SLASH:`(?!${he}{0,1}(?:[${ce}]|$))`,NO_DOTS_SLASH:`(?!${he}{1,2}(?:[${ce}]|$))`,QMARK_NO_DOT:`[^.${ce}]`,START_ANCHOR:`(?:^|[${ce}])`,END_ANCHOR:`(?:[${ce}]|$)`},jl={alnum:\"a-zA-Z0-9\",alpha:\"a-zA-Z\",ascii:\"\\\\x00-\\\\x7F\",blank:\" \\\\t\",cntrl:\"\\\\x00-\\\\x1F\\\\x7F\",digit:\"0-9\",graph:\"\\\\x21-\\\\x7E\",lower:\"a-z\",print:\"\\\\x20-\\\\x7E \",punct:\"\\\\-!\\\"#$%&'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~\",space:\" \\\\t\\\\r\\\\n\\\\v\\\\f\",upper:\"A-Z\",word:\"A-Za-z0-9_\",xdigit:\"A-Fa-f0-9\"};Ns.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:jl,REGEX_BACKSLASH:/\\\\(?![*+?^${}(|)[\\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\\].,$*+?^{}()|\\\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\\\?)((\\W)(\\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,REPLACEMENTS:{\"***\":\"*\",\"**/**\":\"**\",\"**/**/**\":\"**\"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:Dl.sep,extglobChars(e){return{\"!\":{type:\"negate\",open:\"(?:(?!(?:\",close:`))${e.STAR})`},\"?\":{type:\"qmark\",open:\"(?:\",close:\")?\"},\"+\":{type:\"plus\",open:\"(?:\",close:\")+\"},\"*\":{type:\"star\",open:\"(?:\",close:\")*\"},\"@\":{type:\"at\",open:\"(?:\",close:\")\"}}},globChars(e){return e===!0?Vl:Ls}}});var ze=L(Y=>{\"use strict\";var Ql=require(\"path\"),Kl=process.platform===\"win32\",{REGEX_BACKSLASH:Wl,REGEX_REMOVE_BACKSLASH:Yl,REGEX_SPECIAL_CHARS:Xl,REGEX_SPECIAL_CHARS_GLOBAL:Zl}=Be();Y.isObject=e=>e!==null&&typeof e==\"object\"&&!Array.isArray(e);Y.hasRegexChars=e=>Xl.test(e);Y.isRegexChar=e=>e.length===1&&Y.hasRegexChars(e);Y.escapeRegex=e=>e.replace(Zl,\"\\\\$1\");Y.toPosixSlashes=e=>e.replace(Wl,\"/\");Y.removeBackslashes=e=>e.replace(Yl,t=>t===\"\\\\\"?\"\":t);Y.supportsLookbehinds=()=>{let e=process.version.slice(1).split(\".\").map(Number);return e.length===3&&e[0]>=9||e[0]===8&&e[1]>=10};Y.isWindows=e=>e&&typeof e.windows==\"boolean\"?e.windows:Kl===!0||Ql.sep===\"\\\\\";Y.escapeLast=(e,t,r)=>{let i=e.lastIndexOf(t,r);return i===-1?e:e[i-1]===\"\\\\\"?Y.escapeLast(e,t,i-1):`${e.slice(0,i)}\\\\${e.slice(i)}`};Y.removePrefix=(e,t={})=>{let r=e;return r.startsWith(\"./\")&&(r=r.slice(2),t.prefix=\"./\"),r};Y.wrapOutput=(e,t={},r={})=>{let i=r.contains?\"\":\"^\",s=r.contains?\"\":\"$\",a=`${i}(?:${e})${s}`;return t.negated===!0&&(a=`(?:^(?!${a}).*$)`),a}});var Fs=L((Th,Us)=>{\"use strict\";var qs=ze(),{CHAR_ASTERISK:Sr,CHAR_AT:Jl,CHAR_BACKWARD_SLASH:Ge,CHAR_COMMA:ec,CHAR_DOT:Tr,CHAR_EXCLAMATION_MARK:Cr,CHAR_FORWARD_SLASH:Ms,CHAR_LEFT_CURLY_BRACE:_r,CHAR_LEFT_PARENTHESES:Or,CHAR_LEFT_SQUARE_BRACKET:tc,CHAR_PLUS:rc,CHAR_QUESTION_MARK:ks,CHAR_RIGHT_CURLY_BRACE:ic,CHAR_RIGHT_PARENTHESES:Ds,CHAR_RIGHT_SQUARE_BRACKET:sc}=Be(),Is=n(e=>e===Ms||e===Ge,\"isPathSeparator\"),Hs=n(e=>{e.isPrefix!==!0&&(e.depth=e.isGlobstar?1/0:1)},\"depth\"),nc=n((e,t)=>{let r=t||{},i=e.length-1,s=r.parts===!0||r.scanToEnd===!0,a=[],o=[],l=[],c=e,u=-1,p=0,d=0,f=!1,E=!1,b=!1,y=!1,x=!1,R=!1,T=!1,w=!1,q=!1,k=!1,V=0,D,S,_={value:\"\",depth:0,isGlob:!1},I=n(()=>u>=i,\"eos\"),m=n(()=>c.charCodeAt(u+1),\"peek\"),U=n(()=>(D=S,c.charCodeAt(++u)),\"advance\");for(;u<i;){S=U();let Q;if(S===Ge){T=_.backslashes=!0,S=U(),S===_r&&(R=!0);continue}if(R===!0||S===_r){for(V++;I()!==!0&&(S=U());){if(S===Ge){T=_.backslashes=!0,U();continue}if(S===_r){V++;continue}if(R!==!0&&S===Tr&&(S=U())===Tr){if(f=_.isBrace=!0,b=_.isGlob=!0,k=!0,s===!0)continue;break}if(R!==!0&&S===ec){if(f=_.isBrace=!0,b=_.isGlob=!0,k=!0,s===!0)continue;break}if(S===ic&&(V--,V===0)){R=!1,f=_.isBrace=!0,k=!0;break}}if(s===!0)continue;break}if(S===Ms){if(a.push(u),o.push(_),_={value:\"\",depth:0,isGlob:!1},k===!0)continue;if(D===Tr&&u===p+1){p+=2;continue}d=u+1;continue}if(r.noext!==!0&&(S===rc||S===Jl||S===Sr||S===ks||S===Cr)===!0&&m()===Or){if(b=_.isGlob=!0,y=_.isExtglob=!0,k=!0,S===Cr&&u===p&&(q=!0),s===!0){for(;I()!==!0&&(S=U());){if(S===Ge){T=_.backslashes=!0,S=U();continue}if(S===Ds){b=_.isGlob=!0,k=!0;break}}continue}break}if(S===Sr){if(D===Sr&&(x=_.isGlobstar=!0),b=_.isGlob=!0,k=!0,s===!0)continue;break}if(S===ks){if(b=_.isGlob=!0,k=!0,s===!0)continue;break}if(S===tc){for(;I()!==!0&&(Q=U());){if(Q===Ge){T=_.backslashes=!0,U();continue}if(Q===sc){E=_.isBracket=!0,b=_.isGlob=!0,k=!0;break}}if(s===!0)continue;break}if(r.nonegate!==!0&&S===Cr&&u===p){w=_.negated=!0,p++;continue}if(r.noparen!==!0&&S===Or){if(b=_.isGlob=!0,s===!0){for(;I()!==!0&&(S=U());){if(S===Or){T=_.backslashes=!0,S=U();continue}if(S===Ds){k=!0;break}}continue}break}if(b===!0){if(k=!0,s===!0)continue;break}}r.noext===!0&&(y=!1,b=!1);let H=c,ge=\"\",h=\"\";p>0&&(ge=c.slice(0,p),c=c.slice(p),d-=p),H&&b===!0&&d>0?(H=c.slice(0,d),h=c.slice(d)):b===!0?(H=\"\",h=c):H=c,H&&H!==\"\"&&H!==\"/\"&&H!==c&&Is(H.charCodeAt(H.length-1))&&(H=H.slice(0,-1)),r.unescape===!0&&(h&&(h=qs.removeBackslashes(h)),H&&T===!0&&(H=qs.removeBackslashes(H)));let g={prefix:ge,input:e,start:p,base:H,glob:h,isBrace:f,isBracket:E,isGlob:b,isExtglob:y,isGlobstar:x,negated:w,negatedExtglob:q};if(r.tokens===!0&&(g.maxDepth=0,Is(S)||o.push(_),g.tokens=o),r.parts===!0||r.tokens===!0){let Q;for(let P=0;P<a.length;P++){let ae=Q?Q+1:p,oe=a[P],X=e.slice(ae,oe);r.tokens&&(P===0&&p!==0?(o[P].isPrefix=!0,o[P].value=ge):o[P].value=X,Hs(o[P]),g.maxDepth+=o[P].depth),(P!==0||X!==\"\")&&l.push(X),Q=oe}if(Q&&Q+1<e.length){let P=e.slice(Q+1);l.push(P),r.tokens&&(o[o.length-1].value=P,Hs(o[o.length-1]),g.maxDepth+=o[o.length-1].depth)}g.slashes=a,g.parts=l}return g},\"scan\");Us.exports=nc});var zs=L((_h,Bs)=>{\"use strict\";var bt=Be(),J=ze(),{MAX_LENGTH:At,POSIX_REGEX_SOURCE:ac,REGEX_NON_SPECIAL_CHARS:oc,REGEX_SPECIAL_CHARS_BACKREF:lc,REPLACEMENTS:$s}=bt,cc=n((e,t)=>{if(typeof t.expandRange==\"function\")return t.expandRange(...e,t);e.sort();let r=`[${e.join(\"-\")}]`;try{new RegExp(r)}catch{return e.map(s=>J.escapeRegex(s)).join(\"..\")}return r},\"expandRange\"),Te=n((e,t)=>`Missing ${e}: \"${t}\" - use \"\\\\\\\\${t}\" to match literal characters`,\"syntaxError\"),Pr=n((e,t)=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");e=$s[e]||e;let r={...t},i=typeof r.maxLength==\"number\"?Math.min(At,r.maxLength):At,s=e.length;if(s>i)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${i}`);let a={type:\"bos\",value:\"\",output:r.prepend||\"\"},o=[a],l=r.capture?\"\":\"?:\",c=J.isWindows(t),u=bt.globChars(c),p=bt.extglobChars(u),{DOT_LITERAL:d,PLUS_LITERAL:f,SLASH_LITERAL:E,ONE_CHAR:b,DOTS_SLASH:y,NO_DOT:x,NO_DOT_SLASH:R,NO_DOTS_SLASH:T,QMARK:w,QMARK_NO_DOT:q,STAR:k,START_ANCHOR:V}=u,D=n(v=>`(${l}(?:(?!${V}${v.dot?y:d}).)*?)`,\"globstar\"),S=r.dot?\"\":x,_=r.dot?w:q,I=r.bash===!0?D(r):k;r.capture&&(I=`(${I})`),typeof r.noext==\"boolean\"&&(r.noextglob=r.noext);let m={input:e,index:-1,start:0,dot:r.dot===!0,consumed:\"\",output:\"\",prefix:\"\",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};e=J.removePrefix(e,m),s=e.length;let U=[],H=[],ge=[],h=a,g,Q=n(()=>m.index===s-1,\"eos\"),P=m.peek=(v=1)=>e[m.index+v],ae=m.advance=()=>e[++m.index]||\"\",oe=n(()=>e.slice(m.index+1),\"remaining\"),X=n((v=\"\",M=0)=>{m.consumed+=v,m.index+=M},\"consume\"),tt=n(v=>{m.output+=v.output!=null?v.output:v.value,X(v.value)},\"append\"),ba=n(()=>{let v=1;for(;P()===\"!\"&&(P(2)!==\"(\"||P(3)===\"?\");)ae(),m.start++,v++;return v%2===0?!1:(m.negated=!0,m.start++,!0)},\"negate\"),rt=n(v=>{m[v]++,ge.push(v)},\"increment\"),be=n(v=>{m[v]--,ge.pop()},\"decrement\"),O=n(v=>{if(h.type===\"globstar\"){let M=m.braces>0&&(v.type===\"comma\"||v.type===\"brace\"),A=v.extglob===!0||U.length&&(v.type===\"pipe\"||v.type===\"paren\");v.type!==\"slash\"&&v.type!==\"paren\"&&!M&&!A&&(m.output=m.output.slice(0,-h.output.length),h.type=\"star\",h.value=\"*\",h.output=I,m.output+=h.output)}if(U.length&&v.type!==\"paren\"&&(U[U.length-1].inner+=v.value),(v.value||v.output)&&tt(v),h&&h.type===\"text\"&&v.type===\"text\"){h.value+=v.value,h.output=(h.output||\"\")+v.value;return}v.prev=h,o.push(v),h=v},\"push\"),it=n((v,M)=>{let A={...p[M],conditions:1,inner:\"\"};A.prev=h,A.parens=m.parens,A.output=m.output;let C=(r.capture?\"(\":\"\")+A.open;rt(\"parens\"),O({type:v,value:M,output:m.output?\"\":b}),O({type:\"paren\",extglob:!0,value:ae(),output:C}),U.push(A)},\"extglobOpen\"),Aa=n(v=>{let M=v.close+(r.capture?\")\":\"\"),A;if(v.type===\"negate\"){let C=I;if(v.inner&&v.inner.length>1&&v.inner.includes(\"/\")&&(C=D(r)),(C!==I||Q()||/^\\)+$/.test(oe()))&&(M=v.close=`)$))${C}`),v.inner.includes(\"*\")&&(A=oe())&&/^\\.[^\\\\/.]+$/.test(A)){let $=Pr(A,{...t,fastpaths:!1}).output;M=v.close=`)${$})${C})`}v.prev.type===\"bos\"&&(m.negatedExtglob=!0)}O({type:\"paren\",extglob:!0,value:g,output:M}),be(\"parens\")},\"extglobClose\");if(r.fastpaths!==!1&&!/(^[*!]|[/()[\\]{}\"])/.test(e)){let v=!1,M=e.replace(lc,(A,C,$,K,j,Vt)=>K===\"\\\\\"?(v=!0,A):K===\"?\"?C?C+K+(j?w.repeat(j.length):\"\"):Vt===0?_+(j?w.repeat(j.length):\"\"):w.repeat($.length):K===\".\"?d.repeat($.length):K===\"*\"?C?C+K+(j?I:\"\"):I:C?A:`\\\\${A}`);return v===!0&&(r.unescape===!0?M=M.replace(/\\\\/g,\"\"):M=M.replace(/\\\\+/g,A=>A.length%2===0?\"\\\\\\\\\":A?\"\\\\\":\"\")),M===e&&r.contains===!0?(m.output=e,m):(m.output=J.wrapOutput(M,m,t),m)}for(;!Q();){if(g=ae(),g===\"\\0\")continue;if(g===\"\\\\\"){let A=P();if(A===\"/\"&&r.bash!==!0||A===\".\"||A===\";\")continue;if(!A){g+=\"\\\\\",O({type:\"text\",value:g});continue}let C=/^\\\\+/.exec(oe()),$=0;if(C&&C[0].length>2&&($=C[0].length,m.index+=$,$%2!==0&&(g+=\"\\\\\")),r.unescape===!0?g=ae():g+=ae(),m.brackets===0){O({type:\"text\",value:g});continue}}if(m.brackets>0&&(g!==\"]\"||h.value===\"[\"||h.value===\"[^\")){if(r.posix!==!1&&g===\":\"){let A=h.value.slice(1);if(A.includes(\"[\")&&(h.posix=!0,A.includes(\":\"))){let C=h.value.lastIndexOf(\"[\"),$=h.value.slice(0,C),K=h.value.slice(C+2),j=ac[K];if(j){h.value=$+j,m.backtrack=!0,ae(),!a.output&&o.indexOf(h)===1&&(a.output=b);continue}}}(g===\"[\"&&P()!==\":\"||g===\"-\"&&P()===\"]\")&&(g=`\\\\${g}`),g===\"]\"&&(h.value===\"[\"||h.value===\"[^\")&&(g=`\\\\${g}`),r.posix===!0&&g===\"!\"&&h.value===\"[\"&&(g=\"^\"),h.value+=g,tt({value:g});continue}if(m.quotes===1&&g!=='\"'){g=J.escapeRegex(g),h.value+=g,tt({value:g});continue}if(g==='\"'){m.quotes=m.quotes===1?0:1,r.keepQuotes===!0&&O({type:\"text\",value:g});continue}if(g===\"(\"){rt(\"parens\"),O({type:\"paren\",value:g});continue}if(g===\")\"){if(m.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Te(\"opening\",\"(\"));let A=U[U.length-1];if(A&&m.parens===A.parens+1){Aa(U.pop());continue}O({type:\"paren\",value:g,output:m.parens?\")\":\"\\\\)\"}),be(\"parens\");continue}if(g===\"[\"){if(r.nobracket===!0||!oe().includes(\"]\")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\"]\"));g=`\\\\${g}`}else rt(\"brackets\");O({type:\"bracket\",value:g});continue}if(g===\"]\"){if(r.nobracket===!0||h&&h.type===\"bracket\"&&h.value.length===1){O({type:\"text\",value:g,output:`\\\\${g}`});continue}if(m.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"opening\",\"[\"));O({type:\"text\",value:g,output:`\\\\${g}`});continue}be(\"brackets\");let A=h.value.slice(1);if(h.posix!==!0&&A[0]===\"^\"&&!A.includes(\"/\")&&(g=`/${g}`),h.value+=g,tt({value:g}),r.literalBrackets===!1||J.hasRegexChars(A))continue;let C=J.escapeRegex(h.value);if(m.output=m.output.slice(0,-h.value.length),r.literalBrackets===!0){m.output+=C,h.value=C;continue}h.value=`(${l}${C}|${h.value})`,m.output+=h.value;continue}if(g===\"{\"&&r.nobrace!==!0){rt(\"braces\");let A={type:\"brace\",value:g,output:\"(\",outputIndex:m.output.length,tokensIndex:m.tokens.length};H.push(A),O(A);continue}if(g===\"}\"){let A=H[H.length-1];if(r.nobrace===!0||!A){O({type:\"text\",value:g,output:g});continue}let C=\")\";if(A.dots===!0){let $=o.slice(),K=[];for(let j=$.length-1;j>=0&&(o.pop(),$[j].type!==\"brace\");j--)$[j].type!==\"dots\"&&K.unshift($[j].value);C=cc(K,r),m.backtrack=!0}if(A.comma!==!0&&A.dots!==!0){let $=m.output.slice(0,A.outputIndex),K=m.tokens.slice(A.tokensIndex);A.value=A.output=\"\\\\{\",g=C=\"\\\\}\",m.output=$;for(let j of K)m.output+=j.output||j.value}O({type:\"brace\",value:g,output:C}),be(\"braces\"),H.pop();continue}if(g===\"|\"){U.length>0&&U[U.length-1].conditions++,O({type:\"text\",value:g});continue}if(g===\",\"){let A=g,C=H[H.length-1];C&&ge[ge.length-1]===\"braces\"&&(C.comma=!0,A=\"|\"),O({type:\"comma\",value:g,output:A});continue}if(g===\"/\"){if(h.type===\"dot\"&&m.index===m.start+1){m.start=m.index+1,m.consumed=\"\",m.output=\"\",o.pop(),h=a;continue}O({type:\"slash\",value:g,output:E});continue}if(g===\".\"){if(m.braces>0&&h.type===\"dot\"){h.value===\".\"&&(h.output=d);let A=H[H.length-1];h.type=\"dots\",h.output+=g,h.value+=g,A.dots=!0;continue}if(m.braces+m.parens===0&&h.type!==\"bos\"&&h.type!==\"slash\"){O({type:\"text\",value:g,output:d});continue}O({type:\"dot\",value:g,output:d});continue}if(g===\"?\"){if(!(h&&h.value===\"(\")&&r.noextglob!==!0&&P()===\"(\"&&P(2)!==\"?\"){it(\"qmark\",g);continue}if(h&&h.type===\"paren\"){let C=P(),$=g;if(C===\"<\"&&!J.supportsLookbehinds())throw new Error(\"Node.js v10 or higher is required for regex lookbehinds\");(h.value===\"(\"&&!/[!=<:]/.test(C)||C===\"<\"&&!/<([!=]|\\w+>)/.test(oe()))&&($=`\\\\${g}`),O({type:\"text\",value:g,output:$});continue}if(r.dot!==!0&&(h.type===\"slash\"||h.type===\"bos\")){O({type:\"qmark\",value:g,output:q});continue}O({type:\"qmark\",value:g,output:w});continue}if(g===\"!\"){if(r.noextglob!==!0&&P()===\"(\"&&(P(2)!==\"?\"||!/[!=<:]/.test(P(3)))){it(\"negate\",g);continue}if(r.nonegate!==!0&&m.index===0){ba();continue}}if(g===\"+\"){if(r.noextglob!==!0&&P()===\"(\"&&P(2)!==\"?\"){it(\"plus\",g);continue}if(h&&h.value===\"(\"||r.regex===!1){O({type:\"plus\",value:g,output:f});continue}if(h&&(h.type===\"bracket\"||h.type===\"paren\"||h.type===\"brace\")||m.parens>0){O({type:\"plus\",value:g});continue}O({type:\"plus\",value:f});continue}if(g===\"@\"){if(r.noextglob!==!0&&P()===\"(\"&&P(2)!==\"?\"){O({type:\"at\",extglob:!0,value:g,output:\"\"});continue}O({type:\"text\",value:g});continue}if(g!==\"*\"){(g===\"$\"||g===\"^\")&&(g=`\\\\${g}`);let A=oc.exec(oe());A&&(g+=A[0],m.index+=A[0].length),O({type:\"text\",value:g});continue}if(h&&(h.type===\"globstar\"||h.star===!0)){h.type=\"star\",h.star=!0,h.value+=g,h.output=I,m.backtrack=!0,m.globstar=!0,X(g);continue}let v=oe();if(r.noextglob!==!0&&/^\\([^?]/.test(v)){it(\"star\",g);continue}if(h.type===\"star\"){if(r.noglobstar===!0){X(g);continue}let A=h.prev,C=A.prev,$=A.type===\"slash\"||A.type===\"bos\",K=C&&(C.type===\"star\"||C.type===\"globstar\");if(r.bash===!0&&(!$||v[0]&&v[0]!==\"/\")){O({type:\"star\",value:g,output:\"\"});continue}let j=m.braces>0&&(A.type===\"comma\"||A.type===\"brace\"),Vt=U.length&&(A.type===\"pipe\"||A.type===\"paren\");if(!$&&A.type!==\"paren\"&&!j&&!Vt){O({type:\"star\",value:g,output:\"\"});continue}for(;v.slice(0,3)===\"/**\";){let st=e[m.index+4];if(st&&st!==\"/\")break;v=v.slice(3),X(\"/**\",3)}if(A.type===\"bos\"&&Q()){h.type=\"globstar\",h.value+=g,h.output=D(r),m.output=h.output,m.globstar=!0,X(g);continue}if(A.type===\"slash\"&&A.prev.type!==\"bos\"&&!K&&Q()){m.output=m.output.slice(0,-(A.output+h.output).length),A.output=`(?:${A.output}`,h.type=\"globstar\",h.output=D(r)+(r.strictSlashes?\")\":\"|$)\"),h.value+=g,m.globstar=!0,m.output+=A.output+h.output,X(g);continue}if(A.type===\"slash\"&&A.prev.type!==\"bos\"&&v[0]===\"/\"){let st=v[1]!==void 0?\"|$\":\"\";m.output=m.output.slice(0,-(A.output+h.output).length),A.output=`(?:${A.output}`,h.type=\"globstar\",h.output=`${D(r)}${E}|${E}${st})`,h.value+=g,m.output+=A.output+h.output,m.globstar=!0,X(g+ae()),O({type:\"slash\",value:\"/\",output:\"\"});continue}if(A.type===\"bos\"&&v[0]===\"/\"){h.type=\"globstar\",h.value+=g,h.output=`(?:^|${E}|${D(r)}${E})`,m.output=h.output,m.globstar=!0,X(g+ae()),O({type:\"slash\",value:\"/\",output:\"\"});continue}m.output=m.output.slice(0,-h.output.length),h.type=\"globstar\",h.output=D(r),h.value+=g,m.output+=h.output,m.globstar=!0,X(g);continue}let M={type:\"star\",value:g,output:I};if(r.bash===!0){M.output=\".*?\",(h.type===\"bos\"||h.type===\"slash\")&&(M.output=S+M.output),O(M);continue}if(h&&(h.type===\"bracket\"||h.type===\"paren\")&&r.regex===!0){M.output=g,O(M);continue}(m.index===m.start||h.type===\"slash\"||h.type===\"dot\")&&(h.type===\"dot\"?(m.output+=R,h.output+=R):r.dot===!0?(m.output+=T,h.output+=T):(m.output+=S,h.output+=S),P()!==\"*\"&&(m.output+=b,h.output+=b)),O(M)}for(;m.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\"]\"));m.output=J.escapeLast(m.output,\"[\"),be(\"brackets\")}for(;m.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\")\"));m.output=J.escapeLast(m.output,\"(\"),be(\"parens\")}for(;m.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\"}\"));m.output=J.escapeLast(m.output,\"{\"),be(\"braces\")}if(r.strictSlashes!==!0&&(h.type===\"star\"||h.type===\"bracket\")&&O({type:\"maybe_slash\",value:\"\",output:`${E}?`}),m.backtrack===!0){m.output=\"\";for(let v of m.tokens)m.output+=v.output!=null?v.output:v.value,v.suffix&&(m.output+=v.suffix)}return m},\"parse\");Pr.fastpaths=(e,t)=>{let r={...t},i=typeof r.maxLength==\"number\"?Math.min(At,r.maxLength):At,s=e.length;if(s>i)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${i}`);e=$s[e]||e;let a=J.isWindows(t),{DOT_LITERAL:o,SLASH_LITERAL:l,ONE_CHAR:c,DOTS_SLASH:u,NO_DOT:p,NO_DOTS:d,NO_DOTS_SLASH:f,STAR:E,START_ANCHOR:b}=bt.globChars(a),y=r.dot?d:p,x=r.dot?f:p,R=r.capture?\"\":\"?:\",T={negated:!1,prefix:\"\"},w=r.bash===!0?\".*?\":E;r.capture&&(w=`(${w})`);let q=n(S=>S.noglobstar===!0?w:`(${R}(?:(?!${b}${S.dot?u:o}).)*?)`,\"globstar\"),k=n(S=>{switch(S){case\"*\":return`${y}${c}${w}`;case\".*\":return`${o}${c}${w}`;case\"*.*\":return`${y}${w}${o}${c}${w}`;case\"*/*\":return`${y}${w}${l}${c}${x}${w}`;case\"**\":return y+q(r);case\"**/*\":return`(?:${y}${q(r)}${l})?${x}${c}${w}`;case\"**/*.*\":return`(?:${y}${q(r)}${l})?${x}${w}${o}${c}${w}`;case\"**/.*\":return`(?:${y}${q(r)}${l})?${o}${c}${w}`;default:{let _=/^(.*?)\\.(\\w+)$/.exec(S);if(!_)return;let I=k(_[1]);return I?I+o+_[2]:void 0}}},\"create\"),V=J.removePrefix(e,T),D=k(V);return D&&r.strictSlashes!==!0&&(D+=`${l}?`),D};Bs.exports=Pr});var Vs=L((Ph,Gs)=>{\"use strict\";var uc=require(\"path\"),pc=Fs(),Lr=zs(),Nr=ze(),fc=Be(),dc=n(e=>e&&typeof e==\"object\"&&!Array.isArray(e),\"isObject\"),z=n((e,t,r=!1)=>{if(Array.isArray(e)){let p=e.map(f=>z(f,t,r));return n(f=>{for(let E of p){let b=E(f);if(b)return b}return!1},\"arrayMatcher\")}let i=dc(e)&&e.tokens&&e.input;if(e===\"\"||typeof e!=\"string\"&&!i)throw new TypeError(\"Expected pattern to be a non-empty string\");let s=t||{},a=Nr.isWindows(t),o=i?z.compileRe(e,t):z.makeRe(e,t,!1,!0),l=o.state;delete o.state;let c=n(()=>!1,\"isIgnored\");if(s.ignore){let p={...t,ignore:null,onMatch:null,onResult:null};c=z(s.ignore,p,r)}let u=n((p,d=!1)=>{let{isMatch:f,match:E,output:b}=z.test(p,o,t,{glob:e,posix:a}),y={glob:e,state:l,regex:o,posix:a,input:p,output:b,match:E,isMatch:f};return typeof s.onResult==\"function\"&&s.onResult(y),f===!1?(y.isMatch=!1,d?y:!1):c(p)?(typeof s.onIgnore==\"function\"&&s.onIgnore(y),y.isMatch=!1,d?y:!1):(typeof s.onMatch==\"function\"&&s.onMatch(y),d?y:!0)},\"matcher\");return r&&(u.state=l),u},\"picomatch\");z.test=(e,t,r,{glob:i,posix:s}={})=>{if(typeof e!=\"string\")throw new TypeError(\"Expected input to be a string\");if(e===\"\")return{isMatch:!1,output:\"\"};let a=r||{},o=a.format||(s?Nr.toPosixSlashes:null),l=e===i,c=l&&o?o(e):e;return l===!1&&(c=o?o(e):e,l=c===i),(l===!1||a.capture===!0)&&(a.matchBase===!0||a.basename===!0?l=z.matchBase(e,t,r,s):l=t.exec(c)),{isMatch:!!l,match:l,output:c}};z.matchBase=(e,t,r,i=Nr.isWindows(r))=>(t instanceof RegExp?t:z.makeRe(t,r)).test(uc.basename(e));z.isMatch=(e,t,r)=>z(t,r)(e);z.parse=(e,t)=>Array.isArray(e)?e.map(r=>z.parse(r,t)):Lr(e,{...t,fastpaths:!1});z.scan=(e,t)=>pc(e,t);z.compileRe=(e,t,r=!1,i=!1)=>{if(r===!0)return e.output;let s=t||{},a=s.contains?\"\":\"^\",o=s.contains?\"\":\"$\",l=`${a}(?:${e.output})${o}`;e&&e.negated===!0&&(l=`^(?!${l}).*$`);let c=z.toRegex(l,t);return i===!0&&(c.state=e),c};z.makeRe=(e,t={},r=!1,i=!1)=>{if(!e||typeof e!=\"string\")throw new TypeError(\"Expected a non-empty string\");let s={negated:!1,fastpaths:!0};return t.fastpaths!==!1&&(e[0]===\".\"||e[0]===\"*\")&&(s.output=Lr.fastpaths(e,t)),s.output||(s=Lr(e,t)),z.compileRe(s,t,r,i)};z.toRegex=(e,t)=>{try{let r=t||{};return new RegExp(e,r.flags||(r.nocase?\"i\":\"\"))}catch(r){if(t&&t.debug===!0)throw r;return/$^/}};z.constants=fc;Gs.exports=z});var Qs=L((Nh,js)=>{\"use strict\";js.exports=Vs()});var Zs=L((qh,Xs)=>{\"use strict\";var Ws=require(\"util\"),Ys=Cs(),ue=Qs(),qr=ze(),Ks=n(e=>e===\"\"||e===\"./\",\"isEmptyString\"),F=n((e,t,r)=>{t=[].concat(t),e=[].concat(e);let i=new Set,s=new Set,a=new Set,o=0,l=n(p=>{a.add(p.output),r&&r.onResult&&r.onResult(p)},\"onResult\");for(let p=0;p<t.length;p++){let d=ue(String(t[p]),{...r,onResult:l},!0),f=d.state.negated||d.state.negatedExtglob;f&&o++;for(let E of e){let b=d(E,!0);(f?!b.isMatch:b.isMatch)&&(f?i.add(b.output):(i.delete(b.output),s.add(b.output)))}}let u=(o===t.length?[...a]:[...s]).filter(p=>!i.has(p));if(r&&u.length===0){if(r.failglob===!0)throw new Error(`No matches found for \"${t.join(\", \")}\"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?t.map(p=>p.replace(/\\\\/g,\"\")):t}return u},\"micromatch\");F.match=F;F.matcher=(e,t)=>ue(e,t);F.isMatch=(e,t,r)=>ue(t,r)(e);F.any=F.isMatch;F.not=(e,t,r={})=>{t=[].concat(t).map(String);let i=new Set,s=[],a=n(l=>{r.onResult&&r.onResult(l),s.push(l.output)},\"onResult\"),o=new Set(F(e,t,{...r,onResult:a}));for(let l of s)o.has(l)||i.add(l);return[...i]};F.contains=(e,t,r)=>{if(typeof e!=\"string\")throw new TypeError(`Expected a string: \"${Ws.inspect(e)}\"`);if(Array.isArray(t))return t.some(i=>F.contains(e,i,r));if(typeof t==\"string\"){if(Ks(e)||Ks(t))return!1;if(e.includes(t)||e.startsWith(\"./\")&&e.slice(2).includes(t))return!0}return F.isMatch(e,t,{...r,contains:!0})};F.matchKeys=(e,t,r)=>{if(!qr.isObject(e))throw new TypeError(\"Expected the first argument to be an object\");let i=F(Object.keys(e),t,r),s={};for(let a of i)s[a]=e[a];return s};F.some=(e,t,r)=>{let i=[].concat(e);for(let s of[].concat(t)){let a=ue(String(s),r);if(i.some(o=>a(o)))return!0}return!1};F.every=(e,t,r)=>{let i=[].concat(e);for(let s of[].concat(t)){let a=ue(String(s),r);if(!i.every(o=>a(o)))return!1}return!0};F.all=(e,t,r)=>{if(typeof e!=\"string\")throw new TypeError(`Expected a string: \"${Ws.inspect(e)}\"`);return[].concat(t).every(i=>ue(i,r)(e))};F.capture=(e,t,r)=>{let i=qr.isWindows(r),a=ue.makeRe(String(e),{...r,capture:!0}).exec(i?qr.toPosixSlashes(t):t);if(a)return a.slice(1).map(o=>o===void 0?\"\":o)};F.makeRe=(...e)=>ue.makeRe(...e);F.scan=(...e)=>ue.scan(...e);F.parse=(e,t)=>{let r=[];for(let i of[].concat(e||[]))for(let s of Ys(String(i),t))r.push(ue.parse(s,t));return r};F.braces=(e,t)=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");return t&&t.nobrace===!0||!/\\{.*\\}/.test(e)?[e]:Ys(e,t)};F.braceExpand=(e,t)=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");return F.braces(e,{...t,expand:!0})};Xs.exports=F});var rn=L((Dh,tn)=>{\"use strict\";var hc=n(function(t){return gc(t)&&!mc(t)},\"isMergeableObject\");function gc(e){return!!e&&typeof e==\"object\"}n(gc,\"isNonNullObject\");function mc(e){var t=Object.prototype.toString.call(e);return t===\"[object RegExp]\"||t===\"[object Date]\"||Ac(e)}n(mc,\"isSpecial\");var yc=typeof Symbol==\"function\"&&Symbol.for,bc=yc?Symbol.for(\"react.element\"):60103;function Ac(e){return e.$$typeof===bc}n(Ac,\"isReactElement\");function Ec(e){return Array.isArray(e)?[]:{}}n(Ec,\"emptyTarget\");function Ve(e,t){return t.clone!==!1&&t.isMergeableObject(e)?Ce(Ec(e),e,t):e}n(Ve,\"cloneUnlessOtherwiseSpecified\");function xc(e,t,r){return e.concat(t).map(function(i){return Ve(i,r)})}n(xc,\"defaultArrayMerge\");function vc(e,t){if(!t.customMerge)return Ce;var r=t.customMerge(e);return typeof r==\"function\"?r:Ce}n(vc,\"getMergeFunction\");function Rc(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[]}n(Rc,\"getEnumerableOwnPropertySymbols\");function Js(e){return Object.keys(e).concat(Rc(e))}n(Js,\"getKeys\");function en(e,t){try{return t in e}catch{return!1}}n(en,\"propertyIsOnObject\");function wc(e,t){return en(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))}n(wc,\"propertyIsUnsafe\");function Sc(e,t,r){var i={};return r.isMergeableObject(e)&&Js(e).forEach(function(s){i[s]=Ve(e[s],r)}),Js(t).forEach(function(s){wc(e,s)||(en(e,s)&&r.isMergeableObject(t[s])?i[s]=vc(s,r)(e[s],t[s],r):i[s]=Ve(t[s],r))}),i}n(Sc,\"mergeObject\");function Ce(e,t,r){r=r||{},r.arrayMerge=r.arrayMerge||xc,r.isMergeableObject=r.isMergeableObject||hc,r.cloneUnlessOtherwiseSpecified=Ve;var i=Array.isArray(t),s=Array.isArray(e),a=i===s;return a?i?r.arrayMerge(e,t,r):Sc(e,t,r):Ve(t,r)}n(Ce,\"deepmerge\");Ce.all=n(function(t,r){if(!Array.isArray(t))throw new Error(\"first argument should be an array\");return t.reduce(function(i,s){return Ce(i,s,r)},{})},\"deepmergeAll\");var Tc=Ce;tn.exports=Tc});var sn=L(Et=>{\"use strict\";Object.defineProperty(Et,\"__esModule\",{value:!0});Et.bodyRegExps={xml:/&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&notin;|&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&centerdot;|&copysr;|&divideontimes;|&gtcc;|&gtcir;|&gtdot;|&gtlPar;|&gtquest;|&gtrapprox;|&gtrarr;|&gtrdot;|&gtreqless;|&gtreqqless;|&gtrless;|&gtrsim;|&ltcc;|&ltcir;|&ltdot;|&lthree;|&ltimes;|&ltlarr;|&ltquest;|&ltrPar;|&ltri;|&ltrie;|&ltrif;|&notin;|&notinE;|&notindot;|&notinva;|&notinvb;|&notinvc;|&notni;|&notniva;|&notnivb;|&notnivc;|&parallel;|&timesb;|&timesbar;|&timesd;|&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g};Et.namedReferences={xml:{entities:{\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&apos;\":\"'\",\"&amp;\":\"&\"},characters:{\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"&\":\"&amp;\"}},html4:{entities:{\"&apos;\":\"'\",\"&nbsp\":\"\\xA0\",\"&nbsp;\":\"\\xA0\",\"&iexcl\":\"\\xA1\",\"&iexcl;\":\"\\xA1\",\"&cent\":\"\\xA2\",\"&cent;\":\"\\xA2\",\"&pound\":\"\\xA3\",\"&pound;\":\"\\xA3\",\"&curren\":\"\\xA4\",\"&curren;\":\"\\xA4\",\"&yen\":\"\\xA5\",\"&yen;\":\"\\xA5\",\"&brvbar\":\"\\xA6\",\"&brvbar;\":\"\\xA6\",\"&sect\":\"\\xA7\",\"&sect;\":\"\\xA7\",\"&uml\":\"\\xA8\",\"&uml;\":\"\\xA8\",\"&copy\":\"\\xA9\",\"&copy;\":\"\\xA9\",\"&ordf\":\"\\xAA\",\"&ordf;\":\"\\xAA\",\"&laquo\":\"\\xAB\",\"&laquo;\":\"\\xAB\",\"&not\":\"\\xAC\",\"&not;\":\"\\xAC\",\"&shy\":\"\\xAD\",\"&shy;\":\"\\xAD\",\"&reg\":\"\\xAE\",\"&reg;\":\"\\xAE\",\"&macr\":\"\\xAF\",\"&macr;\":\"\\xAF\",\"&deg\":\"\\xB0\",\"&deg;\":\"\\xB0\",\"&plusmn\":\"\\xB1\",\"&plusmn;\":\"\\xB1\",\"&sup2\":\"\\xB2\",\"&sup2;\":\"\\xB2\",\"&sup3\":\"\\xB3\",\"&sup3;\":\"\\xB3\",\"&acute\":\"\\xB4\",\"&acute;\":\"\\xB4\",\"&micro\":\"\\xB5\",\"&micro;\":\"\\xB5\",\"&para\":\"\\xB6\",\"&para;\":\"\\xB6\",\"&middot\":\"\\xB7\",\"&middot;\":\"\\xB7\",\"&cedil\":\"\\xB8\",\"&cedil;\":\"\\xB8\",\"&sup1\":\"\\xB9\",\"&sup1;\":\"\\xB9\",\"&ordm\":\"\\xBA\",\"&ordm;\":\"\\xBA\",\"&raquo\":\"\\xBB\",\"&raquo;\":\"\\xBB\",\"&frac14\":\"\\xBC\",\"&frac14;\":\"\\xBC\",\"&frac12\":\"\\xBD\",\"&frac12;\":\"\\xBD\",\"&frac34\":\"\\xBE\",\"&frac34;\":\"\\xBE\",\"&iquest\":\"\\xBF\",\"&iquest;\":\"\\xBF\",\"&Agrave\":\"\\xC0\",\"&Agrave;\":\"\\xC0\",\"&Aacute\":\"\\xC1\",\"&Aacute;\":\"\\xC1\",\"&Acirc\":\"\\xC2\",\"&Acirc;\":\"\\xC2\",\"&Atilde\":\"\\xC3\",\"&Atilde;\":\"\\xC3\",\"&Auml\":\"\\xC4\",\"&Auml;\":\"\\xC4\",\"&Aring\":\"\\xC5\",\"&Aring;\":\"\\xC5\",\"&AElig\":\"\\xC6\",\"&AElig;\":\"\\xC6\",\"&Ccedil\":\"\\xC7\",\"&Ccedil;\":\"\\xC7\",\"&Egrave\":\"\\xC8\",\"&Egrave;\":\"\\xC8\",\"&Eacute\":\"\\xC9\",\"&Eacute;\":\"\\xC9\",\"&Ecirc\":\"\\xCA\",\"&Ecirc;\":\"\\xCA\",\"&Euml\":\"\\xCB\",\"&Euml;\":\"\\xCB\",\"&Igrave\":\"\\xCC\",\"&Igrave;\":\"\\xCC\",\"&Iacute\":\"\\xCD\",\"&Iacute;\":\"\\xCD\",\"&Icirc\":\"\\xCE\",\"&Icirc;\":\"\\xCE\",\"&Iuml\":\"\\xCF\",\"&Iuml;\":\"\\xCF\",\"&ETH\":\"\\xD0\",\"&ETH;\":\"\\xD0\",\"&Ntilde\":\"\\xD1\",\"&Ntilde;\":\"\\xD1\",\"&Ograve\":\"\\xD2\",\"&Ograve;\":\"\\xD2\",\"&Oacute\":\"\\xD3\",\"&Oacute;\":\"\\xD3\",\"&Ocirc\":\"\\xD4\",\"&Ocirc;\":\"\\xD4\",\"&Otilde\":\"\\xD5\",\"&Otilde;\":\"\\xD5\",\"&Ouml\":\"\\xD6\",\"&Ouml;\":\"\\xD6\",\"&times\":\"\\xD7\",\"&times;\":\"\\xD7\",\"&Oslash\":\"\\xD8\",\"&Oslash;\":\"\\xD8\",\"&Ugrave\":\"\\xD9\",\"&Ugrave;\":\"\\xD9\",\"&Uacute\":\"\\xDA\",\"&Uacute;\":\"\\xDA\",\"&Ucirc\":\"\\xDB\",\"&Ucirc;\":\"\\xDB\",\"&Uuml\":\"\\xDC\",\"&Uuml;\":\"\\xDC\",\"&Yacute\":\"\\xDD\",\"&Yacute;\":\"\\xDD\",\"&THORN\":\"\\xDE\",\"&THORN;\":\"\\xDE\",\"&szlig\":\"\\xDF\",\"&szlig;\":\"\\xDF\",\"&agrave\":\"\\xE0\",\"&agrave;\":\"\\xE0\",\"&aacute\":\"\\xE1\",\"&aacute;\":\"\\xE1\",\"&acirc\":\"\\xE2\",\"&acirc;\":\"\\xE2\",\"&atilde\":\"\\xE3\",\"&atilde;\":\"\\xE3\",\"&auml\":\"\\xE4\",\"&auml;\":\"\\xE4\",\"&aring\":\"\\xE5\",\"&aring;\":\"\\xE5\",\"&aelig\":\"\\xE6\",\"&aelig;\":\"\\xE6\",\"&ccedil\":\"\\xE7\",\"&ccedil;\":\"\\xE7\",\"&egrave\":\"\\xE8\",\"&egrave;\":\"\\xE8\",\"&eacute\":\"\\xE9\",\"&eacute;\":\"\\xE9\",\"&ecirc\":\"\\xEA\",\"&ecirc;\":\"\\xEA\",\"&euml\":\"\\xEB\",\"&euml;\":\"\\xEB\",\"&igrave\":\"\\xEC\",\"&igrave;\":\"\\xEC\",\"&iacute\":\"\\xED\",\"&iacute;\":\"\\xED\",\"&icirc\":\"\\xEE\",\"&icirc;\":\"\\xEE\",\"&iuml\":\"\\xEF\",\"&iuml;\":\"\\xEF\",\"&eth\":\"\\xF0\",\"&eth;\":\"\\xF0\",\"&ntilde\":\"\\xF1\",\"&ntilde;\":\"\\xF1\",\"&ograve\":\"\\xF2\",\"&ograve;\":\"\\xF2\",\"&oacute\":\"\\xF3\",\"&oacute;\":\"\\xF3\",\"&ocirc\":\"\\xF4\",\"&ocirc;\":\"\\xF4\",\"&otilde\":\"\\xF5\",\"&otilde;\":\"\\xF5\",\"&ouml\":\"\\xF6\",\"&ouml;\":\"\\xF6\",\"&divide\":\"\\xF7\",\"&divide;\":\"\\xF7\",\"&oslash\":\"\\xF8\",\"&oslash;\":\"\\xF8\",\"&ugrave\":\"\\xF9\",\"&ugrave;\":\"\\xF9\",\"&uacute\":\"\\xFA\",\"&uacute;\":\"\\xFA\",\"&ucirc\":\"\\xFB\",\"&ucirc;\":\"\\xFB\",\"&uuml\":\"\\xFC\",\"&uuml;\":\"\\xFC\",\"&yacute\":\"\\xFD\",\"&yacute;\":\"\\xFD\",\"&thorn\":\"\\xFE\",\"&thorn;\":\"\\xFE\",\"&yuml\":\"\\xFF\",\"&yuml;\":\"\\xFF\",\"&quot\":'\"',\"&quot;\":'\"',\"&amp\":\"&\",\"&amp;\":\"&\",\"&lt\":\"<\",\"&lt;\":\"<\",\"&gt\":\">\",\"&gt;\":\">\",\"&OElig;\":\"\\u0152\",\"&oelig;\":\"\\u0153\",\"&Scaron;\":\"\\u0160\",\"&scaron;\":\"\\u0161\",\"&Yuml;\":\"\\u0178\",\"&circ;\":\"\\u02C6\",\"&tilde;\":\"\\u02DC\",\"&ensp;\":\"\\u2002\",\"&emsp;\":\"\\u2003\",\"&thinsp;\":\"\\u2009\",\"&zwnj;\":\"\\u200C\",\"&zwj;\":\"\\u200D\",\"&lrm;\":\"\\u200E\",\"&rlm;\":\"\\u200F\",\"&ndash;\":\"\\u2013\",\"&mdash;\":\"\\u2014\",\"&lsquo;\":\"\\u2018\",\"&rsquo;\":\"\\u2019\",\"&sbquo;\":\"\\u201A\",\"&ldquo;\":\"\\u201C\",\"&rdquo;\":\"\\u201D\",\"&bdquo;\":\"\\u201E\",\"&dagger;\":\"\\u2020\",\"&Dagger;\":\"\\u2021\",\"&permil;\":\"\\u2030\",\"&lsaquo;\":\"\\u2039\",\"&rsaquo;\":\"\\u203A\",\"&euro;\":\"\\u20AC\",\"&fnof;\":\"\\u0192\",\"&Alpha;\":\"\\u0391\",\"&Beta;\":\"\\u0392\",\"&Gamma;\":\"\\u0393\",\"&Delta;\":\"\\u0394\",\"&Epsilon;\":\"\\u0395\",\"&Zeta;\":\"\\u0396\",\"&Eta;\":\"\\u0397\",\"&Theta;\":\"\\u0398\",\"&Iota;\":\"\\u0399\",\"&Kappa;\":\"\\u039A\",\"&Lambda;\":\"\\u039B\",\"&Mu;\":\"\\u039C\",\"&Nu;\":\"\\u039D\",\"&Xi;\":\"\\u039E\",\"&Omicron;\":\"\\u039F\",\"&Pi;\":\"\\u03A0\",\"&Rho;\":\"\\u03A1\",\"&Sigma;\":\"\\u03A3\",\"&Tau;\":\"\\u03A4\",\"&Upsilon;\":\"\\u03A5\",\"&Phi;\":\"\\u03A6\",\"&Chi;\":\"\\u03A7\",\"&Psi;\":\"\\u03A8\",\"&Omega;\":\"\\u03A9\",\"&alpha;\":\"\\u03B1\",\"&beta;\":\"\\u03B2\",\"&gamma;\":\"\\u03B3\",\"&delta;\":\"\\u03B4\",\"&epsilon;\":\"\\u03B5\",\"&zeta;\":\"\\u03B6\",\"&eta;\":\"\\u03B7\",\"&theta;\":\"\\u03B8\",\"&iota;\":\"\\u03B9\",\"&kappa;\":\"\\u03BA\",\"&lambda;\":\"\\u03BB\",\"&mu;\":\"\\u03BC\",\"&nu;\":\"\\u03BD\",\"&xi;\":\"\\u03BE\",\"&omicron;\":\"\\u03BF\",\"&pi;\":\"\\u03C0\",\"&rho;\":\"\\u03C1\",\"&sigmaf;\":\"\\u03C2\",\"&sigma;\":\"\\u03C3\",\"&tau;\":\"\\u03C4\",\"&upsilon;\":\"\\u03C5\",\"&phi;\":\"\\u03C6\",\"&chi;\":\"\\u03C7\",\"&psi;\":\"\\u03C8\",\"&omega;\":\"\\u03C9\",\"&thetasym;\":\"\\u03D1\",\"&upsih;\":\"\\u03D2\",\"&piv;\":\"\\u03D6\",\"&bull;\":\"\\u2022\",\"&hellip;\":\"\\u2026\",\"&prime;\":\"\\u2032\",\"&Prime;\":\"\\u2033\",\"&oline;\":\"\\u203E\",\"&frasl;\":\"\\u2044\",\"&weierp;\":\"\\u2118\",\"&image;\":\"\\u2111\",\"&real;\":\"\\u211C\",\"&trade;\":\"\\u2122\",\"&alefsym;\":\"\\u2135\",\"&larr;\":\"\\u2190\",\"&uarr;\":\"\\u2191\",\"&rarr;\":\"\\u2192\",\"&darr;\":\"\\u2193\",\"&harr;\":\"\\u2194\",\"&crarr;\":\"\\u21B5\",\"&lArr;\":\"\\u21D0\",\"&uArr;\":\"\\u21D1\",\"&rArr;\":\"\\u21D2\",\"&dArr;\":\"\\u21D3\",\"&hArr;\":\"\\u21D4\",\"&forall;\":\"\\u2200\",\"&part;\":\"\\u2202\",\"&exist;\":\"\\u2203\",\"&empty;\":\"\\u2205\",\"&nabla;\":\"\\u2207\",\"&isin;\":\"\\u2208\",\"&notin;\":\"\\u2209\",\"&ni;\":\"\\u220B\",\"&prod;\":\"\\u220F\",\"&sum;\":\"\\u2211\",\"&minus;\":\"\\u2212\",\"&lowast;\":\"\\u2217\",\"&radic;\":\"\\u221A\",\"&prop;\":\"\\u221D\",\"&infin;\":\"\\u221E\",\"&ang;\":\"\\u2220\",\"&and;\":\"\\u2227\",\"&or;\":\"\\u2228\",\"&cap;\":\"\\u2229\",\"&cup;\":\"\\u222A\",\"&int;\":\"\\u222B\",\"&there4;\":\"\\u2234\",\"&sim;\":\"\\u223C\",\"&cong;\":\"\\u2245\",\"&asymp;\":\"\\u2248\",\"&ne;\":\"\\u2260\",\"&equiv;\":\"\\u2261\",\"&le;\":\"\\u2264\",\"&ge;\":\"\\u2265\",\"&sub;\":\"\\u2282\",\"&sup;\":\"\\u2283\",\"&nsub;\":\"\\u2284\",\"&sube;\":\"\\u2286\",\"&supe;\":\"\\u2287\",\"&oplus;\":\"\\u2295\",\"&otimes;\":\"\\u2297\",\"&perp;\":\"\\u22A5\",\"&sdot;\":\"\\u22C5\",\"&lceil;\":\"\\u2308\",\"&rceil;\":\"\\u2309\",\"&lfloor;\":\"\\u230A\",\"&rfloor;\":\"\\u230B\",\"&lang;\":\"\\u2329\",\"&rang;\":\"\\u232A\",\"&loz;\":\"\\u25CA\",\"&spades;\":\"\\u2660\",\"&clubs;\":\"\\u2663\",\"&hearts;\":\"\\u2665\",\"&diams;\":\"\\u2666\"},characters:{\"'\":\"&apos;\",\"\\xA0\":\"&nbsp;\",\"\\xA1\":\"&iexcl;\",\"\\xA2\":\"&cent;\",\"\\xA3\":\"&pound;\",\"\\xA4\":\"&curren;\",\"\\xA5\":\"&yen;\",\"\\xA6\":\"&brvbar;\",\"\\xA7\":\"&sect;\",\"\\xA8\":\"&uml;\",\"\\xA9\":\"&copy;\",\\u00AA:\"&ordf;\",\"\\xAB\":\"&laquo;\",\"\\xAC\":\"&not;\",\"\\xAD\":\"&shy;\",\"\\xAE\":\"&reg;\",\"\\xAF\":\"&macr;\",\"\\xB0\":\"&deg;\",\"\\xB1\":\"&plusmn;\",\"\\xB2\":\"&sup2;\",\"\\xB3\":\"&sup3;\",\"\\xB4\":\"&acute;\",\\u00B5:\"&micro;\",\"\\xB6\":\"&para;\",\"\\xB7\":\"&middot;\",\"\\xB8\":\"&cedil;\",\"\\xB9\":\"&sup1;\",\\u00BA:\"&ordm;\",\"\\xBB\":\"&raquo;\",\"\\xBC\":\"&frac14;\",\"\\xBD\":\"&frac12;\",\"\\xBE\":\"&frac34;\",\"\\xBF\":\"&iquest;\",\\u00C0:\"&Agrave;\",\\u00C1:\"&Aacute;\",\\u00C2:\"&Acirc;\",\\u00C3:\"&Atilde;\",\\u00C4:\"&Auml;\",\\u00C5:\"&Aring;\",\\u00C6:\"&AElig;\",\\u00C7:\"&Ccedil;\",\\u00C8:\"&Egrave;\",\\u00C9:\"&Eacute;\",\\u00CA:\"&Ecirc;\",\\u00CB:\"&Euml;\",\\u00CC:\"&Igrave;\",\\u00CD:\"&Iacute;\",\\u00CE:\"&Icirc;\",\\u00CF:\"&Iuml;\",\\u00D0:\"&ETH;\",\\u00D1:\"&Ntilde;\",\\u00D2:\"&Ograve;\",\\u00D3:\"&Oacute;\",\\u00D4:\"&Ocirc;\",\\u00D5:\"&Otilde;\",\\u00D6:\"&Ouml;\",\"\\xD7\":\"&times;\",\\u00D8:\"&Oslash;\",\\u00D9:\"&Ugrave;\",\\u00DA:\"&Uacute;\",\\u00DB:\"&Ucirc;\",\\u00DC:\"&Uuml;\",\\u00DD:\"&Yacute;\",\\u00DE:\"&THORN;\",\\u00DF:\"&szlig;\",\\u00E0:\"&agrave;\",\\u00E1:\"&aacute;\",\\u00E2:\"&acirc;\",\\u00E3:\"&atilde;\",\\u00E4:\"&auml;\",\\u00E5:\"&aring;\",\\u00E6:\"&aelig;\",\\u00E7:\"&ccedil;\",\\u00E8:\"&egrave;\",\\u00E9:\"&eacute;\",\\u00EA:\"&ecirc;\",\\u00EB:\"&euml;\",\\u00EC:\"&igrave;\",\\u00ED:\"&iacute;\",\\u00EE:\"&icirc;\",\\u00EF:\"&iuml;\",\\u00F0:\"&eth;\",\\u00F1:\"&ntilde;\",\\u00F2:\"&ograve;\",\\u00F3:\"&oacute;\",\\u00F4:\"&ocirc;\",\\u00F5:\"&otilde;\",\\u00F6:\"&ouml;\",\"\\xF7\":\"&divide;\",\\u00F8:\"&oslash;\",\\u00F9:\"&ugrave;\",\\u00FA:\"&uacute;\",\\u00FB:\"&ucirc;\",\\u00FC:\"&uuml;\",\\u00FD:\"&yacute;\",\\u00FE:\"&thorn;\",\\u00FF:\"&yuml;\",'\"':\"&quot;\",\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\\u0152:\"&OElig;\",\\u0153:\"&oelig;\",\\u0160:\"&Scaron;\",\\u0161:\"&scaron;\",\\u0178:\"&Yuml;\",\"\\u02C6\":\"&circ;\",\"\\u02DC\":\"&tilde;\",\"\\u2002\":\"&ensp;\",\"\\u2003\":\"&emsp;\",\"\\u2009\":\"&thinsp;\",\"\\u200C\":\"&zwnj;\",\"\\u200D\":\"&zwj;\",\"\\u200E\":\"&lrm;\",\"\\u200F\":\"&rlm;\",\"\\u2013\":\"&ndash;\",\"\\u2014\":\"&mdash;\",\"\\u2018\":\"&lsquo;\",\"\\u2019\":\"&rsquo;\",\"\\u201A\":\"&sbquo;\",\"\\u201C\":\"&ldquo;\",\"\\u201D\":\"&rdquo;\",\"\\u201E\":\"&bdquo;\",\"\\u2020\":\"&dagger;\",\"\\u2021\":\"&Dagger;\",\"\\u2030\":\"&permil;\",\"\\u2039\":\"&lsaquo;\",\"\\u203A\":\"&rsaquo;\",\"\\u20AC\":\"&euro;\",\\u0192:\"&fnof;\",\\u0391:\"&Alpha;\",\\u0392:\"&Beta;\",\\u0393:\"&Gamma;\",\\u0394:\"&Delta;\",\\u0395:\"&Epsilon;\",\\u0396:\"&Zeta;\",\\u0397:\"&Eta;\",\\u0398:\"&Theta;\",\\u0399:\"&Iota;\",\\u039A:\"&Kappa;\",\\u039B:\"&Lambda;\",\\u039C:\"&Mu;\",\\u039D:\"&Nu;\",\\u039E:\"&Xi;\",\\u039F:\"&Omicron;\",\\u03A0:\"&Pi;\",\\u03A1:\"&Rho;\",\\u03A3:\"&Sigma;\",\\u03A4:\"&Tau;\",\\u03A5:\"&Upsilon;\",\\u03A6:\"&Phi;\",\\u03A7:\"&Chi;\",\\u03A8:\"&Psi;\",\\u03A9:\"&Omega;\",\\u03B1:\"&alpha;\",\\u03B2:\"&beta;\",\\u03B3:\"&gamma;\",\\u03B4:\"&delta;\",\\u03B5:\"&epsilon;\",\\u03B6:\"&zeta;\",\\u03B7:\"&eta;\",\\u03B8:\"&theta;\",\\u03B9:\"&iota;\",\\u03BA:\"&kappa;\",\\u03BB:\"&lambda;\",\\u03BC:\"&mu;\",\\u03BD:\"&nu;\",\\u03BE:\"&xi;\",\\u03BF:\"&omicron;\",\\u03C0:\"&pi;\",\\u03C1:\"&rho;\",\\u03C2:\"&sigmaf;\",\\u03C3:\"&sigma;\",\\u03C4:\"&tau;\",\\u03C5:\"&upsilon;\",\\u03C6:\"&phi;\",\\u03C7:\"&chi;\",\\u03C8:\"&psi;\",\\u03C9:\"&omega;\",\\u03D1:\"&thetasym;\",\\u03D2:\"&upsih;\",\\u03D6:\"&piv;\",\"\\u2022\":\"&bull;\",\"\\u2026\":\"&hellip;\",\"\\u2032\":\"&prime;\",\"\\u2033\":\"&Prime;\",\"\\u203E\":\"&oline;\",\"\\u2044\":\"&frasl;\",\"\\u2118\":\"&weierp;\",\\u2111:\"&image;\",\\u211C:\"&real;\",\"\\u2122\":\"&trade;\",\\u2135:\"&alefsym;\",\"\\u2190\":\"&larr;\",\"\\u2191\":\"&uarr;\",\"\\u2192\":\"&rarr;\",\"\\u2193\":\"&darr;\",\"\\u2194\":\"&harr;\",\"\\u21B5\":\"&crarr;\",\"\\u21D0\":\"&lArr;\",\"\\u21D1\":\"&uArr;\",\"\\u21D2\":\"&rArr;\",\"\\u21D3\":\"&dArr;\",\"\\u21D4\":\"&hArr;\",\"\\u2200\":\"&forall;\",\"\\u2202\":\"&part;\",\"\\u2203\":\"&exist;\",\"\\u2205\":\"&empty;\",\"\\u2207\":\"&nabla;\",\"\\u2208\":\"&isin;\",\"\\u2209\":\"&notin;\",\"\\u220B\":\"&ni;\",\"\\u220F\":\"&prod;\",\"\\u2211\":\"&sum;\",\"\\u2212\":\"&minus;\",\"\\u2217\":\"&lowast;\",\"\\u221A\":\"&radic;\",\"\\u221D\":\"&prop;\",\"\\u221E\":\"&infin;\",\"\\u2220\":\"&ang;\",\"\\u2227\":\"&and;\",\"\\u2228\":\"&or;\",\"\\u2229\":\"&cap;\",\"\\u222A\":\"&cup;\",\"\\u222B\":\"&int;\",\"\\u2234\":\"&there4;\",\"\\u223C\":\"&sim;\",\"\\u2245\":\"&cong;\",\"\\u2248\":\"&asymp;\",\"\\u2260\":\"&ne;\",\"\\u2261\":\"&equiv;\",\"\\u2264\":\"&le;\",\"\\u2265\":\"&ge;\",\"\\u2282\":\"&sub;\",\"\\u2283\":\"&sup;\",\"\\u2284\":\"&nsub;\",\"\\u2286\":\"&sube;\",\"\\u2287\":\"&supe;\",\"\\u2295\":\"&oplus;\",\"\\u2297\":\"&otimes;\",\"\\u22A5\":\"&perp;\",\"\\u22C5\":\"&sdot;\",\"\\u2308\":\"&lceil;\",\"\\u2309\":\"&rceil;\",\"\\u230A\":\"&lfloor;\",\"\\u230B\":\"&rfloor;\",\"\\u2329\":\"&lang;\",\"\\u232A\":\"&rang;\",\"\\u25CA\":\"&loz;\",\"\\u2660\":\"&spades;\",\"\\u2663\":\"&clubs;\",\"\\u2665\":\"&hearts;\",\"\\u2666\":\"&diams;\"}},html5:{entities:{\"&AElig\":\"\\xC6\",\"&AElig;\":\"\\xC6\",\"&AMP\":\"&\",\"&AMP;\":\"&\",\"&Aacute\":\"\\xC1\",\"&Aacute;\":\"\\xC1\",\"&Abreve;\":\"\\u0102\",\"&Acirc\":\"\\xC2\",\"&Acirc;\":\"\\xC2\",\"&Acy;\":\"\\u0410\",\"&Afr;\":\"\\u{1D504}\",\"&Agrave\":\"\\xC0\",\"&Agrave;\":\"\\xC0\",\"&Alpha;\":\"\\u0391\",\"&Amacr;\":\"\\u0100\",\"&And;\":\"\\u2A53\",\"&Aogon;\":\"\\u0104\",\"&Aopf;\":\"\\u{1D538}\",\"&ApplyFunction;\":\"\\u2061\",\"&Aring\":\"\\xC5\",\"&Aring;\":\"\\xC5\",\"&Ascr;\":\"\\u{1D49C}\",\"&Assign;\":\"\\u2254\",\"&Atilde\":\"\\xC3\",\"&Atilde;\":\"\\xC3\",\"&Auml\":\"\\xC4\",\"&Auml;\":\"\\xC4\",\"&Backslash;\":\"\\u2216\",\"&Barv;\":\"\\u2AE7\",\"&Barwed;\":\"\\u2306\",\"&Bcy;\":\"\\u0411\",\"&Because;\":\"\\u2235\",\"&Bernoullis;\":\"\\u212C\",\"&Beta;\":\"\\u0392\",\"&Bfr;\":\"\\u{1D505}\",\"&Bopf;\":\"\\u{1D539}\",\"&Breve;\":\"\\u02D8\",\"&Bscr;\":\"\\u212C\",\"&Bumpeq;\":\"\\u224E\",\"&CHcy;\":\"\\u0427\",\"&COPY\":\"\\xA9\",\"&COPY;\":\"\\xA9\",\"&Cacute;\":\"\\u0106\",\"&Cap;\":\"\\u22D2\",\"&CapitalDifferentialD;\":\"\\u2145\",\"&Cayleys;\":\"\\u212D\",\"&Ccaron;\":\"\\u010C\",\"&Ccedil\":\"\\xC7\",\"&Ccedil;\":\"\\xC7\",\"&Ccirc;\":\"\\u0108\",\"&Cconint;\":\"\\u2230\",\"&Cdot;\":\"\\u010A\",\"&Cedilla;\":\"\\xB8\",\"&CenterDot;\":\"\\xB7\",\"&Cfr;\":\"\\u212D\",\"&Chi;\":\"\\u03A7\",\"&CircleDot;\":\"\\u2299\",\"&CircleMinus;\":\"\\u2296\",\"&CirclePlus;\":\"\\u2295\",\"&CircleTimes;\":\"\\u2297\",\"&ClockwiseContourIntegral;\":\"\\u2232\",\"&CloseCurlyDoubleQuote;\":\"\\u201D\",\"&CloseCurlyQuote;\":\"\\u2019\",\"&Colon;\":\"\\u2237\",\"&Colone;\":\"\\u2A74\",\"&Congruent;\":\"\\u2261\",\"&Conint;\":\"\\u222F\",\"&ContourIntegral;\":\"\\u222E\",\"&Copf;\":\"\\u2102\",\"&Coproduct;\":\"\\u2210\",\"&CounterClockwiseContourIntegral;\":\"\\u2233\",\"&Cross;\":\"\\u2A2F\",\"&Cscr;\":\"\\u{1D49E}\",\"&Cup;\":\"\\u22D3\",\"&CupCap;\":\"\\u224D\",\"&DD;\":\"\\u2145\",\"&DDotrahd;\":\"\\u2911\",\"&DJcy;\":\"\\u0402\",\"&DScy;\":\"\\u0405\",\"&DZcy;\":\"\\u040F\",\"&Dagger;\":\"\\u2021\",\"&Darr;\":\"\\u21A1\",\"&Dashv;\":\"\\u2AE4\",\"&Dcaron;\":\"\\u010E\",\"&Dcy;\":\"\\u0414\",\"&Del;\":\"\\u2207\",\"&Delta;\":\"\\u0394\",\"&Dfr;\":\"\\u{1D507}\",\"&DiacriticalAcute;\":\"\\xB4\",\"&DiacriticalDot;\":\"\\u02D9\",\"&DiacriticalDoubleAcute;\":\"\\u02DD\",\"&DiacriticalGrave;\":\"`\",\"&DiacriticalTilde;\":\"\\u02DC\",\"&Diamond;\":\"\\u22C4\",\"&DifferentialD;\":\"\\u2146\",\"&Dopf;\":\"\\u{1D53B}\",\"&Dot;\":\"\\xA8\",\"&DotDot;\":\"\\u20DC\",\"&DotEqual;\":\"\\u2250\",\"&DoubleContourIntegral;\":\"\\u222F\",\"&DoubleDot;\":\"\\xA8\",\"&DoubleDownArrow;\":\"\\u21D3\",\"&DoubleLeftArrow;\":\"\\u21D0\",\"&DoubleLeftRightArrow;\":\"\\u21D4\",\"&DoubleLeftTee;\":\"\\u2AE4\",\"&DoubleLongLeftArrow;\":\"\\u27F8\",\"&DoubleLongLeftRightArrow;\":\"\\u27FA\",\"&DoubleLongRightArrow;\":\"\\u27F9\",\"&DoubleRightArrow;\":\"\\u21D2\",\"&DoubleRightTee;\":\"\\u22A8\",\"&DoubleUpArrow;\":\"\\u21D1\",\"&DoubleUpDownArrow;\":\"\\u21D5\",\"&DoubleVerticalBar;\":\"\\u2225\",\"&DownArrow;\":\"\\u2193\",\"&DownArrowBar;\":\"\\u2913\",\"&DownArrowUpArrow;\":\"\\u21F5\",\"&DownBreve;\":\"\\u0311\",\"&DownLeftRightVector;\":\"\\u2950\",\"&DownLeftTeeVector;\":\"\\u295E\",\"&DownLeftVector;\":\"\\u21BD\",\"&DownLeftVectorBar;\":\"\\u2956\",\"&DownRightTeeVector;\":\"\\u295F\",\"&DownRightVector;\":\"\\u21C1\",\"&DownRightVectorBar;\":\"\\u2957\",\"&DownTee;\":\"\\u22A4\",\"&DownTeeArrow;\":\"\\u21A7\",\"&Downarrow;\":\"\\u21D3\",\"&Dscr;\":\"\\u{1D49F}\",\"&Dstrok;\":\"\\u0110\",\"&ENG;\":\"\\u014A\",\"&ETH\":\"\\xD0\",\"&ETH;\":\"\\xD0\",\"&Eacute\":\"\\xC9\",\"&Eacute;\":\"\\xC9\",\"&Ecaron;\":\"\\u011A\",\"&Ecirc\":\"\\xCA\",\"&Ecirc;\":\"\\xCA\",\"&Ecy;\":\"\\u042D\",\"&Edot;\":\"\\u0116\",\"&Efr;\":\"\\u{1D508}\",\"&Egrave\":\"\\xC8\",\"&Egrave;\":\"\\xC8\",\"&Element;\":\"\\u2208\",\"&Emacr;\":\"\\u0112\",\"&EmptySmallSquare;\":\"\\u25FB\",\"&EmptyVerySmallSquare;\":\"\\u25AB\",\"&Eogon;\":\"\\u0118\",\"&Eopf;\":\"\\u{1D53C}\",\"&Epsilon;\":\"\\u0395\",\"&Equal;\":\"\\u2A75\",\"&EqualTilde;\":\"\\u2242\",\"&Equilibrium;\":\"\\u21CC\",\"&Escr;\":\"\\u2130\",\"&Esim;\":\"\\u2A73\",\"&Eta;\":\"\\u0397\",\"&Euml\":\"\\xCB\",\"&Euml;\":\"\\xCB\",\"&Exists;\":\"\\u2203\",\"&ExponentialE;\":\"\\u2147\",\"&Fcy;\":\"\\u0424\",\"&Ffr;\":\"\\u{1D509}\",\"&FilledSmallSquare;\":\"\\u25FC\",\"&FilledVerySmallSquare;\":\"\\u25AA\",\"&Fopf;\":\"\\u{1D53D}\",\"&ForAll;\":\"\\u2200\",\"&Fouriertrf;\":\"\\u2131\",\"&Fscr;\":\"\\u2131\",\"&GJcy;\":\"\\u0403\",\"&GT\":\">\",\"&GT;\":\">\",\"&Gamma;\":\"\\u0393\",\"&Gammad;\":\"\\u03DC\",\"&Gbreve;\":\"\\u011E\",\"&Gcedil;\":\"\\u0122\",\"&Gcirc;\":\"\\u011C\",\"&Gcy;\":\"\\u0413\",\"&Gdot;\":\"\\u0120\",\"&Gfr;\":\"\\u{1D50A}\",\"&Gg;\":\"\\u22D9\",\"&Gopf;\":\"\\u{1D53E}\",\"&GreaterEqual;\":\"\\u2265\",\"&GreaterEqualLess;\":\"\\u22DB\",\"&GreaterFullEqual;\":\"\\u2267\",\"&GreaterGreater;\":\"\\u2AA2\",\"&GreaterLess;\":\"\\u2277\",\"&GreaterSlantEqual;\":\"\\u2A7E\",\"&GreaterTilde;\":\"\\u2273\",\"&Gscr;\":\"\\u{1D4A2}\",\"&Gt;\":\"\\u226B\",\"&HARDcy;\":\"\\u042A\",\"&Hacek;\":\"\\u02C7\",\"&Hat;\":\"^\",\"&Hcirc;\":\"\\u0124\",\"&Hfr;\":\"\\u210C\",\"&HilbertSpace;\":\"\\u210B\",\"&Hopf;\":\"\\u210D\",\"&HorizontalLine;\":\"\\u2500\",\"&Hscr;\":\"\\u210B\",\"&Hstrok;\":\"\\u0126\",\"&HumpDownHump;\":\"\\u224E\",\"&HumpEqual;\":\"\\u224F\",\"&IEcy;\":\"\\u0415\",\"&IJlig;\":\"\\u0132\",\"&IOcy;\":\"\\u0401\",\"&Iacute\":\"\\xCD\",\"&Iacute;\":\"\\xCD\",\"&Icirc\":\"\\xCE\",\"&Icirc;\":\"\\xCE\",\"&Icy;\":\"\\u0418\",\"&Idot;\":\"\\u0130\",\"&Ifr;\":\"\\u2111\",\"&Igrave\":\"\\xCC\",\"&Igrave;\":\"\\xCC\",\"&Im;\":\"\\u2111\",\"&Imacr;\":\"\\u012A\",\"&ImaginaryI;\":\"\\u2148\",\"&Implies;\":\"\\u21D2\",\"&Int;\":\"\\u222C\",\"&Integral;\":\"\\u222B\",\"&Intersection;\":\"\\u22C2\",\"&InvisibleComma;\":\"\\u2063\",\"&InvisibleTimes;\":\"\\u2062\",\"&Iogon;\":\"\\u012E\",\"&Iopf;\":\"\\u{1D540}\",\"&Iota;\":\"\\u0399\",\"&Iscr;\":\"\\u2110\",\"&Itilde;\":\"\\u0128\",\"&Iukcy;\":\"\\u0406\",\"&Iuml\":\"\\xCF\",\"&Iuml;\":\"\\xCF\",\"&Jcirc;\":\"\\u0134\",\"&Jcy;\":\"\\u0419\",\"&Jfr;\":\"\\u{1D50D}\",\"&Jopf;\":\"\\u{1D541}\",\"&Jscr;\":\"\\u{1D4A5}\",\"&Jsercy;\":\"\\u0408\",\"&Jukcy;\":\"\\u0404\",\"&KHcy;\":\"\\u0425\",\"&KJcy;\":\"\\u040C\",\"&Kappa;\":\"\\u039A\",\"&Kcedil;\":\"\\u0136\",\"&Kcy;\":\"\\u041A\",\"&Kfr;\":\"\\u{1D50E}\",\"&Kopf;\":\"\\u{1D542}\",\"&Kscr;\":\"\\u{1D4A6}\",\"&LJcy;\":\"\\u0409\",\"&LT\":\"<\",\"&LT;\":\"<\",\"&Lacute;\":\"\\u0139\",\"&Lambda;\":\"\\u039B\",\"&Lang;\":\"\\u27EA\",\"&Laplacetrf;\":\"\\u2112\",\"&Larr;\":\"\\u219E\",\"&Lcaron;\":\"\\u013D\",\"&Lcedil;\":\"\\u013B\",\"&Lcy;\":\"\\u041B\",\"&LeftAngleBracket;\":\"\\u27E8\",\"&LeftArrow;\":\"\\u2190\",\"&LeftArrowBar;\":\"\\u21E4\",\"&LeftArrowRightArrow;\":\"\\u21C6\",\"&LeftCeiling;\":\"\\u2308\",\"&LeftDoubleBracket;\":\"\\u27E6\",\"&LeftDownTeeVector;\":\"\\u2961\",\"&LeftDownVector;\":\"\\u21C3\",\"&LeftDownVectorBar;\":\"\\u2959\",\"&LeftFloor;\":\"\\u230A\",\"&LeftRightArrow;\":\"\\u2194\",\"&LeftRightVector;\":\"\\u294E\",\"&LeftTee;\":\"\\u22A3\",\"&LeftTeeArrow;\":\"\\u21A4\",\"&LeftTeeVector;\":\"\\u295A\",\"&LeftTriangle;\":\"\\u22B2\",\"&LeftTriangleBar;\":\"\\u29CF\",\"&LeftTriangleEqual;\":\"\\u22B4\",\"&LeftUpDownVector;\":\"\\u2951\",\"&LeftUpTeeVector;\":\"\\u2960\",\"&LeftUpVector;\":\"\\u21BF\",\"&LeftUpVectorBar;\":\"\\u2958\",\"&LeftVector;\":\"\\u21BC\",\"&LeftVectorBar;\":\"\\u2952\",\"&Leftarrow;\":\"\\u21D0\",\"&Leftrightarrow;\":\"\\u21D4\",\"&LessEqualGreater;\":\"\\u22DA\",\"&LessFullEqual;\":\"\\u2266\",\"&LessGreater;\":\"\\u2276\",\"&LessLess;\":\"\\u2AA1\",\"&LessSlantEqual;\":\"\\u2A7D\",\"&LessTilde;\":\"\\u2272\",\"&Lfr;\":\"\\u{1D50F}\",\"&Ll;\":\"\\u22D8\",\"&Lleftarrow;\":\"\\u21DA\",\"&Lmidot;\":\"\\u013F\",\"&LongLeftArrow;\":\"\\u27F5\",\"&LongLeftRightArrow;\":\"\\u27F7\",\"&LongRightArrow;\":\"\\u27F6\",\"&Longleftarrow;\":\"\\u27F8\",\"&Longleftrightarrow;\":\"\\u27FA\",\"&Longrightarrow;\":\"\\u27F9\",\"&Lopf;\":\"\\u{1D543}\",\"&LowerLeftArrow;\":\"\\u2199\",\"&LowerRightArrow;\":\"\\u2198\",\"&Lscr;\":\"\\u2112\",\"&Lsh;\":\"\\u21B0\",\"&Lstrok;\":\"\\u0141\",\"&Lt;\":\"\\u226A\",\"&Map;\":\"\\u2905\",\"&Mcy;\":\"\\u041C\",\"&MediumSpace;\":\"\\u205F\",\"&Mellintrf;\":\"\\u2133\",\"&Mfr;\":\"\\u{1D510}\",\"&MinusPlus;\":\"\\u2213\",\"&Mopf;\":\"\\u{1D544}\",\"&Mscr;\":\"\\u2133\",\"&Mu;\":\"\\u039C\",\"&NJcy;\":\"\\u040A\",\"&Nacute;\":\"\\u0143\",\"&Ncaron;\":\"\\u0147\",\"&Ncedil;\":\"\\u0145\",\"&Ncy;\":\"\\u041D\",\"&NegativeMediumSpace;\":\"\\u200B\",\"&NegativeThickSpace;\":\"\\u200B\",\"&NegativeThinSpace;\":\"\\u200B\",\"&NegativeVeryThinSpace;\":\"\\u200B\",\"&NestedGreaterGreater;\":\"\\u226B\",\"&NestedLessLess;\":\"\\u226A\",\"&NewLine;\":`\n`,\"&Nfr;\":\"\\u{1D511}\",\"&NoBreak;\":\"\\u2060\",\"&NonBreakingSpace;\":\"\\xA0\",\"&Nopf;\":\"\\u2115\",\"&Not;\":\"\\u2AEC\",\"&NotCongruent;\":\"\\u2262\",\"&NotCupCap;\":\"\\u226D\",\"&NotDoubleVerticalBar;\":\"\\u2226\",\"&NotElement;\":\"\\u2209\",\"&NotEqual;\":\"\\u2260\",\"&NotEqualTilde;\":\"\\u2242\\u0338\",\"&NotExists;\":\"\\u2204\",\"&NotGreater;\":\"\\u226F\",\"&NotGreaterEqual;\":\"\\u2271\",\"&NotGreaterFullEqual;\":\"\\u2267\\u0338\",\"&NotGreaterGreater;\":\"\\u226B\\u0338\",\"&NotGreaterLess;\":\"\\u2279\",\"&NotGreaterSlantEqual;\":\"\\u2A7E\\u0338\",\"&NotGreaterTilde;\":\"\\u2275\",\"&NotHumpDownHump;\":\"\\u224E\\u0338\",\"&NotHumpEqual;\":\"\\u224F\\u0338\",\"&NotLeftTriangle;\":\"\\u22EA\",\"&NotLeftTriangleBar;\":\"\\u29CF\\u0338\",\"&NotLeftTriangleEqual;\":\"\\u22EC\",\"&NotLess;\":\"\\u226E\",\"&NotLessEqual;\":\"\\u2270\",\"&NotLessGreater;\":\"\\u2278\",\"&NotLessLess;\":\"\\u226A\\u0338\",\"&NotLessSlantEqual;\":\"\\u2A7D\\u0338\",\"&NotLessTilde;\":\"\\u2274\",\"&NotNestedGreaterGreater;\":\"\\u2AA2\\u0338\",\"&NotNestedLessLess;\":\"\\u2AA1\\u0338\",\"&NotPrecedes;\":\"\\u2280\",\"&NotPrecedesEqual;\":\"\\u2AAF\\u0338\",\"&NotPrecedesSlantEqual;\":\"\\u22E0\",\"&NotReverseElement;\":\"\\u220C\",\"&NotRightTriangle;\":\"\\u22EB\",\"&NotRightTriangleBar;\":\"\\u29D0\\u0338\",\"&NotRightTriangleEqual;\":\"\\u22ED\",\"&NotSquareSubset;\":\"\\u228F\\u0338\",\"&NotSquareSubsetEqual;\":\"\\u22E2\",\"&NotSquareSuperset;\":\"\\u2290\\u0338\",\"&NotSquareSupersetEqual;\":\"\\u22E3\",\"&NotSubset;\":\"\\u2282\\u20D2\",\"&NotSubsetEqual;\":\"\\u2288\",\"&NotSucceeds;\":\"\\u2281\",\"&NotSucceedsEqual;\":\"\\u2AB0\\u0338\",\"&NotSucceedsSlantEqual;\":\"\\u22E1\",\"&NotSucceedsTilde;\":\"\\u227F\\u0338\",\"&NotSuperset;\":\"\\u2283\\u20D2\",\"&NotSupersetEqual;\":\"\\u2289\",\"&NotTilde;\":\"\\u2241\",\"&NotTildeEqual;\":\"\\u2244\",\"&NotTildeFullEqual;\":\"\\u2247\",\"&NotTildeTilde;\":\"\\u2249\",\"&NotVerticalBar;\":\"\\u2224\",\"&Nscr;\":\"\\u{1D4A9}\",\"&Ntilde\":\"\\xD1\",\"&Ntilde;\":\"\\xD1\",\"&Nu;\":\"\\u039D\",\"&OElig;\":\"\\u0152\",\"&Oacute\":\"\\xD3\",\"&Oacute;\":\"\\xD3\",\"&Ocirc\":\"\\xD4\",\"&Ocirc;\":\"\\xD4\",\"&Ocy;\":\"\\u041E\",\"&Odblac;\":\"\\u0150\",\"&Ofr;\":\"\\u{1D512}\",\"&Ograve\":\"\\xD2\",\"&Ograve;\":\"\\xD2\",\"&Omacr;\":\"\\u014C\",\"&Omega;\":\"\\u03A9\",\"&Omicron;\":\"\\u039F\",\"&Oopf;\":\"\\u{1D546}\",\"&OpenCurlyDoubleQuote;\":\"\\u201C\",\"&OpenCurlyQuote;\":\"\\u2018\",\"&Or;\":\"\\u2A54\",\"&Oscr;\":\"\\u{1D4AA}\",\"&Oslash\":\"\\xD8\",\"&Oslash;\":\"\\xD8\",\"&Otilde\":\"\\xD5\",\"&Otilde;\":\"\\xD5\",\"&Otimes;\":\"\\u2A37\",\"&Ouml\":\"\\xD6\",\"&Ouml;\":\"\\xD6\",\"&OverBar;\":\"\\u203E\",\"&OverBrace;\":\"\\u23DE\",\"&OverBracket;\":\"\\u23B4\",\"&OverParenthesis;\":\"\\u23DC\",\"&PartialD;\":\"\\u2202\",\"&Pcy;\":\"\\u041F\",\"&Pfr;\":\"\\u{1D513}\",\"&Phi;\":\"\\u03A6\",\"&Pi;\":\"\\u03A0\",\"&PlusMinus;\":\"\\xB1\",\"&Poincareplane;\":\"\\u210C\",\"&Popf;\":\"\\u2119\",\"&Pr;\":\"\\u2ABB\",\"&Precedes;\":\"\\u227A\",\"&PrecedesEqual;\":\"\\u2AAF\",\"&PrecedesSlantEqual;\":\"\\u227C\",\"&PrecedesTilde;\":\"\\u227E\",\"&Prime;\":\"\\u2033\",\"&Product;\":\"\\u220F\",\"&Proportion;\":\"\\u2237\",\"&Proportional;\":\"\\u221D\",\"&Pscr;\":\"\\u{1D4AB}\",\"&Psi;\":\"\\u03A8\",\"&QUOT\":'\"',\"&QUOT;\":'\"',\"&Qfr;\":\"\\u{1D514}\",\"&Qopf;\":\"\\u211A\",\"&Qscr;\":\"\\u{1D4AC}\",\"&RBarr;\":\"\\u2910\",\"&REG\":\"\\xAE\",\"&REG;\":\"\\xAE\",\"&Racute;\":\"\\u0154\",\"&Rang;\":\"\\u27EB\",\"&Rarr;\":\"\\u21A0\",\"&Rarrtl;\":\"\\u2916\",\"&Rcaron;\":\"\\u0158\",\"&Rcedil;\":\"\\u0156\",\"&Rcy;\":\"\\u0420\",\"&Re;\":\"\\u211C\",\"&ReverseElement;\":\"\\u220B\",\"&ReverseEquilibrium;\":\"\\u21CB\",\"&ReverseUpEquilibrium;\":\"\\u296F\",\"&Rfr;\":\"\\u211C\",\"&Rho;\":\"\\u03A1\",\"&RightAngleBracket;\":\"\\u27E9\",\"&RightArrow;\":\"\\u2192\",\"&RightArrowBar;\":\"\\u21E5\",\"&RightArrowLeftArrow;\":\"\\u21C4\",\"&RightCeiling;\":\"\\u2309\",\"&RightDoubleBracket;\":\"\\u27E7\",\"&RightDownTeeVector;\":\"\\u295D\",\"&RightDownVector;\":\"\\u21C2\",\"&RightDownVectorBar;\":\"\\u2955\",\"&RightFloor;\":\"\\u230B\",\"&RightTee;\":\"\\u22A2\",\"&RightTeeArrow;\":\"\\u21A6\",\"&RightTeeVector;\":\"\\u295B\",\"&RightTriangle;\":\"\\u22B3\",\"&RightTriangleBar;\":\"\\u29D0\",\"&RightTriangleEqual;\":\"\\u22B5\",\"&RightUpDownVector;\":\"\\u294F\",\"&RightUpTeeVector;\":\"\\u295C\",\"&RightUpVector;\":\"\\u21BE\",\"&RightUpVectorBar;\":\"\\u2954\",\"&RightVector;\":\"\\u21C0\",\"&RightVectorBar;\":\"\\u2953\",\"&Rightarrow;\":\"\\u21D2\",\"&Ropf;\":\"\\u211D\",\"&RoundImplies;\":\"\\u2970\",\"&Rrightarrow;\":\"\\u21DB\",\"&Rscr;\":\"\\u211B\",\"&Rsh;\":\"\\u21B1\",\"&RuleDelayed;\":\"\\u29F4\",\"&SHCHcy;\":\"\\u0429\",\"&SHcy;\":\"\\u0428\",\"&SOFTcy;\":\"\\u042C\",\"&Sacute;\":\"\\u015A\",\"&Sc;\":\"\\u2ABC\",\"&Scaron;\":\"\\u0160\",\"&Scedil;\":\"\\u015E\",\"&Scirc;\":\"\\u015C\",\"&Scy;\":\"\\u0421\",\"&Sfr;\":\"\\u{1D516}\",\"&ShortDownArrow;\":\"\\u2193\",\"&ShortLeftArrow;\":\"\\u2190\",\"&ShortRightArrow;\":\"\\u2192\",\"&ShortUpArrow;\":\"\\u2191\",\"&Sigma;\":\"\\u03A3\",\"&SmallCircle;\":\"\\u2218\",\"&Sopf;\":\"\\u{1D54A}\",\"&Sqrt;\":\"\\u221A\",\"&Square;\":\"\\u25A1\",\"&SquareIntersection;\":\"\\u2293\",\"&SquareSubset;\":\"\\u228F\",\"&SquareSubsetEqual;\":\"\\u2291\",\"&SquareSuperset;\":\"\\u2290\",\"&SquareSupersetEqual;\":\"\\u2292\",\"&SquareUnion;\":\"\\u2294\",\"&Sscr;\":\"\\u{1D4AE}\",\"&Star;\":\"\\u22C6\",\"&Sub;\":\"\\u22D0\",\"&Subset;\":\"\\u22D0\",\"&SubsetEqual;\":\"\\u2286\",\"&Succeeds;\":\"\\u227B\",\"&SucceedsEqual;\":\"\\u2AB0\",\"&SucceedsSlantEqual;\":\"\\u227D\",\"&SucceedsTilde;\":\"\\u227F\",\"&SuchThat;\":\"\\u220B\",\"&Sum;\":\"\\u2211\",\"&Sup;\":\"\\u22D1\",\"&Superset;\":\"\\u2283\",\"&SupersetEqual;\":\"\\u2287\",\"&Supset;\":\"\\u22D1\",\"&THORN\":\"\\xDE\",\"&THORN;\":\"\\xDE\",\"&TRADE;\":\"\\u2122\",\"&TSHcy;\":\"\\u040B\",\"&TScy;\":\"\\u0426\",\"&Tab;\":\"\t\",\"&Tau;\":\"\\u03A4\",\"&Tcaron;\":\"\\u0164\",\"&Tcedil;\":\"\\u0162\",\"&Tcy;\":\"\\u0422\",\"&Tfr;\":\"\\u{1D517}\",\"&Therefore;\":\"\\u2234\",\"&Theta;\":\"\\u0398\",\"&ThickSpace;\":\"\\u205F\\u200A\",\"&ThinSpace;\":\"\\u2009\",\"&Tilde;\":\"\\u223C\",\"&TildeEqual;\":\"\\u2243\",\"&TildeFullEqual;\":\"\\u2245\",\"&TildeTilde;\":\"\\u2248\",\"&Topf;\":\"\\u{1D54B}\",\"&TripleDot;\":\"\\u20DB\",\"&Tscr;\":\"\\u{1D4AF}\",\"&Tstrok;\":\"\\u0166\",\"&Uacute\":\"\\xDA\",\"&Uacute;\":\"\\xDA\",\"&Uarr;\":\"\\u219F\",\"&Uarrocir;\":\"\\u2949\",\"&Ubrcy;\":\"\\u040E\",\"&Ubreve;\":\"\\u016C\",\"&Ucirc\":\"\\xDB\",\"&Ucirc;\":\"\\xDB\",\"&Ucy;\":\"\\u0423\",\"&Udblac;\":\"\\u0170\",\"&Ufr;\":\"\\u{1D518}\",\"&Ugrave\":\"\\xD9\",\"&Ugrave;\":\"\\xD9\",\"&Umacr;\":\"\\u016A\",\"&UnderBar;\":\"_\",\"&UnderBrace;\":\"\\u23DF\",\"&UnderBracket;\":\"\\u23B5\",\"&UnderParenthesis;\":\"\\u23DD\",\"&Union;\":\"\\u22C3\",\"&UnionPlus;\":\"\\u228E\",\"&Uogon;\":\"\\u0172\",\"&Uopf;\":\"\\u{1D54C}\",\"&UpArrow;\":\"\\u2191\",\"&UpArrowBar;\":\"\\u2912\",\"&UpArrowDownArrow;\":\"\\u21C5\",\"&UpDownArrow;\":\"\\u2195\",\"&UpEquilibrium;\":\"\\u296E\",\"&UpTee;\":\"\\u22A5\",\"&UpTeeArrow;\":\"\\u21A5\",\"&Uparrow;\":\"\\u21D1\",\"&Updownarrow;\":\"\\u21D5\",\"&UpperLeftArrow;\":\"\\u2196\",\"&UpperRightArrow;\":\"\\u2197\",\"&Upsi;\":\"\\u03D2\",\"&Upsilon;\":\"\\u03A5\",\"&Uring;\":\"\\u016E\",\"&Uscr;\":\"\\u{1D4B0}\",\"&Utilde;\":\"\\u0168\",\"&Uuml\":\"\\xDC\",\"&Uuml;\":\"\\xDC\",\"&VDash;\":\"\\u22AB\",\"&Vbar;\":\"\\u2AEB\",\"&Vcy;\":\"\\u0412\",\"&Vdash;\":\"\\u22A9\",\"&Vdashl;\":\"\\u2AE6\",\"&Vee;\":\"\\u22C1\",\"&Verbar;\":\"\\u2016\",\"&Vert;\":\"\\u2016\",\"&VerticalBar;\":\"\\u2223\",\"&VerticalLine;\":\"|\",\"&VerticalSeparator;\":\"\\u2758\",\"&VerticalTilde;\":\"\\u2240\",\"&VeryThinSpace;\":\"\\u200A\",\"&Vfr;\":\"\\u{1D519}\",\"&Vopf;\":\"\\u{1D54D}\",\"&Vscr;\":\"\\u{1D4B1}\",\"&Vvdash;\":\"\\u22AA\",\"&Wcirc;\":\"\\u0174\",\"&Wedge;\":\"\\u22C0\",\"&Wfr;\":\"\\u{1D51A}\",\"&Wopf;\":\"\\u{1D54E}\",\"&Wscr;\":\"\\u{1D4B2}\",\"&Xfr;\":\"\\u{1D51B}\",\"&Xi;\":\"\\u039E\",\"&Xopf;\":\"\\u{1D54F}\",\"&Xscr;\":\"\\u{1D4B3}\",\"&YAcy;\":\"\\u042F\",\"&YIcy;\":\"\\u0407\",\"&YUcy;\":\"\\u042E\",\"&Yacute\":\"\\xDD\",\"&Yacute;\":\"\\xDD\",\"&Ycirc;\":\"\\u0176\",\"&Ycy;\":\"\\u042B\",\"&Yfr;\":\"\\u{1D51C}\",\"&Yopf;\":\"\\u{1D550}\",\"&Yscr;\":\"\\u{1D4B4}\",\"&Yuml;\":\"\\u0178\",\"&ZHcy;\":\"\\u0416\",\"&Zacute;\":\"\\u0179\",\"&Zcaron;\":\"\\u017D\",\"&Zcy;\":\"\\u0417\",\"&Zdot;\":\"\\u017B\",\"&ZeroWidthSpace;\":\"\\u200B\",\"&Zeta;\":\"\\u0396\",\"&Zfr;\":\"\\u2128\",\"&Zopf;\":\"\\u2124\",\"&Zscr;\":\"\\u{1D4B5}\",\"&aacute\":\"\\xE1\",\"&aacute;\":\"\\xE1\",\"&abreve;\":\"\\u0103\",\"&ac;\":\"\\u223E\",\"&acE;\":\"\\u223E\\u0333\",\"&acd;\":\"\\u223F\",\"&acirc\":\"\\xE2\",\"&acirc;\":\"\\xE2\",\"&acute\":\"\\xB4\",\"&acute;\":\"\\xB4\",\"&acy;\":\"\\u0430\",\"&aelig\":\"\\xE6\",\"&aelig;\":\"\\xE6\",\"&af;\":\"\\u2061\",\"&afr;\":\"\\u{1D51E}\",\"&agrave\":\"\\xE0\",\"&agrave;\":\"\\xE0\",\"&alefsym;\":\"\\u2135\",\"&aleph;\":\"\\u2135\",\"&alpha;\":\"\\u03B1\",\"&amacr;\":\"\\u0101\",\"&amalg;\":\"\\u2A3F\",\"&amp\":\"&\",\"&amp;\":\"&\",\"&and;\":\"\\u2227\",\"&andand;\":\"\\u2A55\",\"&andd;\":\"\\u2A5C\",\"&andslope;\":\"\\u2A58\",\"&andv;\":\"\\u2A5A\",\"&ang;\":\"\\u2220\",\"&ange;\":\"\\u29A4\",\"&angle;\":\"\\u2220\",\"&angmsd;\":\"\\u2221\",\"&angmsdaa;\":\"\\u29A8\",\"&angmsdab;\":\"\\u29A9\",\"&angmsdac;\":\"\\u29AA\",\"&angmsdad;\":\"\\u29AB\",\"&angmsdae;\":\"\\u29AC\",\"&angmsdaf;\":\"\\u29AD\",\"&angmsdag;\":\"\\u29AE\",\"&angmsdah;\":\"\\u29AF\",\"&angrt;\":\"\\u221F\",\"&angrtvb;\":\"\\u22BE\",\"&angrtvbd;\":\"\\u299D\",\"&angsph;\":\"\\u2222\",\"&angst;\":\"\\xC5\",\"&angzarr;\":\"\\u237C\",\"&aogon;\":\"\\u0105\",\"&aopf;\":\"\\u{1D552}\",\"&ap;\":\"\\u2248\",\"&apE;\":\"\\u2A70\",\"&apacir;\":\"\\u2A6F\",\"&ape;\":\"\\u224A\",\"&apid;\":\"\\u224B\",\"&apos;\":\"'\",\"&approx;\":\"\\u2248\",\"&approxeq;\":\"\\u224A\",\"&aring\":\"\\xE5\",\"&aring;\":\"\\xE5\",\"&ascr;\":\"\\u{1D4B6}\",\"&ast;\":\"*\",\"&asymp;\":\"\\u2248\",\"&asympeq;\":\"\\u224D\",\"&atilde\":\"\\xE3\",\"&atilde;\":\"\\xE3\",\"&auml\":\"\\xE4\",\"&auml;\":\"\\xE4\",\"&awconint;\":\"\\u2233\",\"&awint;\":\"\\u2A11\",\"&bNot;\":\"\\u2AED\",\"&backcong;\":\"\\u224C\",\"&backepsilon;\":\"\\u03F6\",\"&backprime;\":\"\\u2035\",\"&backsim;\":\"\\u223D\",\"&backsimeq;\":\"\\u22CD\",\"&barvee;\":\"\\u22BD\",\"&barwed;\":\"\\u2305\",\"&barwedge;\":\"\\u2305\",\"&bbrk;\":\"\\u23B5\",\"&bbrktbrk;\":\"\\u23B6\",\"&bcong;\":\"\\u224C\",\"&bcy;\":\"\\u0431\",\"&bdquo;\":\"\\u201E\",\"&becaus;\":\"\\u2235\",\"&because;\":\"\\u2235\",\"&bemptyv;\":\"\\u29B0\",\"&bepsi;\":\"\\u03F6\",\"&bernou;\":\"\\u212C\",\"&beta;\":\"\\u03B2\",\"&beth;\":\"\\u2136\",\"&between;\":\"\\u226C\",\"&bfr;\":\"\\u{1D51F}\",\"&bigcap;\":\"\\u22C2\",\"&bigcirc;\":\"\\u25EF\",\"&bigcup;\":\"\\u22C3\",\"&bigodot;\":\"\\u2A00\",\"&bigoplus;\":\"\\u2A01\",\"&bigotimes;\":\"\\u2A02\",\"&bigsqcup;\":\"\\u2A06\",\"&bigstar;\":\"\\u2605\",\"&bigtriangledown;\":\"\\u25BD\",\"&bigtriangleup;\":\"\\u25B3\",\"&biguplus;\":\"\\u2A04\",\"&bigvee;\":\"\\u22C1\",\"&bigwedge;\":\"\\u22C0\",\"&bkarow;\":\"\\u290D\",\"&blacklozenge;\":\"\\u29EB\",\"&blacksquare;\":\"\\u25AA\",\"&blacktriangle;\":\"\\u25B4\",\"&blacktriangledown;\":\"\\u25BE\",\"&blacktriangleleft;\":\"\\u25C2\",\"&blacktriangleright;\":\"\\u25B8\",\"&blank;\":\"\\u2423\",\"&blk12;\":\"\\u2592\",\"&blk14;\":\"\\u2591\",\"&blk34;\":\"\\u2593\",\"&block;\":\"\\u2588\",\"&bne;\":\"=\\u20E5\",\"&bnequiv;\":\"\\u2261\\u20E5\",\"&bnot;\":\"\\u2310\",\"&bopf;\":\"\\u{1D553}\",\"&bot;\":\"\\u22A5\",\"&bottom;\":\"\\u22A5\",\"&bowtie;\":\"\\u22C8\",\"&boxDL;\":\"\\u2557\",\"&boxDR;\":\"\\u2554\",\"&boxDl;\":\"\\u2556\",\"&boxDr;\":\"\\u2553\",\"&boxH;\":\"\\u2550\",\"&boxHD;\":\"\\u2566\",\"&boxHU;\":\"\\u2569\",\"&boxHd;\":\"\\u2564\",\"&boxHu;\":\"\\u2567\",\"&boxUL;\":\"\\u255D\",\"&boxUR;\":\"\\u255A\",\"&boxUl;\":\"\\u255C\",\"&boxUr;\":\"\\u2559\",\"&boxV;\":\"\\u2551\",\"&boxVH;\":\"\\u256C\",\"&boxVL;\":\"\\u2563\",\"&boxVR;\":\"\\u2560\",\"&boxVh;\":\"\\u256B\",\"&boxVl;\":\"\\u2562\",\"&boxVr;\":\"\\u255F\",\"&boxbox;\":\"\\u29C9\",\"&boxdL;\":\"\\u2555\",\"&boxdR;\":\"\\u2552\",\"&boxdl;\":\"\\u2510\",\"&boxdr;\":\"\\u250C\",\"&boxh;\":\"\\u2500\",\"&boxhD;\":\"\\u2565\",\"&boxhU;\":\"\\u2568\",\"&boxhd;\":\"\\u252C\",\"&boxhu;\":\"\\u2534\",\"&boxminus;\":\"\\u229F\",\"&boxplus;\":\"\\u229E\",\"&boxtimes;\":\"\\u22A0\",\"&boxuL;\":\"\\u255B\",\"&boxuR;\":\"\\u2558\",\"&boxul;\":\"\\u2518\",\"&boxur;\":\"\\u2514\",\"&boxv;\":\"\\u2502\",\"&boxvH;\":\"\\u256A\",\"&boxvL;\":\"\\u2561\",\"&boxvR;\":\"\\u255E\",\"&boxvh;\":\"\\u253C\",\"&boxvl;\":\"\\u2524\",\"&boxvr;\":\"\\u251C\",\"&bprime;\":\"\\u2035\",\"&breve;\":\"\\u02D8\",\"&brvbar\":\"\\xA6\",\"&brvbar;\":\"\\xA6\",\"&bscr;\":\"\\u{1D4B7}\",\"&bsemi;\":\"\\u204F\",\"&bsim;\":\"\\u223D\",\"&bsime;\":\"\\u22CD\",\"&bsol;\":\"\\\\\",\"&bsolb;\":\"\\u29C5\",\"&bsolhsub;\":\"\\u27C8\",\"&bull;\":\"\\u2022\",\"&bullet;\":\"\\u2022\",\"&bump;\":\"\\u224E\",\"&bumpE;\":\"\\u2AAE\",\"&bumpe;\":\"\\u224F\",\"&bumpeq;\":\"\\u224F\",\"&cacute;\":\"\\u0107\",\"&cap;\":\"\\u2229\",\"&capand;\":\"\\u2A44\",\"&capbrcup;\":\"\\u2A49\",\"&capcap;\":\"\\u2A4B\",\"&capcup;\":\"\\u2A47\",\"&capdot;\":\"\\u2A40\",\"&caps;\":\"\\u2229\\uFE00\",\"&caret;\":\"\\u2041\",\"&caron;\":\"\\u02C7\",\"&ccaps;\":\"\\u2A4D\",\"&ccaron;\":\"\\u010D\",\"&ccedil\":\"\\xE7\",\"&ccedil;\":\"\\xE7\",\"&ccirc;\":\"\\u0109\",\"&ccups;\":\"\\u2A4C\",\"&ccupssm;\":\"\\u2A50\",\"&cdot;\":\"\\u010B\",\"&cedil\":\"\\xB8\",\"&cedil;\":\"\\xB8\",\"&cemptyv;\":\"\\u29B2\",\"&cent\":\"\\xA2\",\"&cent;\":\"\\xA2\",\"&centerdot;\":\"\\xB7\",\"&cfr;\":\"\\u{1D520}\",\"&chcy;\":\"\\u0447\",\"&check;\":\"\\u2713\",\"&checkmark;\":\"\\u2713\",\"&chi;\":\"\\u03C7\",\"&cir;\":\"\\u25CB\",\"&cirE;\":\"\\u29C3\",\"&circ;\":\"\\u02C6\",\"&circeq;\":\"\\u2257\",\"&circlearrowleft;\":\"\\u21BA\",\"&circlearrowright;\":\"\\u21BB\",\"&circledR;\":\"\\xAE\",\"&circledS;\":\"\\u24C8\",\"&circledast;\":\"\\u229B\",\"&circledcirc;\":\"\\u229A\",\"&circleddash;\":\"\\u229D\",\"&cire;\":\"\\u2257\",\"&cirfnint;\":\"\\u2A10\",\"&cirmid;\":\"\\u2AEF\",\"&cirscir;\":\"\\u29C2\",\"&clubs;\":\"\\u2663\",\"&clubsuit;\":\"\\u2663\",\"&colon;\":\":\",\"&colone;\":\"\\u2254\",\"&coloneq;\":\"\\u2254\",\"&comma;\":\",\",\"&commat;\":\"@\",\"&comp;\":\"\\u2201\",\"&compfn;\":\"\\u2218\",\"&complement;\":\"\\u2201\",\"&complexes;\":\"\\u2102\",\"&cong;\":\"\\u2245\",\"&congdot;\":\"\\u2A6D\",\"&conint;\":\"\\u222E\",\"&copf;\":\"\\u{1D554}\",\"&coprod;\":\"\\u2210\",\"&copy\":\"\\xA9\",\"&copy;\":\"\\xA9\",\"&copysr;\":\"\\u2117\",\"&crarr;\":\"\\u21B5\",\"&cross;\":\"\\u2717\",\"&cscr;\":\"\\u{1D4B8}\",\"&csub;\":\"\\u2ACF\",\"&csube;\":\"\\u2AD1\",\"&csup;\":\"\\u2AD0\",\"&csupe;\":\"\\u2AD2\",\"&ctdot;\":\"\\u22EF\",\"&cudarrl;\":\"\\u2938\",\"&cudarrr;\":\"\\u2935\",\"&cuepr;\":\"\\u22DE\",\"&cuesc;\":\"\\u22DF\",\"&cularr;\":\"\\u21B6\",\"&cularrp;\":\"\\u293D\",\"&cup;\":\"\\u222A\",\"&cupbrcap;\":\"\\u2A48\",\"&cupcap;\":\"\\u2A46\",\"&cupcup;\":\"\\u2A4A\",\"&cupdot;\":\"\\u228D\",\"&cupor;\":\"\\u2A45\",\"&cups;\":\"\\u222A\\uFE00\",\"&curarr;\":\"\\u21B7\",\"&curarrm;\":\"\\u293C\",\"&curlyeqprec;\":\"\\u22DE\",\"&curlyeqsucc;\":\"\\u22DF\",\"&curlyvee;\":\"\\u22CE\",\"&curlywedge;\":\"\\u22CF\",\"&curren\":\"\\xA4\",\"&curren;\":\"\\xA4\",\"&curvearrowleft;\":\"\\u21B6\",\"&curvearrowright;\":\"\\u21B7\",\"&cuvee;\":\"\\u22CE\",\"&cuwed;\":\"\\u22CF\",\"&cwconint;\":\"\\u2232\",\"&cwint;\":\"\\u2231\",\"&cylcty;\":\"\\u232D\",\"&dArr;\":\"\\u21D3\",\"&dHar;\":\"\\u2965\",\"&dagger;\":\"\\u2020\",\"&daleth;\":\"\\u2138\",\"&darr;\":\"\\u2193\",\"&dash;\":\"\\u2010\",\"&dashv;\":\"\\u22A3\",\"&dbkarow;\":\"\\u290F\",\"&dblac;\":\"\\u02DD\",\"&dcaron;\":\"\\u010F\",\"&dcy;\":\"\\u0434\",\"&dd;\":\"\\u2146\",\"&ddagger;\":\"\\u2021\",\"&ddarr;\":\"\\u21CA\",\"&ddotseq;\":\"\\u2A77\",\"&deg\":\"\\xB0\",\"&deg;\":\"\\xB0\",\"&delta;\":\"\\u03B4\",\"&demptyv;\":\"\\u29B1\",\"&dfisht;\":\"\\u297F\",\"&dfr;\":\"\\u{1D521}\",\"&dharl;\":\"\\u21C3\",\"&dharr;\":\"\\u21C2\",\"&diam;\":\"\\u22C4\",\"&diamond;\":\"\\u22C4\",\"&diamondsuit;\":\"\\u2666\",\"&diams;\":\"\\u2666\",\"&die;\":\"\\xA8\",\"&digamma;\":\"\\u03DD\",\"&disin;\":\"\\u22F2\",\"&div;\":\"\\xF7\",\"&divide\":\"\\xF7\",\"&divide;\":\"\\xF7\",\"&divideontimes;\":\"\\u22C7\",\"&divonx;\":\"\\u22C7\",\"&djcy;\":\"\\u0452\",\"&dlcorn;\":\"\\u231E\",\"&dlcrop;\":\"\\u230D\",\"&dollar;\":\"$\",\"&dopf;\":\"\\u{1D555}\",\"&dot;\":\"\\u02D9\",\"&doteq;\":\"\\u2250\",\"&doteqdot;\":\"\\u2251\",\"&dotminus;\":\"\\u2238\",\"&dotplus;\":\"\\u2214\",\"&dotsquare;\":\"\\u22A1\",\"&doublebarwedge;\":\"\\u2306\",\"&downarrow;\":\"\\u2193\",\"&downdownarrows;\":\"\\u21CA\",\"&downharpoonleft;\":\"\\u21C3\",\"&downharpoonright;\":\"\\u21C2\",\"&drbkarow;\":\"\\u2910\",\"&drcorn;\":\"\\u231F\",\"&drcrop;\":\"\\u230C\",\"&dscr;\":\"\\u{1D4B9}\",\"&dscy;\":\"\\u0455\",\"&dsol;\":\"\\u29F6\",\"&dstrok;\":\"\\u0111\",\"&dtdot;\":\"\\u22F1\",\"&dtri;\":\"\\u25BF\",\"&dtrif;\":\"\\u25BE\",\"&duarr;\":\"\\u21F5\",\"&duhar;\":\"\\u296F\",\"&dwangle;\":\"\\u29A6\",\"&dzcy;\":\"\\u045F\",\"&dzigrarr;\":\"\\u27FF\",\"&eDDot;\":\"\\u2A77\",\"&eDot;\":\"\\u2251\",\"&eacute\":\"\\xE9\",\"&eacute;\":\"\\xE9\",\"&easter;\":\"\\u2A6E\",\"&ecaron;\":\"\\u011B\",\"&ecir;\":\"\\u2256\",\"&ecirc\":\"\\xEA\",\"&ecirc;\":\"\\xEA\",\"&ecolon;\":\"\\u2255\",\"&ecy;\":\"\\u044D\",\"&edot;\":\"\\u0117\",\"&ee;\":\"\\u2147\",\"&efDot;\":\"\\u2252\",\"&efr;\":\"\\u{1D522}\",\"&eg;\":\"\\u2A9A\",\"&egrave\":\"\\xE8\",\"&egrave;\":\"\\xE8\",\"&egs;\":\"\\u2A96\",\"&egsdot;\":\"\\u2A98\",\"&el;\":\"\\u2A99\",\"&elinters;\":\"\\u23E7\",\"&ell;\":\"\\u2113\",\"&els;\":\"\\u2A95\",\"&elsdot;\":\"\\u2A97\",\"&emacr;\":\"\\u0113\",\"&empty;\":\"\\u2205\",\"&emptyset;\":\"\\u2205\",\"&emptyv;\":\"\\u2205\",\"&emsp13;\":\"\\u2004\",\"&emsp14;\":\"\\u2005\",\"&emsp;\":\"\\u2003\",\"&eng;\":\"\\u014B\",\"&ensp;\":\"\\u2002\",\"&eogon;\":\"\\u0119\",\"&eopf;\":\"\\u{1D556}\",\"&epar;\":\"\\u22D5\",\"&eparsl;\":\"\\u29E3\",\"&eplus;\":\"\\u2A71\",\"&epsi;\":\"\\u03B5\",\"&epsilon;\":\"\\u03B5\",\"&epsiv;\":\"\\u03F5\",\"&eqcirc;\":\"\\u2256\",\"&eqcolon;\":\"\\u2255\",\"&eqsim;\":\"\\u2242\",\"&eqslantgtr;\":\"\\u2A96\",\"&eqslantless;\":\"\\u2A95\",\"&equals;\":\"=\",\"&equest;\":\"\\u225F\",\"&equiv;\":\"\\u2261\",\"&equivDD;\":\"\\u2A78\",\"&eqvparsl;\":\"\\u29E5\",\"&erDot;\":\"\\u2253\",\"&erarr;\":\"\\u2971\",\"&escr;\":\"\\u212F\",\"&esdot;\":\"\\u2250\",\"&esim;\":\"\\u2242\",\"&eta;\":\"\\u03B7\",\"&eth\":\"\\xF0\",\"&eth;\":\"\\xF0\",\"&euml\":\"\\xEB\",\"&euml;\":\"\\xEB\",\"&euro;\":\"\\u20AC\",\"&excl;\":\"!\",\"&exist;\":\"\\u2203\",\"&expectation;\":\"\\u2130\",\"&exponentiale;\":\"\\u2147\",\"&fallingdotseq;\":\"\\u2252\",\"&fcy;\":\"\\u0444\",\"&female;\":\"\\u2640\",\"&ffilig;\":\"\\uFB03\",\"&fflig;\":\"\\uFB00\",\"&ffllig;\":\"\\uFB04\",\"&ffr;\":\"\\u{1D523}\",\"&filig;\":\"\\uFB01\",\"&fjlig;\":\"fj\",\"&flat;\":\"\\u266D\",\"&fllig;\":\"\\uFB02\",\"&fltns;\":\"\\u25B1\",\"&fnof;\":\"\\u0192\",\"&fopf;\":\"\\u{1D557}\",\"&forall;\":\"\\u2200\",\"&fork;\":\"\\u22D4\",\"&forkv;\":\"\\u2AD9\",\"&fpartint;\":\"\\u2A0D\",\"&frac12\":\"\\xBD\",\"&frac12;\":\"\\xBD\",\"&frac13;\":\"\\u2153\",\"&frac14\":\"\\xBC\",\"&frac14;\":\"\\xBC\",\"&frac15;\":\"\\u2155\",\"&frac16;\":\"\\u2159\",\"&frac18;\":\"\\u215B\",\"&frac23;\":\"\\u2154\",\"&frac25;\":\"\\u2156\",\"&frac34\":\"\\xBE\",\"&frac34;\":\"\\xBE\",\"&frac35;\":\"\\u2157\",\"&frac38;\":\"\\u215C\",\"&frac45;\":\"\\u2158\",\"&frac56;\":\"\\u215A\",\"&frac58;\":\"\\u215D\",\"&frac78;\":\"\\u215E\",\"&frasl;\":\"\\u2044\",\"&frown;\":\"\\u2322\",\"&fscr;\":\"\\u{1D4BB}\",\"&gE;\":\"\\u2267\",\"&gEl;\":\"\\u2A8C\",\"&gacute;\":\"\\u01F5\",\"&gamma;\":\"\\u03B3\",\"&gammad;\":\"\\u03DD\",\"&gap;\":\"\\u2A86\",\"&gbreve;\":\"\\u011F\",\"&gcirc;\":\"\\u011D\",\"&gcy;\":\"\\u0433\",\"&gdot;\":\"\\u0121\",\"&ge;\":\"\\u2265\",\"&gel;\":\"\\u22DB\",\"&geq;\":\"\\u2265\",\"&geqq;\":\"\\u2267\",\"&geqslant;\":\"\\u2A7E\",\"&ges;\":\"\\u2A7E\",\"&gescc;\":\"\\u2AA9\",\"&gesdot;\":\"\\u2A80\",\"&gesdoto;\":\"\\u2A82\",\"&gesdotol;\":\"\\u2A84\",\"&gesl;\":\"\\u22DB\\uFE00\",\"&gesles;\":\"\\u2A94\",\"&gfr;\":\"\\u{1D524}\",\"&gg;\":\"\\u226B\",\"&ggg;\":\"\\u22D9\",\"&gimel;\":\"\\u2137\",\"&gjcy;\":\"\\u0453\",\"&gl;\":\"\\u2277\",\"&glE;\":\"\\u2A92\",\"&gla;\":\"\\u2AA5\",\"&glj;\":\"\\u2AA4\",\"&gnE;\":\"\\u2269\",\"&gnap;\":\"\\u2A8A\",\"&gnapprox;\":\"\\u2A8A\",\"&gne;\":\"\\u2A88\",\"&gneq;\":\"\\u2A88\",\"&gneqq;\":\"\\u2269\",\"&gnsim;\":\"\\u22E7\",\"&gopf;\":\"\\u{1D558}\",\"&grave;\":\"`\",\"&gscr;\":\"\\u210A\",\"&gsim;\":\"\\u2273\",\"&gsime;\":\"\\u2A8E\",\"&gsiml;\":\"\\u2A90\",\"&gt\":\">\",\"&gt;\":\">\",\"&gtcc;\":\"\\u2AA7\",\"&gtcir;\":\"\\u2A7A\",\"&gtdot;\":\"\\u22D7\",\"&gtlPar;\":\"\\u2995\",\"&gtquest;\":\"\\u2A7C\",\"&gtrapprox;\":\"\\u2A86\",\"&gtrarr;\":\"\\u2978\",\"&gtrdot;\":\"\\u22D7\",\"&gtreqless;\":\"\\u22DB\",\"&gtreqqless;\":\"\\u2A8C\",\"&gtrless;\":\"\\u2277\",\"&gtrsim;\":\"\\u2273\",\"&gvertneqq;\":\"\\u2269\\uFE00\",\"&gvnE;\":\"\\u2269\\uFE00\",\"&hArr;\":\"\\u21D4\",\"&hairsp;\":\"\\u200A\",\"&half;\":\"\\xBD\",\"&hamilt;\":\"\\u210B\",\"&hardcy;\":\"\\u044A\",\"&harr;\":\"\\u2194\",\"&harrcir;\":\"\\u2948\",\"&harrw;\":\"\\u21AD\",\"&hbar;\":\"\\u210F\",\"&hcirc;\":\"\\u0125\",\"&hearts;\":\"\\u2665\",\"&heartsuit;\":\"\\u2665\",\"&hellip;\":\"\\u2026\",\"&hercon;\":\"\\u22B9\",\"&hfr;\":\"\\u{1D525}\",\"&hksearow;\":\"\\u2925\",\"&hkswarow;\":\"\\u2926\",\"&hoarr;\":\"\\u21FF\",\"&homtht;\":\"\\u223B\",\"&hookleftarrow;\":\"\\u21A9\",\"&hookrightarrow;\":\"\\u21AA\",\"&hopf;\":\"\\u{1D559}\",\"&horbar;\":\"\\u2015\",\"&hscr;\":\"\\u{1D4BD}\",\"&hslash;\":\"\\u210F\",\"&hstrok;\":\"\\u0127\",\"&hybull;\":\"\\u2043\",\"&hyphen;\":\"\\u2010\",\"&iacute\":\"\\xED\",\"&iacute;\":\"\\xED\",\"&ic;\":\"\\u2063\",\"&icirc\":\"\\xEE\",\"&icirc;\":\"\\xEE\",\"&icy;\":\"\\u0438\",\"&iecy;\":\"\\u0435\",\"&iexcl\":\"\\xA1\",\"&iexcl;\":\"\\xA1\",\"&iff;\":\"\\u21D4\",\"&ifr;\":\"\\u{1D526}\",\"&igrave\":\"\\xEC\",\"&igrave;\":\"\\xEC\",\"&ii;\":\"\\u2148\",\"&iiiint;\":\"\\u2A0C\",\"&iiint;\":\"\\u222D\",\"&iinfin;\":\"\\u29DC\",\"&iiota;\":\"\\u2129\",\"&ijlig;\":\"\\u0133\",\"&imacr;\":\"\\u012B\",\"&image;\":\"\\u2111\",\"&imagline;\":\"\\u2110\",\"&imagpart;\":\"\\u2111\",\"&imath;\":\"\\u0131\",\"&imof;\":\"\\u22B7\",\"&imped;\":\"\\u01B5\",\"&in;\":\"\\u2208\",\"&incare;\":\"\\u2105\",\"&infin;\":\"\\u221E\",\"&infintie;\":\"\\u29DD\",\"&inodot;\":\"\\u0131\",\"&int;\":\"\\u222B\",\"&intcal;\":\"\\u22BA\",\"&integers;\":\"\\u2124\",\"&intercal;\":\"\\u22BA\",\"&intlarhk;\":\"\\u2A17\",\"&intprod;\":\"\\u2A3C\",\"&iocy;\":\"\\u0451\",\"&iogon;\":\"\\u012F\",\"&iopf;\":\"\\u{1D55A}\",\"&iota;\":\"\\u03B9\",\"&iprod;\":\"\\u2A3C\",\"&iquest\":\"\\xBF\",\"&iquest;\":\"\\xBF\",\"&iscr;\":\"\\u{1D4BE}\",\"&isin;\":\"\\u2208\",\"&isinE;\":\"\\u22F9\",\"&isindot;\":\"\\u22F5\",\"&isins;\":\"\\u22F4\",\"&isinsv;\":\"\\u22F3\",\"&isinv;\":\"\\u2208\",\"&it;\":\"\\u2062\",\"&itilde;\":\"\\u0129\",\"&iukcy;\":\"\\u0456\",\"&iuml\":\"\\xEF\",\"&iuml;\":\"\\xEF\",\"&jcirc;\":\"\\u0135\",\"&jcy;\":\"\\u0439\",\"&jfr;\":\"\\u{1D527}\",\"&jmath;\":\"\\u0237\",\"&jopf;\":\"\\u{1D55B}\",\"&jscr;\":\"\\u{1D4BF}\",\"&jsercy;\":\"\\u0458\",\"&jukcy;\":\"\\u0454\",\"&kappa;\":\"\\u03BA\",\"&kappav;\":\"\\u03F0\",\"&kcedil;\":\"\\u0137\",\"&kcy;\":\"\\u043A\",\"&kfr;\":\"\\u{1D528}\",\"&kgreen;\":\"\\u0138\",\"&khcy;\":\"\\u0445\",\"&kjcy;\":\"\\u045C\",\"&kopf;\":\"\\u{1D55C}\",\"&kscr;\":\"\\u{1D4C0}\",\"&lAarr;\":\"\\u21DA\",\"&lArr;\":\"\\u21D0\",\"&lAtail;\":\"\\u291B\",\"&lBarr;\":\"\\u290E\",\"&lE;\":\"\\u2266\",\"&lEg;\":\"\\u2A8B\",\"&lHar;\":\"\\u2962\",\"&lacute;\":\"\\u013A\",\"&laemptyv;\":\"\\u29B4\",\"&lagran;\":\"\\u2112\",\"&lambda;\":\"\\u03BB\",\"&lang;\":\"\\u27E8\",\"&langd;\":\"\\u2991\",\"&langle;\":\"\\u27E8\",\"&lap;\":\"\\u2A85\",\"&laquo\":\"\\xAB\",\"&laquo;\":\"\\xAB\",\"&larr;\":\"\\u2190\",\"&larrb;\":\"\\u21E4\",\"&larrbfs;\":\"\\u291F\",\"&larrfs;\":\"\\u291D\",\"&larrhk;\":\"\\u21A9\",\"&larrlp;\":\"\\u21AB\",\"&larrpl;\":\"\\u2939\",\"&larrsim;\":\"\\u2973\",\"&larrtl;\":\"\\u21A2\",\"&lat;\":\"\\u2AAB\",\"&latail;\":\"\\u2919\",\"&late;\":\"\\u2AAD\",\"&lates;\":\"\\u2AAD\\uFE00\",\"&lbarr;\":\"\\u290C\",\"&lbbrk;\":\"\\u2772\",\"&lbrace;\":\"{\",\"&lbrack;\":\"[\",\"&lbrke;\":\"\\u298B\",\"&lbrksld;\":\"\\u298F\",\"&lbrkslu;\":\"\\u298D\",\"&lcaron;\":\"\\u013E\",\"&lcedil;\":\"\\u013C\",\"&lceil;\":\"\\u2308\",\"&lcub;\":\"{\",\"&lcy;\":\"\\u043B\",\"&ldca;\":\"\\u2936\",\"&ldquo;\":\"\\u201C\",\"&ldquor;\":\"\\u201E\",\"&ldrdhar;\":\"\\u2967\",\"&ldrushar;\":\"\\u294B\",\"&ldsh;\":\"\\u21B2\",\"&le;\":\"\\u2264\",\"&leftarrow;\":\"\\u2190\",\"&leftarrowtail;\":\"\\u21A2\",\"&leftharpoondown;\":\"\\u21BD\",\"&leftharpoonup;\":\"\\u21BC\",\"&leftleftarrows;\":\"\\u21C7\",\"&leftrightarrow;\":\"\\u2194\",\"&leftrightarrows;\":\"\\u21C6\",\"&leftrightharpoons;\":\"\\u21CB\",\"&leftrightsquigarrow;\":\"\\u21AD\",\"&leftthreetimes;\":\"\\u22CB\",\"&leg;\":\"\\u22DA\",\"&leq;\":\"\\u2264\",\"&leqq;\":\"\\u2266\",\"&leqslant;\":\"\\u2A7D\",\"&les;\":\"\\u2A7D\",\"&lescc;\":\"\\u2AA8\",\"&lesdot;\":\"\\u2A7F\",\"&lesdoto;\":\"\\u2A81\",\"&lesdotor;\":\"\\u2A83\",\"&lesg;\":\"\\u22DA\\uFE00\",\"&lesges;\":\"\\u2A93\",\"&lessapprox;\":\"\\u2A85\",\"&lessdot;\":\"\\u22D6\",\"&lesseqgtr;\":\"\\u22DA\",\"&lesseqqgtr;\":\"\\u2A8B\",\"&lessgtr;\":\"\\u2276\",\"&lesssim;\":\"\\u2272\",\"&lfisht;\":\"\\u297C\",\"&lfloor;\":\"\\u230A\",\"&lfr;\":\"\\u{1D529}\",\"&lg;\":\"\\u2276\",\"&lgE;\":\"\\u2A91\",\"&lhard;\":\"\\u21BD\",\"&lharu;\":\"\\u21BC\",\"&lharul;\":\"\\u296A\",\"&lhblk;\":\"\\u2584\",\"&ljcy;\":\"\\u0459\",\"&ll;\":\"\\u226A\",\"&llarr;\":\"\\u21C7\",\"&llcorner;\":\"\\u231E\",\"&llhard;\":\"\\u296B\",\"&lltri;\":\"\\u25FA\",\"&lmidot;\":\"\\u0140\",\"&lmoust;\":\"\\u23B0\",\"&lmoustache;\":\"\\u23B0\",\"&lnE;\":\"\\u2268\",\"&lnap;\":\"\\u2A89\",\"&lnapprox;\":\"\\u2A89\",\"&lne;\":\"\\u2A87\",\"&lneq;\":\"\\u2A87\",\"&lneqq;\":\"\\u2268\",\"&lnsim;\":\"\\u22E6\",\"&loang;\":\"\\u27EC\",\"&loarr;\":\"\\u21FD\",\"&lobrk;\":\"\\u27E6\",\"&longleftarrow;\":\"\\u27F5\",\"&longleftrightarrow;\":\"\\u27F7\",\"&longmapsto;\":\"\\u27FC\",\"&longrightarrow;\":\"\\u27F6\",\"&looparrowleft;\":\"\\u21AB\",\"&looparrowright;\":\"\\u21AC\",\"&lopar;\":\"\\u2985\",\"&lopf;\":\"\\u{1D55D}\",\"&loplus;\":\"\\u2A2D\",\"&lotimes;\":\"\\u2A34\",\"&lowast;\":\"\\u2217\",\"&lowbar;\":\"_\",\"&loz;\":\"\\u25CA\",\"&lozenge;\":\"\\u25CA\",\"&lozf;\":\"\\u29EB\",\"&lpar;\":\"(\",\"&lparlt;\":\"\\u2993\",\"&lrarr;\":\"\\u21C6\",\"&lrcorner;\":\"\\u231F\",\"&lrhar;\":\"\\u21CB\",\"&lrhard;\":\"\\u296D\",\"&lrm;\":\"\\u200E\",\"&lrtri;\":\"\\u22BF\",\"&lsaquo;\":\"\\u2039\",\"&lscr;\":\"\\u{1D4C1}\",\"&lsh;\":\"\\u21B0\",\"&lsim;\":\"\\u2272\",\"&lsime;\":\"\\u2A8D\",\"&lsimg;\":\"\\u2A8F\",\"&lsqb;\":\"[\",\"&lsquo;\":\"\\u2018\",\"&lsquor;\":\"\\u201A\",\"&lstrok;\":\"\\u0142\",\"&lt\":\"<\",\"&lt;\":\"<\",\"&ltcc;\":\"\\u2AA6\",\"&ltcir;\":\"\\u2A79\",\"&ltdot;\":\"\\u22D6\",\"&lthree;\":\"\\u22CB\",\"&ltimes;\":\"\\u22C9\",\"&ltlarr;\":\"\\u2976\",\"&ltquest;\":\"\\u2A7B\",\"&ltrPar;\":\"\\u2996\",\"&ltri;\":\"\\u25C3\",\"&ltrie;\":\"\\u22B4\",\"&ltrif;\":\"\\u25C2\",\"&lurdshar;\":\"\\u294A\",\"&luruhar;\":\"\\u2966\",\"&lvertneqq;\":\"\\u2268\\uFE00\",\"&lvnE;\":\"\\u2268\\uFE00\",\"&mDDot;\":\"\\u223A\",\"&macr\":\"\\xAF\",\"&macr;\":\"\\xAF\",\"&male;\":\"\\u2642\",\"&malt;\":\"\\u2720\",\"&maltese;\":\"\\u2720\",\"&map;\":\"\\u21A6\",\"&mapsto;\":\"\\u21A6\",\"&mapstodown;\":\"\\u21A7\",\"&mapstoleft;\":\"\\u21A4\",\"&mapstoup;\":\"\\u21A5\",\"&marker;\":\"\\u25AE\",\"&mcomma;\":\"\\u2A29\",\"&mcy;\":\"\\u043C\",\"&mdash;\":\"\\u2014\",\"&measuredangle;\":\"\\u2221\",\"&mfr;\":\"\\u{1D52A}\",\"&mho;\":\"\\u2127\",\"&micro\":\"\\xB5\",\"&micro;\":\"\\xB5\",\"&mid;\":\"\\u2223\",\"&midast;\":\"*\",\"&midcir;\":\"\\u2AF0\",\"&middot\":\"\\xB7\",\"&middot;\":\"\\xB7\",\"&minus;\":\"\\u2212\",\"&minusb;\":\"\\u229F\",\"&minusd;\":\"\\u2238\",\"&minusdu;\":\"\\u2A2A\",\"&mlcp;\":\"\\u2ADB\",\"&mldr;\":\"\\u2026\",\"&mnplus;\":\"\\u2213\",\"&models;\":\"\\u22A7\",\"&mopf;\":\"\\u{1D55E}\",\"&mp;\":\"\\u2213\",\"&mscr;\":\"\\u{1D4C2}\",\"&mstpos;\":\"\\u223E\",\"&mu;\":\"\\u03BC\",\"&multimap;\":\"\\u22B8\",\"&mumap;\":\"\\u22B8\",\"&nGg;\":\"\\u22D9\\u0338\",\"&nGt;\":\"\\u226B\\u20D2\",\"&nGtv;\":\"\\u226B\\u0338\",\"&nLeftarrow;\":\"\\u21CD\",\"&nLeftrightarrow;\":\"\\u21CE\",\"&nLl;\":\"\\u22D8\\u0338\",\"&nLt;\":\"\\u226A\\u20D2\",\"&nLtv;\":\"\\u226A\\u0338\",\"&nRightarrow;\":\"\\u21CF\",\"&nVDash;\":\"\\u22AF\",\"&nVdash;\":\"\\u22AE\",\"&nabla;\":\"\\u2207\",\"&nacute;\":\"\\u0144\",\"&nang;\":\"\\u2220\\u20D2\",\"&nap;\":\"\\u2249\",\"&napE;\":\"\\u2A70\\u0338\",\"&napid;\":\"\\u224B\\u0338\",\"&napos;\":\"\\u0149\",\"&napprox;\":\"\\u2249\",\"&natur;\":\"\\u266E\",\"&natural;\":\"\\u266E\",\"&naturals;\":\"\\u2115\",\"&nbsp\":\"\\xA0\",\"&nbsp;\":\"\\xA0\",\"&nbump;\":\"\\u224E\\u0338\",\"&nbumpe;\":\"\\u224F\\u0338\",\"&ncap;\":\"\\u2A43\",\"&ncaron;\":\"\\u0148\",\"&ncedil;\":\"\\u0146\",\"&ncong;\":\"\\u2247\",\"&ncongdot;\":\"\\u2A6D\\u0338\",\"&ncup;\":\"\\u2A42\",\"&ncy;\":\"\\u043D\",\"&ndash;\":\"\\u2013\",\"&ne;\":\"\\u2260\",\"&neArr;\":\"\\u21D7\",\"&nearhk;\":\"\\u2924\",\"&nearr;\":\"\\u2197\",\"&nearrow;\":\"\\u2197\",\"&nedot;\":\"\\u2250\\u0338\",\"&nequiv;\":\"\\u2262\",\"&nesear;\":\"\\u2928\",\"&nesim;\":\"\\u2242\\u0338\",\"&nexist;\":\"\\u2204\",\"&nexists;\":\"\\u2204\",\"&nfr;\":\"\\u{1D52B}\",\"&ngE;\":\"\\u2267\\u0338\",\"&nge;\":\"\\u2271\",\"&ngeq;\":\"\\u2271\",\"&ngeqq;\":\"\\u2267\\u0338\",\"&ngeqslant;\":\"\\u2A7E\\u0338\",\"&nges;\":\"\\u2A7E\\u0338\",\"&ngsim;\":\"\\u2275\",\"&ngt;\":\"\\u226F\",\"&ngtr;\":\"\\u226F\",\"&nhArr;\":\"\\u21CE\",\"&nharr;\":\"\\u21AE\",\"&nhpar;\":\"\\u2AF2\",\"&ni;\":\"\\u220B\",\"&nis;\":\"\\u22FC\",\"&nisd;\":\"\\u22FA\",\"&niv;\":\"\\u220B\",\"&njcy;\":\"\\u045A\",\"&nlArr;\":\"\\u21CD\",\"&nlE;\":\"\\u2266\\u0338\",\"&nlarr;\":\"\\u219A\",\"&nldr;\":\"\\u2025\",\"&nle;\":\"\\u2270\",\"&nleftarrow;\":\"\\u219A\",\"&nleftrightarrow;\":\"\\u21AE\",\"&nleq;\":\"\\u2270\",\"&nleqq;\":\"\\u2266\\u0338\",\"&nleqslant;\":\"\\u2A7D\\u0338\",\"&nles;\":\"\\u2A7D\\u0338\",\"&nless;\":\"\\u226E\",\"&nlsim;\":\"\\u2274\",\"&nlt;\":\"\\u226E\",\"&nltri;\":\"\\u22EA\",\"&nltrie;\":\"\\u22EC\",\"&nmid;\":\"\\u2224\",\"&nopf;\":\"\\u{1D55F}\",\"&not\":\"\\xAC\",\"&not;\":\"\\xAC\",\"&notin;\":\"\\u2209\",\"&notinE;\":\"\\u22F9\\u0338\",\"&notindot;\":\"\\u22F5\\u0338\",\"&notinva;\":\"\\u2209\",\"&notinvb;\":\"\\u22F7\",\"&notinvc;\":\"\\u22F6\",\"&notni;\":\"\\u220C\",\"&notniva;\":\"\\u220C\",\"&notnivb;\":\"\\u22FE\",\"&notnivc;\":\"\\u22FD\",\"&npar;\":\"\\u2226\",\"&nparallel;\":\"\\u2226\",\"&nparsl;\":\"\\u2AFD\\u20E5\",\"&npart;\":\"\\u2202\\u0338\",\"&npolint;\":\"\\u2A14\",\"&npr;\":\"\\u2280\",\"&nprcue;\":\"\\u22E0\",\"&npre;\":\"\\u2AAF\\u0338\",\"&nprec;\":\"\\u2280\",\"&npreceq;\":\"\\u2AAF\\u0338\",\"&nrArr;\":\"\\u21CF\",\"&nrarr;\":\"\\u219B\",\"&nrarrc;\":\"\\u2933\\u0338\",\"&nrarrw;\":\"\\u219D\\u0338\",\"&nrightarrow;\":\"\\u219B\",\"&nrtri;\":\"\\u22EB\",\"&nrtrie;\":\"\\u22ED\",\"&nsc;\":\"\\u2281\",\"&nsccue;\":\"\\u22E1\",\"&nsce;\":\"\\u2AB0\\u0338\",\"&nscr;\":\"\\u{1D4C3}\",\"&nshortmid;\":\"\\u2224\",\"&nshortparallel;\":\"\\u2226\",\"&nsim;\":\"\\u2241\",\"&nsime;\":\"\\u2244\",\"&nsimeq;\":\"\\u2244\",\"&nsmid;\":\"\\u2224\",\"&nspar;\":\"\\u2226\",\"&nsqsube;\":\"\\u22E2\",\"&nsqsupe;\":\"\\u22E3\",\"&nsub;\":\"\\u2284\",\"&nsubE;\":\"\\u2AC5\\u0338\",\"&nsube;\":\"\\u2288\",\"&nsubset;\":\"\\u2282\\u20D2\",\"&nsubseteq;\":\"\\u2288\",\"&nsubseteqq;\":\"\\u2AC5\\u0338\",\"&nsucc;\":\"\\u2281\",\"&nsucceq;\":\"\\u2AB0\\u0338\",\"&nsup;\":\"\\u2285\",\"&nsupE;\":\"\\u2AC6\\u0338\",\"&nsupe;\":\"\\u2289\",\"&nsupset;\":\"\\u2283\\u20D2\",\"&nsupseteq;\":\"\\u2289\",\"&nsupseteqq;\":\"\\u2AC6\\u0338\",\"&ntgl;\":\"\\u2279\",\"&ntilde\":\"\\xF1\",\"&ntilde;\":\"\\xF1\",\"&ntlg;\":\"\\u2278\",\"&ntriangleleft;\":\"\\u22EA\",\"&ntrianglelefteq;\":\"\\u22EC\",\"&ntriangleright;\":\"\\u22EB\",\"&ntrianglerighteq;\":\"\\u22ED\",\"&nu;\":\"\\u03BD\",\"&num;\":\"#\",\"&numero;\":\"\\u2116\",\"&numsp;\":\"\\u2007\",\"&nvDash;\":\"\\u22AD\",\"&nvHarr;\":\"\\u2904\",\"&nvap;\":\"\\u224D\\u20D2\",\"&nvdash;\":\"\\u22AC\",\"&nvge;\":\"\\u2265\\u20D2\",\"&nvgt;\":\">\\u20D2\",\"&nvinfin;\":\"\\u29DE\",\"&nvlArr;\":\"\\u2902\",\"&nvle;\":\"\\u2264\\u20D2\",\"&nvlt;\":\"<\\u20D2\",\"&nvltrie;\":\"\\u22B4\\u20D2\",\"&nvrArr;\":\"\\u2903\",\"&nvrtrie;\":\"\\u22B5\\u20D2\",\"&nvsim;\":\"\\u223C\\u20D2\",\"&nwArr;\":\"\\u21D6\",\"&nwarhk;\":\"\\u2923\",\"&nwarr;\":\"\\u2196\",\"&nwarrow;\":\"\\u2196\",\"&nwnear;\":\"\\u2927\",\"&oS;\":\"\\u24C8\",\"&oacute\":\"\\xF3\",\"&oacute;\":\"\\xF3\",\"&oast;\":\"\\u229B\",\"&ocir;\":\"\\u229A\",\"&ocirc\":\"\\xF4\",\"&ocirc;\":\"\\xF4\",\"&ocy;\":\"\\u043E\",\"&odash;\":\"\\u229D\",\"&odblac;\":\"\\u0151\",\"&odiv;\":\"\\u2A38\",\"&odot;\":\"\\u2299\",\"&odsold;\":\"\\u29BC\",\"&oelig;\":\"\\u0153\",\"&ofcir;\":\"\\u29BF\",\"&ofr;\":\"\\u{1D52C}\",\"&ogon;\":\"\\u02DB\",\"&ograve\":\"\\xF2\",\"&ograve;\":\"\\xF2\",\"&ogt;\":\"\\u29C1\",\"&ohbar;\":\"\\u29B5\",\"&ohm;\":\"\\u03A9\",\"&oint;\":\"\\u222E\",\"&olarr;\":\"\\u21BA\",\"&olcir;\":\"\\u29BE\",\"&olcross;\":\"\\u29BB\",\"&oline;\":\"\\u203E\",\"&olt;\":\"\\u29C0\",\"&omacr;\":\"\\u014D\",\"&omega;\":\"\\u03C9\",\"&omicron;\":\"\\u03BF\",\"&omid;\":\"\\u29B6\",\"&ominus;\":\"\\u2296\",\"&oopf;\":\"\\u{1D560}\",\"&opar;\":\"\\u29B7\",\"&operp;\":\"\\u29B9\",\"&oplus;\":\"\\u2295\",\"&or;\":\"\\u2228\",\"&orarr;\":\"\\u21BB\",\"&ord;\":\"\\u2A5D\",\"&order;\":\"\\u2134\",\"&orderof;\":\"\\u2134\",\"&ordf\":\"\\xAA\",\"&ordf;\":\"\\xAA\",\"&ordm\":\"\\xBA\",\"&ordm;\":\"\\xBA\",\"&origof;\":\"\\u22B6\",\"&oror;\":\"\\u2A56\",\"&orslope;\":\"\\u2A57\",\"&orv;\":\"\\u2A5B\",\"&oscr;\":\"\\u2134\",\"&oslash\":\"\\xF8\",\"&oslash;\":\"\\xF8\",\"&osol;\":\"\\u2298\",\"&otilde\":\"\\xF5\",\"&otilde;\":\"\\xF5\",\"&otimes;\":\"\\u2297\",\"&otimesas;\":\"\\u2A36\",\"&ouml\":\"\\xF6\",\"&ouml;\":\"\\xF6\",\"&ovbar;\":\"\\u233D\",\"&par;\":\"\\u2225\",\"&para\":\"\\xB6\",\"&para;\":\"\\xB6\",\"&parallel;\":\"\\u2225\",\"&parsim;\":\"\\u2AF3\",\"&parsl;\":\"\\u2AFD\",\"&part;\":\"\\u2202\",\"&pcy;\":\"\\u043F\",\"&percnt;\":\"%\",\"&period;\":\".\",\"&permil;\":\"\\u2030\",\"&perp;\":\"\\u22A5\",\"&pertenk;\":\"\\u2031\",\"&pfr;\":\"\\u{1D52D}\",\"&phi;\":\"\\u03C6\",\"&phiv;\":\"\\u03D5\",\"&phmmat;\":\"\\u2133\",\"&phone;\":\"\\u260E\",\"&pi;\":\"\\u03C0\",\"&pitchfork;\":\"\\u22D4\",\"&piv;\":\"\\u03D6\",\"&planck;\":\"\\u210F\",\"&planckh;\":\"\\u210E\",\"&plankv;\":\"\\u210F\",\"&plus;\":\"+\",\"&plusacir;\":\"\\u2A23\",\"&plusb;\":\"\\u229E\",\"&pluscir;\":\"\\u2A22\",\"&plusdo;\":\"\\u2214\",\"&plusdu;\":\"\\u2A25\",\"&pluse;\":\"\\u2A72\",\"&plusmn\":\"\\xB1\",\"&plusmn;\":\"\\xB1\",\"&plussim;\":\"\\u2A26\",\"&plustwo;\":\"\\u2A27\",\"&pm;\":\"\\xB1\",\"&pointint;\":\"\\u2A15\",\"&popf;\":\"\\u{1D561}\",\"&pound\":\"\\xA3\",\"&pound;\":\"\\xA3\",\"&pr;\":\"\\u227A\",\"&prE;\":\"\\u2AB3\",\"&prap;\":\"\\u2AB7\",\"&prcue;\":\"\\u227C\",\"&pre;\":\"\\u2AAF\",\"&prec;\":\"\\u227A\",\"&precapprox;\":\"\\u2AB7\",\"&preccurlyeq;\":\"\\u227C\",\"&preceq;\":\"\\u2AAF\",\"&precnapprox;\":\"\\u2AB9\",\"&precneqq;\":\"\\u2AB5\",\"&precnsim;\":\"\\u22E8\",\"&precsim;\":\"\\u227E\",\"&prime;\":\"\\u2032\",\"&primes;\":\"\\u2119\",\"&prnE;\":\"\\u2AB5\",\"&prnap;\":\"\\u2AB9\",\"&prnsim;\":\"\\u22E8\",\"&prod;\":\"\\u220F\",\"&profalar;\":\"\\u232E\",\"&profline;\":\"\\u2312\",\"&profsurf;\":\"\\u2313\",\"&prop;\":\"\\u221D\",\"&propto;\":\"\\u221D\",\"&prsim;\":\"\\u227E\",\"&prurel;\":\"\\u22B0\",\"&pscr;\":\"\\u{1D4C5}\",\"&psi;\":\"\\u03C8\",\"&puncsp;\":\"\\u2008\",\"&qfr;\":\"\\u{1D52E}\",\"&qint;\":\"\\u2A0C\",\"&qopf;\":\"\\u{1D562}\",\"&qprime;\":\"\\u2057\",\"&qscr;\":\"\\u{1D4C6}\",\"&quaternions;\":\"\\u210D\",\"&quatint;\":\"\\u2A16\",\"&quest;\":\"?\",\"&questeq;\":\"\\u225F\",\"&quot\":'\"',\"&quot;\":'\"',\"&rAarr;\":\"\\u21DB\",\"&rArr;\":\"\\u21D2\",\"&rAtail;\":\"\\u291C\",\"&rBarr;\":\"\\u290F\",\"&rHar;\":\"\\u2964\",\"&race;\":\"\\u223D\\u0331\",\"&racute;\":\"\\u0155\",\"&radic;\":\"\\u221A\",\"&raemptyv;\":\"\\u29B3\",\"&rang;\":\"\\u27E9\",\"&rangd;\":\"\\u2992\",\"&range;\":\"\\u29A5\",\"&rangle;\":\"\\u27E9\",\"&raquo\":\"\\xBB\",\"&raquo;\":\"\\xBB\",\"&rarr;\":\"\\u2192\",\"&rarrap;\":\"\\u2975\",\"&rarrb;\":\"\\u21E5\",\"&rarrbfs;\":\"\\u2920\",\"&rarrc;\":\"\\u2933\",\"&rarrfs;\":\"\\u291E\",\"&rarrhk;\":\"\\u21AA\",\"&rarrlp;\":\"\\u21AC\",\"&rarrpl;\":\"\\u2945\",\"&rarrsim;\":\"\\u2974\",\"&rarrtl;\":\"\\u21A3\",\"&rarrw;\":\"\\u219D\",\"&ratail;\":\"\\u291A\",\"&ratio;\":\"\\u2236\",\"&rationals;\":\"\\u211A\",\"&rbarr;\":\"\\u290D\",\"&rbbrk;\":\"\\u2773\",\"&rbrace;\":\"}\",\"&rbrack;\":\"]\",\"&rbrke;\":\"\\u298C\",\"&rbrksld;\":\"\\u298E\",\"&rbrkslu;\":\"\\u2990\",\"&rcaron;\":\"\\u0159\",\"&rcedil;\":\"\\u0157\",\"&rceil;\":\"\\u2309\",\"&rcub;\":\"}\",\"&rcy;\":\"\\u0440\",\"&rdca;\":\"\\u2937\",\"&rdldhar;\":\"\\u2969\",\"&rdquo;\":\"\\u201D\",\"&rdquor;\":\"\\u201D\",\"&rdsh;\":\"\\u21B3\",\"&real;\":\"\\u211C\",\"&realine;\":\"\\u211B\",\"&realpart;\":\"\\u211C\",\"&reals;\":\"\\u211D\",\"&rect;\":\"\\u25AD\",\"&reg\":\"\\xAE\",\"&reg;\":\"\\xAE\",\"&rfisht;\":\"\\u297D\",\"&rfloor;\":\"\\u230B\",\"&rfr;\":\"\\u{1D52F}\",\"&rhard;\":\"\\u21C1\",\"&rharu;\":\"\\u21C0\",\"&rharul;\":\"\\u296C\",\"&rho;\":\"\\u03C1\",\"&rhov;\":\"\\u03F1\",\"&rightarrow;\":\"\\u2192\",\"&rightarrowtail;\":\"\\u21A3\",\"&rightharpoondown;\":\"\\u21C1\",\"&rightharpoonup;\":\"\\u21C0\",\"&rightleftarrows;\":\"\\u21C4\",\"&rightleftharpoons;\":\"\\u21CC\",\"&rightrightarrows;\":\"\\u21C9\",\"&rightsquigarrow;\":\"\\u219D\",\"&rightthreetimes;\":\"\\u22CC\",\"&ring;\":\"\\u02DA\",\"&risingdotseq;\":\"\\u2253\",\"&rlarr;\":\"\\u21C4\",\"&rlhar;\":\"\\u21CC\",\"&rlm;\":\"\\u200F\",\"&rmoust;\":\"\\u23B1\",\"&rmoustache;\":\"\\u23B1\",\"&rnmid;\":\"\\u2AEE\",\"&roang;\":\"\\u27ED\",\"&roarr;\":\"\\u21FE\",\"&robrk;\":\"\\u27E7\",\"&ropar;\":\"\\u2986\",\"&ropf;\":\"\\u{1D563}\",\"&roplus;\":\"\\u2A2E\",\"&rotimes;\":\"\\u2A35\",\"&rpar;\":\")\",\"&rpargt;\":\"\\u2994\",\"&rppolint;\":\"\\u2A12\",\"&rrarr;\":\"\\u21C9\",\"&rsaquo;\":\"\\u203A\",\"&rscr;\":\"\\u{1D4C7}\",\"&rsh;\":\"\\u21B1\",\"&rsqb;\":\"]\",\"&rsquo;\":\"\\u2019\",\"&rsquor;\":\"\\u2019\",\"&rthree;\":\"\\u22CC\",\"&rtimes;\":\"\\u22CA\",\"&rtri;\":\"\\u25B9\",\"&rtrie;\":\"\\u22B5\",\"&rtrif;\":\"\\u25B8\",\"&rtriltri;\":\"\\u29CE\",\"&ruluhar;\":\"\\u2968\",\"&rx;\":\"\\u211E\",\"&sacute;\":\"\\u015B\",\"&sbquo;\":\"\\u201A\",\"&sc;\":\"\\u227B\",\"&scE;\":\"\\u2AB4\",\"&scap;\":\"\\u2AB8\",\"&scaron;\":\"\\u0161\",\"&sccue;\":\"\\u227D\",\"&sce;\":\"\\u2AB0\",\"&scedil;\":\"\\u015F\",\"&scirc;\":\"\\u015D\",\"&scnE;\":\"\\u2AB6\",\"&scnap;\":\"\\u2ABA\",\"&scnsim;\":\"\\u22E9\",\"&scpolint;\":\"\\u2A13\",\"&scsim;\":\"\\u227F\",\"&scy;\":\"\\u0441\",\"&sdot;\":\"\\u22C5\",\"&sdotb;\":\"\\u22A1\",\"&sdote;\":\"\\u2A66\",\"&seArr;\":\"\\u21D8\",\"&searhk;\":\"\\u2925\",\"&searr;\":\"\\u2198\",\"&searrow;\":\"\\u2198\",\"&sect\":\"\\xA7\",\"&sect;\":\"\\xA7\",\"&semi;\":\";\",\"&seswar;\":\"\\u2929\",\"&setminus;\":\"\\u2216\",\"&setmn;\":\"\\u2216\",\"&sext;\":\"\\u2736\",\"&sfr;\":\"\\u{1D530}\",\"&sfrown;\":\"\\u2322\",\"&sharp;\":\"\\u266F\",\"&shchcy;\":\"\\u0449\",\"&shcy;\":\"\\u0448\",\"&shortmid;\":\"\\u2223\",\"&shortparallel;\":\"\\u2225\",\"&shy\":\"\\xAD\",\"&shy;\":\"\\xAD\",\"&sigma;\":\"\\u03C3\",\"&sigmaf;\":\"\\u03C2\",\"&sigmav;\":\"\\u03C2\",\"&sim;\":\"\\u223C\",\"&simdot;\":\"\\u2A6A\",\"&sime;\":\"\\u2243\",\"&simeq;\":\"\\u2243\",\"&simg;\":\"\\u2A9E\",\"&simgE;\":\"\\u2AA0\",\"&siml;\":\"\\u2A9D\",\"&simlE;\":\"\\u2A9F\",\"&simne;\":\"\\u2246\",\"&simplus;\":\"\\u2A24\",\"&simrarr;\":\"\\u2972\",\"&slarr;\":\"\\u2190\",\"&smallsetminus;\":\"\\u2216\",\"&smashp;\":\"\\u2A33\",\"&smeparsl;\":\"\\u29E4\",\"&smid;\":\"\\u2223\",\"&smile;\":\"\\u2323\",\"&smt;\":\"\\u2AAA\",\"&smte;\":\"\\u2AAC\",\"&smtes;\":\"\\u2AAC\\uFE00\",\"&softcy;\":\"\\u044C\",\"&sol;\":\"/\",\"&solb;\":\"\\u29C4\",\"&solbar;\":\"\\u233F\",\"&sopf;\":\"\\u{1D564}\",\"&spades;\":\"\\u2660\",\"&spadesuit;\":\"\\u2660\",\"&spar;\":\"\\u2225\",\"&sqcap;\":\"\\u2293\",\"&sqcaps;\":\"\\u2293\\uFE00\",\"&sqcup;\":\"\\u2294\",\"&sqcups;\":\"\\u2294\\uFE00\",\"&sqsub;\":\"\\u228F\",\"&sqsube;\":\"\\u2291\",\"&sqsubset;\":\"\\u228F\",\"&sqsubseteq;\":\"\\u2291\",\"&sqsup;\":\"\\u2290\",\"&sqsupe;\":\"\\u2292\",\"&sqsupset;\":\"\\u2290\",\"&sqsupseteq;\":\"\\u2292\",\"&squ;\":\"\\u25A1\",\"&square;\":\"\\u25A1\",\"&squarf;\":\"\\u25AA\",\"&squf;\":\"\\u25AA\",\"&srarr;\":\"\\u2192\",\"&sscr;\":\"\\u{1D4C8}\",\"&ssetmn;\":\"\\u2216\",\"&ssmile;\":\"\\u2323\",\"&sstarf;\":\"\\u22C6\",\"&star;\":\"\\u2606\",\"&starf;\":\"\\u2605\",\"&straightepsilon;\":\"\\u03F5\",\"&straightphi;\":\"\\u03D5\",\"&strns;\":\"\\xAF\",\"&sub;\":\"\\u2282\",\"&subE;\":\"\\u2AC5\",\"&subdot;\":\"\\u2ABD\",\"&sube;\":\"\\u2286\",\"&subedot;\":\"\\u2AC3\",\"&submult;\":\"\\u2AC1\",\"&subnE;\":\"\\u2ACB\",\"&subne;\":\"\\u228A\",\"&subplus;\":\"\\u2ABF\",\"&subrarr;\":\"\\u2979\",\"&subset;\":\"\\u2282\",\"&subseteq;\":\"\\u2286\",\"&subseteqq;\":\"\\u2AC5\",\"&subsetneq;\":\"\\u228A\",\"&subsetneqq;\":\"\\u2ACB\",\"&subsim;\":\"\\u2AC7\",\"&subsub;\":\"\\u2AD5\",\"&subsup;\":\"\\u2AD3\",\"&succ;\":\"\\u227B\",\"&succapprox;\":\"\\u2AB8\",\"&succcurlyeq;\":\"\\u227D\",\"&succeq;\":\"\\u2AB0\",\"&succnapprox;\":\"\\u2ABA\",\"&succneqq;\":\"\\u2AB6\",\"&succnsim;\":\"\\u22E9\",\"&succsim;\":\"\\u227F\",\"&sum;\":\"\\u2211\",\"&sung;\":\"\\u266A\",\"&sup1\":\"\\xB9\",\"&sup1;\":\"\\xB9\",\"&sup2\":\"\\xB2\",\"&sup2;\":\"\\xB2\",\"&sup3\":\"\\xB3\",\"&sup3;\":\"\\xB3\",\"&sup;\":\"\\u2283\",\"&supE;\":\"\\u2AC6\",\"&supdot;\":\"\\u2ABE\",\"&supdsub;\":\"\\u2AD8\",\"&supe;\":\"\\u2287\",\"&supedot;\":\"\\u2AC4\",\"&suphsol;\":\"\\u27C9\",\"&suphsub;\":\"\\u2AD7\",\"&suplarr;\":\"\\u297B\",\"&supmult;\":\"\\u2AC2\",\"&supnE;\":\"\\u2ACC\",\"&supne;\":\"\\u228B\",\"&supplus;\":\"\\u2AC0\",\"&supset;\":\"\\u2283\",\"&supseteq;\":\"\\u2287\",\"&supseteqq;\":\"\\u2AC6\",\"&supsetneq;\":\"\\u228B\",\"&supsetneqq;\":\"\\u2ACC\",\"&supsim;\":\"\\u2AC8\",\"&supsub;\":\"\\u2AD4\",\"&supsup;\":\"\\u2AD6\",\"&swArr;\":\"\\u21D9\",\"&swarhk;\":\"\\u2926\",\"&swarr;\":\"\\u2199\",\"&swarrow;\":\"\\u2199\",\"&swnwar;\":\"\\u292A\",\"&szlig\":\"\\xDF\",\"&szlig;\":\"\\xDF\",\"&target;\":\"\\u2316\",\"&tau;\":\"\\u03C4\",\"&tbrk;\":\"\\u23B4\",\"&tcaron;\":\"\\u0165\",\"&tcedil;\":\"\\u0163\",\"&tcy;\":\"\\u0442\",\"&tdot;\":\"\\u20DB\",\"&telrec;\":\"\\u2315\",\"&tfr;\":\"\\u{1D531}\",\"&there4;\":\"\\u2234\",\"&therefore;\":\"\\u2234\",\"&theta;\":\"\\u03B8\",\"&thetasym;\":\"\\u03D1\",\"&thetav;\":\"\\u03D1\",\"&thickapprox;\":\"\\u2248\",\"&thicksim;\":\"\\u223C\",\"&thinsp;\":\"\\u2009\",\"&thkap;\":\"\\u2248\",\"&thksim;\":\"\\u223C\",\"&thorn\":\"\\xFE\",\"&thorn;\":\"\\xFE\",\"&tilde;\":\"\\u02DC\",\"&times\":\"\\xD7\",\"&times;\":\"\\xD7\",\"&timesb;\":\"\\u22A0\",\"&timesbar;\":\"\\u2A31\",\"&timesd;\":\"\\u2A30\",\"&tint;\":\"\\u222D\",\"&toea;\":\"\\u2928\",\"&top;\":\"\\u22A4\",\"&topbot;\":\"\\u2336\",\"&topcir;\":\"\\u2AF1\",\"&topf;\":\"\\u{1D565}\",\"&topfork;\":\"\\u2ADA\",\"&tosa;\":\"\\u2929\",\"&tprime;\":\"\\u2034\",\"&trade;\":\"\\u2122\",\"&triangle;\":\"\\u25B5\",\"&triangledown;\":\"\\u25BF\",\"&triangleleft;\":\"\\u25C3\",\"&trianglelefteq;\":\"\\u22B4\",\"&triangleq;\":\"\\u225C\",\"&triangleright;\":\"\\u25B9\",\"&trianglerighteq;\":\"\\u22B5\",\"&tridot;\":\"\\u25EC\",\"&trie;\":\"\\u225C\",\"&triminus;\":\"\\u2A3A\",\"&triplus;\":\"\\u2A39\",\"&trisb;\":\"\\u29CD\",\"&tritime;\":\"\\u2A3B\",\"&trpezium;\":\"\\u23E2\",\"&tscr;\":\"\\u{1D4C9}\",\"&tscy;\":\"\\u0446\",\"&tshcy;\":\"\\u045B\",\"&tstrok;\":\"\\u0167\",\"&twixt;\":\"\\u226C\",\"&twoheadleftarrow;\":\"\\u219E\",\"&twoheadrightarrow;\":\"\\u21A0\",\"&uArr;\":\"\\u21D1\",\"&uHar;\":\"\\u2963\",\"&uacute\":\"\\xFA\",\"&uacute;\":\"\\xFA\",\"&uarr;\":\"\\u2191\",\"&ubrcy;\":\"\\u045E\",\"&ubreve;\":\"\\u016D\",\"&ucirc\":\"\\xFB\",\"&ucirc;\":\"\\xFB\",\"&ucy;\":\"\\u0443\",\"&udarr;\":\"\\u21C5\",\"&udblac;\":\"\\u0171\",\"&udhar;\":\"\\u296E\",\"&ufisht;\":\"\\u297E\",\"&ufr;\":\"\\u{1D532}\",\"&ugrave\":\"\\xF9\",\"&ugrave;\":\"\\xF9\",\"&uharl;\":\"\\u21BF\",\"&uharr;\":\"\\u21BE\",\"&uhblk;\":\"\\u2580\",\"&ulcorn;\":\"\\u231C\",\"&ulcorner;\":\"\\u231C\",\"&ulcrop;\":\"\\u230F\",\"&ultri;\":\"\\u25F8\",\"&umacr;\":\"\\u016B\",\"&uml\":\"\\xA8\",\"&uml;\":\"\\xA8\",\"&uogon;\":\"\\u0173\",\"&uopf;\":\"\\u{1D566}\",\"&uparrow;\":\"\\u2191\",\"&updownarrow;\":\"\\u2195\",\"&upharpoonleft;\":\"\\u21BF\",\"&upharpoonright;\":\"\\u21BE\",\"&uplus;\":\"\\u228E\",\"&upsi;\":\"\\u03C5\",\"&upsih;\":\"\\u03D2\",\"&upsilon;\":\"\\u03C5\",\"&upuparrows;\":\"\\u21C8\",\"&urcorn;\":\"\\u231D\",\"&urcorner;\":\"\\u231D\",\"&urcrop;\":\"\\u230E\",\"&uring;\":\"\\u016F\",\"&urtri;\":\"\\u25F9\",\"&uscr;\":\"\\u{1D4CA}\",\"&utdot;\":\"\\u22F0\",\"&utilde;\":\"\\u0169\",\"&utri;\":\"\\u25B5\",\"&utrif;\":\"\\u25B4\",\"&uuarr;\":\"\\u21C8\",\"&uuml\":\"\\xFC\",\"&uuml;\":\"\\xFC\",\"&uwangle;\":\"\\u29A7\",\"&vArr;\":\"\\u21D5\",\"&vBar;\":\"\\u2AE8\",\"&vBarv;\":\"\\u2AE9\",\"&vDash;\":\"\\u22A8\",\"&vangrt;\":\"\\u299C\",\"&varepsilon;\":\"\\u03F5\",\"&varkappa;\":\"\\u03F0\",\"&varnothing;\":\"\\u2205\",\"&varphi;\":\"\\u03D5\",\"&varpi;\":\"\\u03D6\",\"&varpropto;\":\"\\u221D\",\"&varr;\":\"\\u2195\",\"&varrho;\":\"\\u03F1\",\"&varsigma;\":\"\\u03C2\",\"&varsubsetneq;\":\"\\u228A\\uFE00\",\"&varsubsetneqq;\":\"\\u2ACB\\uFE00\",\"&varsupsetneq;\":\"\\u228B\\uFE00\",\"&varsupsetneqq;\":\"\\u2ACC\\uFE00\",\"&vartheta;\":\"\\u03D1\",\"&vartriangleleft;\":\"\\u22B2\",\"&vartriangleright;\":\"\\u22B3\",\"&vcy;\":\"\\u0432\",\"&vdash;\":\"\\u22A2\",\"&vee;\":\"\\u2228\",\"&veebar;\":\"\\u22BB\",\"&veeeq;\":\"\\u225A\",\"&vellip;\":\"\\u22EE\",\"&verbar;\":\"|\",\"&vert;\":\"|\",\"&vfr;\":\"\\u{1D533}\",\"&vltri;\":\"\\u22B2\",\"&vnsub;\":\"\\u2282\\u20D2\",\"&vnsup;\":\"\\u2283\\u20D2\",\"&vopf;\":\"\\u{1D567}\",\"&vprop;\":\"\\u221D\",\"&vrtri;\":\"\\u22B3\",\"&vscr;\":\"\\u{1D4CB}\",\"&vsubnE;\":\"\\u2ACB\\uFE00\",\"&vsubne;\":\"\\u228A\\uFE00\",\"&vsupnE;\":\"\\u2ACC\\uFE00\",\"&vsupne;\":\"\\u228B\\uFE00\",\"&vzigzag;\":\"\\u299A\",\"&wcirc;\":\"\\u0175\",\"&wedbar;\":\"\\u2A5F\",\"&wedge;\":\"\\u2227\",\"&wedgeq;\":\"\\u2259\",\"&weierp;\":\"\\u2118\",\"&wfr;\":\"\\u{1D534}\",\"&wopf;\":\"\\u{1D568}\",\"&wp;\":\"\\u2118\",\"&wr;\":\"\\u2240\",\"&wreath;\":\"\\u2240\",\"&wscr;\":\"\\u{1D4CC}\",\"&xcap;\":\"\\u22C2\",\"&xcirc;\":\"\\u25EF\",\"&xcup;\":\"\\u22C3\",\"&xdtri;\":\"\\u25BD\",\"&xfr;\":\"\\u{1D535}\",\"&xhArr;\":\"\\u27FA\",\"&xharr;\":\"\\u27F7\",\"&xi;\":\"\\u03BE\",\"&xlArr;\":\"\\u27F8\",\"&xlarr;\":\"\\u27F5\",\"&xmap;\":\"\\u27FC\",\"&xnis;\":\"\\u22FB\",\"&xodot;\":\"\\u2A00\",\"&xopf;\":\"\\u{1D569}\",\"&xoplus;\":\"\\u2A01\",\"&xotime;\":\"\\u2A02\",\"&xrArr;\":\"\\u27F9\",\"&xrarr;\":\"\\u27F6\",\"&xscr;\":\"\\u{1D4CD}\",\"&xsqcup;\":\"\\u2A06\",\"&xuplus;\":\"\\u2A04\",\"&xutri;\":\"\\u25B3\",\"&xvee;\":\"\\u22C1\",\"&xwedge;\":\"\\u22C0\",\"&yacute\":\"\\xFD\",\"&yacute;\":\"\\xFD\",\"&yacy;\":\"\\u044F\",\"&ycirc;\":\"\\u0177\",\"&ycy;\":\"\\u044B\",\"&yen\":\"\\xA5\",\"&yen;\":\"\\xA5\",\"&yfr;\":\"\\u{1D536}\",\"&yicy;\":\"\\u0457\",\"&yopf;\":\"\\u{1D56A}\",\"&yscr;\":\"\\u{1D4CE}\",\"&yucy;\":\"\\u044E\",\"&yuml\":\"\\xFF\",\"&yuml;\":\"\\xFF\",\"&zacute;\":\"\\u017A\",\"&zcaron;\":\"\\u017E\",\"&zcy;\":\"\\u0437\",\"&zdot;\":\"\\u017C\",\"&zeetrf;\":\"\\u2128\",\"&zeta;\":\"\\u03B6\",\"&zfr;\":\"\\u{1D537}\",\"&zhcy;\":\"\\u0436\",\"&zigrarr;\":\"\\u21DD\",\"&zopf;\":\"\\u{1D56B}\",\"&zscr;\":\"\\u{1D4CF}\",\"&zwj;\":\"\\u200D\",\"&zwnj;\":\"\\u200C\"},characters:{\\u00C6:\"&AElig;\",\"&\":\"&amp;\",\\u00C1:\"&Aacute;\",\\u0102:\"&Abreve;\",\\u00C2:\"&Acirc;\",\\u0410:\"&Acy;\",\"\\u{1D504}\":\"&Afr;\",\\u00C0:\"&Agrave;\",\\u0391:\"&Alpha;\",\\u0100:\"&Amacr;\",\"\\u2A53\":\"&And;\",\\u0104:\"&Aogon;\",\"\\u{1D538}\":\"&Aopf;\",\"\\u2061\":\"&af;\",\\u00C5:\"&angst;\",\"\\u{1D49C}\":\"&Ascr;\",\"\\u2254\":\"&coloneq;\",\\u00C3:\"&Atilde;\",\\u00C4:\"&Auml;\",\"\\u2216\":\"&ssetmn;\",\"\\u2AE7\":\"&Barv;\",\"\\u2306\":\"&doublebarwedge;\",\\u0411:\"&Bcy;\",\"\\u2235\":\"&because;\",\\u212C:\"&bernou;\",\\u0392:\"&Beta;\",\"\\u{1D505}\":\"&Bfr;\",\"\\u{1D539}\":\"&Bopf;\",\"\\u02D8\":\"&breve;\",\"\\u224E\":\"&bump;\",\\u0427:\"&CHcy;\",\"\\xA9\":\"&copy;\",\\u0106:\"&Cacute;\",\"\\u22D2\":\"&Cap;\",\"\\u2145\":\"&DD;\",\\u212D:\"&Cfr;\",\\u010C:\"&Ccaron;\",\\u00C7:\"&Ccedil;\",\\u0108:\"&Ccirc;\",\"\\u2230\":\"&Cconint;\",\\u010A:\"&Cdot;\",\"\\xB8\":\"&cedil;\",\"\\xB7\":\"&middot;\",\\u03A7:\"&Chi;\",\"\\u2299\":\"&odot;\",\"\\u2296\":\"&ominus;\",\"\\u2295\":\"&oplus;\",\"\\u2297\":\"&otimes;\",\"\\u2232\":\"&cwconint;\",\"\\u201D\":\"&rdquor;\",\"\\u2019\":\"&rsquor;\",\"\\u2237\":\"&Proportion;\",\"\\u2A74\":\"&Colone;\",\"\\u2261\":\"&equiv;\",\"\\u222F\":\"&DoubleContourIntegral;\",\"\\u222E\":\"&oint;\",\\u2102:\"&complexes;\",\"\\u2210\":\"&coprod;\",\"\\u2233\":\"&awconint;\",\"\\u2A2F\":\"&Cross;\",\"\\u{1D49E}\":\"&Cscr;\",\"\\u22D3\":\"&Cup;\",\"\\u224D\":\"&asympeq;\",\"\\u2911\":\"&DDotrahd;\",\\u0402:\"&DJcy;\",\\u0405:\"&DScy;\",\\u040F:\"&DZcy;\",\"\\u2021\":\"&ddagger;\",\"\\u21A1\":\"&Darr;\",\"\\u2AE4\":\"&DoubleLeftTee;\",\\u010E:\"&Dcaron;\",\\u0414:\"&Dcy;\",\"\\u2207\":\"&nabla;\",\\u0394:\"&Delta;\",\"\\u{1D507}\":\"&Dfr;\",\"\\xB4\":\"&acute;\",\"\\u02D9\":\"&dot;\",\"\\u02DD\":\"&dblac;\",\"`\":\"&grave;\",\"\\u02DC\":\"&tilde;\",\"\\u22C4\":\"&diamond;\",\"\\u2146\":\"&dd;\",\"\\u{1D53B}\":\"&Dopf;\",\"\\xA8\":\"&uml;\",\"\\u20DC\":\"&DotDot;\",\"\\u2250\":\"&esdot;\",\"\\u21D3\":\"&dArr;\",\"\\u21D0\":\"&lArr;\",\"\\u21D4\":\"&iff;\",\"\\u27F8\":\"&xlArr;\",\"\\u27FA\":\"&xhArr;\",\"\\u27F9\":\"&xrArr;\",\"\\u21D2\":\"&rArr;\",\"\\u22A8\":\"&vDash;\",\"\\u21D1\":\"&uArr;\",\"\\u21D5\":\"&vArr;\",\"\\u2225\":\"&spar;\",\"\\u2193\":\"&downarrow;\",\"\\u2913\":\"&DownArrowBar;\",\"\\u21F5\":\"&duarr;\",\"\\u0311\":\"&DownBreve;\",\"\\u2950\":\"&DownLeftRightVector;\",\"\\u295E\":\"&DownLeftTeeVector;\",\"\\u21BD\":\"&lhard;\",\"\\u2956\":\"&DownLeftVectorBar;\",\"\\u295F\":\"&DownRightTeeVector;\",\"\\u21C1\":\"&rightharpoondown;\",\"\\u2957\":\"&DownRightVectorBar;\",\"\\u22A4\":\"&top;\",\"\\u21A7\":\"&mapstodown;\",\"\\u{1D49F}\":\"&Dscr;\",\\u0110:\"&Dstrok;\",\\u014A:\"&ENG;\",\\u00D0:\"&ETH;\",\\u00C9:\"&Eacute;\",\\u011A:\"&Ecaron;\",\\u00CA:\"&Ecirc;\",\\u042D:\"&Ecy;\",\\u0116:\"&Edot;\",\"\\u{1D508}\":\"&Efr;\",\\u00C8:\"&Egrave;\",\"\\u2208\":\"&isinv;\",\\u0112:\"&Emacr;\",\"\\u25FB\":\"&EmptySmallSquare;\",\"\\u25AB\":\"&EmptyVerySmallSquare;\",\\u0118:\"&Eogon;\",\"\\u{1D53C}\":\"&Eopf;\",\\u0395:\"&Epsilon;\",\"\\u2A75\":\"&Equal;\",\"\\u2242\":\"&esim;\",\"\\u21CC\":\"&rlhar;\",\\u2130:\"&expectation;\",\"\\u2A73\":\"&Esim;\",\\u0397:\"&Eta;\",\\u00CB:\"&Euml;\",\"\\u2203\":\"&exist;\",\"\\u2147\":\"&exponentiale;\",\\u0424:\"&Fcy;\",\"\\u{1D509}\":\"&Ffr;\",\"\\u25FC\":\"&FilledSmallSquare;\",\"\\u25AA\":\"&squf;\",\"\\u{1D53D}\":\"&Fopf;\",\"\\u2200\":\"&forall;\",\\u2131:\"&Fscr;\",\\u0403:\"&GJcy;\",\">\":\"&gt;\",\\u0393:\"&Gamma;\",\\u03DC:\"&Gammad;\",\\u011E:\"&Gbreve;\",\\u0122:\"&Gcedil;\",\\u011C:\"&Gcirc;\",\\u0413:\"&Gcy;\",\\u0120:\"&Gdot;\",\"\\u{1D50A}\":\"&Gfr;\",\"\\u22D9\":\"&ggg;\",\"\\u{1D53E}\":\"&Gopf;\",\"\\u2265\":\"&geq;\",\"\\u22DB\":\"&gtreqless;\",\"\\u2267\":\"&geqq;\",\"\\u2AA2\":\"&GreaterGreater;\",\"\\u2277\":\"&gtrless;\",\"\\u2A7E\":\"&ges;\",\"\\u2273\":\"&gtrsim;\",\"\\u{1D4A2}\":\"&Gscr;\",\"\\u226B\":\"&gg;\",\\u042A:\"&HARDcy;\",\"\\u02C7\":\"&caron;\",\"^\":\"&Hat;\",\\u0124:\"&Hcirc;\",\\u210C:\"&Poincareplane;\",\\u210B:\"&hamilt;\",\\u210D:\"&quaternions;\",\"\\u2500\":\"&boxh;\",\\u0126:\"&Hstrok;\",\"\\u224F\":\"&bumpeq;\",\\u0415:\"&IEcy;\",\\u0132:\"&IJlig;\",\\u0401:\"&IOcy;\",\\u00CD:\"&Iacute;\",\\u00CE:\"&Icirc;\",\\u0418:\"&Icy;\",\\u0130:\"&Idot;\",\\u2111:\"&imagpart;\",\\u00CC:\"&Igrave;\",\\u012A:\"&Imacr;\",\"\\u2148\":\"&ii;\",\"\\u222C\":\"&Int;\",\"\\u222B\":\"&int;\",\"\\u22C2\":\"&xcap;\",\"\\u2063\":\"&ic;\",\"\\u2062\":\"&it;\",\\u012E:\"&Iogon;\",\"\\u{1D540}\":\"&Iopf;\",\\u0399:\"&Iota;\",\\u2110:\"&imagline;\",\\u0128:\"&Itilde;\",\\u0406:\"&Iukcy;\",\\u00CF:\"&Iuml;\",\\u0134:\"&Jcirc;\",\\u0419:\"&Jcy;\",\"\\u{1D50D}\":\"&Jfr;\",\"\\u{1D541}\":\"&Jopf;\",\"\\u{1D4A5}\":\"&Jscr;\",\\u0408:\"&Jsercy;\",\\u0404:\"&Jukcy;\",\\u0425:\"&KHcy;\",\\u040C:\"&KJcy;\",\\u039A:\"&Kappa;\",\\u0136:\"&Kcedil;\",\\u041A:\"&Kcy;\",\"\\u{1D50E}\":\"&Kfr;\",\"\\u{1D542}\":\"&Kopf;\",\"\\u{1D4A6}\":\"&Kscr;\",\\u0409:\"&LJcy;\",\"<\":\"&lt;\",\\u0139:\"&Lacute;\",\\u039B:\"&Lambda;\",\"\\u27EA\":\"&Lang;\",\\u2112:\"&lagran;\",\"\\u219E\":\"&twoheadleftarrow;\",\\u013D:\"&Lcaron;\",\\u013B:\"&Lcedil;\",\\u041B:\"&Lcy;\",\"\\u27E8\":\"&langle;\",\"\\u2190\":\"&slarr;\",\"\\u21E4\":\"&larrb;\",\"\\u21C6\":\"&lrarr;\",\"\\u2308\":\"&lceil;\",\"\\u27E6\":\"&lobrk;\",\"\\u2961\":\"&LeftDownTeeVector;\",\"\\u21C3\":\"&downharpoonleft;\",\"\\u2959\":\"&LeftDownVectorBar;\",\"\\u230A\":\"&lfloor;\",\"\\u2194\":\"&leftrightarrow;\",\"\\u294E\":\"&LeftRightVector;\",\"\\u22A3\":\"&dashv;\",\"\\u21A4\":\"&mapstoleft;\",\"\\u295A\":\"&LeftTeeVector;\",\"\\u22B2\":\"&vltri;\",\"\\u29CF\":\"&LeftTriangleBar;\",\"\\u22B4\":\"&trianglelefteq;\",\"\\u2951\":\"&LeftUpDownVector;\",\"\\u2960\":\"&LeftUpTeeVector;\",\"\\u21BF\":\"&upharpoonleft;\",\"\\u2958\":\"&LeftUpVectorBar;\",\"\\u21BC\":\"&lharu;\",\"\\u2952\":\"&LeftVectorBar;\",\"\\u22DA\":\"&lesseqgtr;\",\"\\u2266\":\"&leqq;\",\"\\u2276\":\"&lg;\",\"\\u2AA1\":\"&LessLess;\",\"\\u2A7D\":\"&les;\",\"\\u2272\":\"&lsim;\",\"\\u{1D50F}\":\"&Lfr;\",\"\\u22D8\":\"&Ll;\",\"\\u21DA\":\"&lAarr;\",\\u013F:\"&Lmidot;\",\"\\u27F5\":\"&xlarr;\",\"\\u27F7\":\"&xharr;\",\"\\u27F6\":\"&xrarr;\",\"\\u{1D543}\":\"&Lopf;\",\"\\u2199\":\"&swarrow;\",\"\\u2198\":\"&searrow;\",\"\\u21B0\":\"&lsh;\",\\u0141:\"&Lstrok;\",\"\\u226A\":\"&ll;\",\"\\u2905\":\"&Map;\",\\u041C:\"&Mcy;\",\"\\u205F\":\"&MediumSpace;\",\\u2133:\"&phmmat;\",\"\\u{1D510}\":\"&Mfr;\",\"\\u2213\":\"&mp;\",\"\\u{1D544}\":\"&Mopf;\",\\u039C:\"&Mu;\",\\u040A:\"&NJcy;\",\\u0143:\"&Nacute;\",\\u0147:\"&Ncaron;\",\\u0145:\"&Ncedil;\",\\u041D:\"&Ncy;\",\"\\u200B\":\"&ZeroWidthSpace;\",\"\\n\":\"&NewLine;\",\"\\u{1D511}\":\"&Nfr;\",\"\\u2060\":\"&NoBreak;\",\"\\xA0\":\"&nbsp;\",\\u2115:\"&naturals;\",\"\\u2AEC\":\"&Not;\",\"\\u2262\":\"&nequiv;\",\"\\u226D\":\"&NotCupCap;\",\"\\u2226\":\"&nspar;\",\"\\u2209\":\"&notinva;\",\"\\u2260\":\"&ne;\",\"\\u2242\\u0338\":\"&nesim;\",\"\\u2204\":\"&nexists;\",\"\\u226F\":\"&ngtr;\",\"\\u2271\":\"&ngeq;\",\"\\u2267\\u0338\":\"&ngeqq;\",\"\\u226B\\u0338\":\"&nGtv;\",\"\\u2279\":\"&ntgl;\",\"\\u2A7E\\u0338\":\"&nges;\",\"\\u2275\":\"&ngsim;\",\"\\u224E\\u0338\":\"&nbump;\",\"\\u224F\\u0338\":\"&nbumpe;\",\"\\u22EA\":\"&ntriangleleft;\",\"\\u29CF\\u0338\":\"&NotLeftTriangleBar;\",\"\\u22EC\":\"&ntrianglelefteq;\",\"\\u226E\":\"&nlt;\",\"\\u2270\":\"&nleq;\",\"\\u2278\":\"&ntlg;\",\"\\u226A\\u0338\":\"&nLtv;\",\"\\u2A7D\\u0338\":\"&nles;\",\"\\u2274\":\"&nlsim;\",\"\\u2AA2\\u0338\":\"&NotNestedGreaterGreater;\",\"\\u2AA1\\u0338\":\"&NotNestedLessLess;\",\"\\u2280\":\"&nprec;\",\"\\u2AAF\\u0338\":\"&npreceq;\",\"\\u22E0\":\"&nprcue;\",\"\\u220C\":\"&notniva;\",\"\\u22EB\":\"&ntriangleright;\",\"\\u29D0\\u0338\":\"&NotRightTriangleBar;\",\"\\u22ED\":\"&ntrianglerighteq;\",\"\\u228F\\u0338\":\"&NotSquareSubset;\",\"\\u22E2\":\"&nsqsube;\",\"\\u2290\\u0338\":\"&NotSquareSuperset;\",\"\\u22E3\":\"&nsqsupe;\",\"\\u2282\\u20D2\":\"&vnsub;\",\"\\u2288\":\"&nsubseteq;\",\"\\u2281\":\"&nsucc;\",\"\\u2AB0\\u0338\":\"&nsucceq;\",\"\\u22E1\":\"&nsccue;\",\"\\u227F\\u0338\":\"&NotSucceedsTilde;\",\"\\u2283\\u20D2\":\"&vnsup;\",\"\\u2289\":\"&nsupseteq;\",\"\\u2241\":\"&nsim;\",\"\\u2244\":\"&nsimeq;\",\"\\u2247\":\"&ncong;\",\"\\u2249\":\"&napprox;\",\"\\u2224\":\"&nsmid;\",\"\\u{1D4A9}\":\"&Nscr;\",\\u00D1:\"&Ntilde;\",\\u039D:\"&Nu;\",\\u0152:\"&OElig;\",\\u00D3:\"&Oacute;\",\\u00D4:\"&Ocirc;\",\\u041E:\"&Ocy;\",\\u0150:\"&Odblac;\",\"\\u{1D512}\":\"&Ofr;\",\\u00D2:\"&Ograve;\",\\u014C:\"&Omacr;\",\\u03A9:\"&ohm;\",\\u039F:\"&Omicron;\",\"\\u{1D546}\":\"&Oopf;\",\"\\u201C\":\"&ldquo;\",\"\\u2018\":\"&lsquo;\",\"\\u2A54\":\"&Or;\",\"\\u{1D4AA}\":\"&Oscr;\",\\u00D8:\"&Oslash;\",\\u00D5:\"&Otilde;\",\"\\u2A37\":\"&Otimes;\",\\u00D6:\"&Ouml;\",\"\\u203E\":\"&oline;\",\"\\u23DE\":\"&OverBrace;\",\"\\u23B4\":\"&tbrk;\",\"\\u23DC\":\"&OverParenthesis;\",\"\\u2202\":\"&part;\",\\u041F:\"&Pcy;\",\"\\u{1D513}\":\"&Pfr;\",\\u03A6:\"&Phi;\",\\u03A0:\"&Pi;\",\"\\xB1\":\"&pm;\",\\u2119:\"&primes;\",\"\\u2ABB\":\"&Pr;\",\"\\u227A\":\"&prec;\",\"\\u2AAF\":\"&preceq;\",\"\\u227C\":\"&preccurlyeq;\",\"\\u227E\":\"&prsim;\",\"\\u2033\":\"&Prime;\",\"\\u220F\":\"&prod;\",\"\\u221D\":\"&vprop;\",\"\\u{1D4AB}\":\"&Pscr;\",\\u03A8:\"&Psi;\",'\"':\"&quot;\",\"\\u{1D514}\":\"&Qfr;\",\\u211A:\"&rationals;\",\"\\u{1D4AC}\":\"&Qscr;\",\"\\u2910\":\"&drbkarow;\",\"\\xAE\":\"&reg;\",\\u0154:\"&Racute;\",\"\\u27EB\":\"&Rang;\",\"\\u21A0\":\"&twoheadrightarrow;\",\"\\u2916\":\"&Rarrtl;\",\\u0158:\"&Rcaron;\",\\u0156:\"&Rcedil;\",\\u0420:\"&Rcy;\",\\u211C:\"&realpart;\",\"\\u220B\":\"&niv;\",\"\\u21CB\":\"&lrhar;\",\"\\u296F\":\"&duhar;\",\\u03A1:\"&Rho;\",\"\\u27E9\":\"&rangle;\",\"\\u2192\":\"&srarr;\",\"\\u21E5\":\"&rarrb;\",\"\\u21C4\":\"&rlarr;\",\"\\u2309\":\"&rceil;\",\"\\u27E7\":\"&robrk;\",\"\\u295D\":\"&RightDownTeeVector;\",\"\\u21C2\":\"&downharpoonright;\",\"\\u2955\":\"&RightDownVectorBar;\",\"\\u230B\":\"&rfloor;\",\"\\u22A2\":\"&vdash;\",\"\\u21A6\":\"&mapsto;\",\"\\u295B\":\"&RightTeeVector;\",\"\\u22B3\":\"&vrtri;\",\"\\u29D0\":\"&RightTriangleBar;\",\"\\u22B5\":\"&trianglerighteq;\",\"\\u294F\":\"&RightUpDownVector;\",\"\\u295C\":\"&RightUpTeeVector;\",\"\\u21BE\":\"&upharpoonright;\",\"\\u2954\":\"&RightUpVectorBar;\",\"\\u21C0\":\"&rightharpoonup;\",\"\\u2953\":\"&RightVectorBar;\",\\u211D:\"&reals;\",\"\\u2970\":\"&RoundImplies;\",\"\\u21DB\":\"&rAarr;\",\\u211B:\"&realine;\",\"\\u21B1\":\"&rsh;\",\"\\u29F4\":\"&RuleDelayed;\",\\u0429:\"&SHCHcy;\",\\u0428:\"&SHcy;\",\\u042C:\"&SOFTcy;\",\\u015A:\"&Sacute;\",\"\\u2ABC\":\"&Sc;\",\\u0160:\"&Scaron;\",\\u015E:\"&Scedil;\",\\u015C:\"&Scirc;\",\\u0421:\"&Scy;\",\"\\u{1D516}\":\"&Sfr;\",\"\\u2191\":\"&uparrow;\",\\u03A3:\"&Sigma;\",\"\\u2218\":\"&compfn;\",\"\\u{1D54A}\":\"&Sopf;\",\"\\u221A\":\"&radic;\",\"\\u25A1\":\"&square;\",\"\\u2293\":\"&sqcap;\",\"\\u228F\":\"&sqsubset;\",\"\\u2291\":\"&sqsubseteq;\",\"\\u2290\":\"&sqsupset;\",\"\\u2292\":\"&sqsupseteq;\",\"\\u2294\":\"&sqcup;\",\"\\u{1D4AE}\":\"&Sscr;\",\"\\u22C6\":\"&sstarf;\",\"\\u22D0\":\"&Subset;\",\"\\u2286\":\"&subseteq;\",\"\\u227B\":\"&succ;\",\"\\u2AB0\":\"&succeq;\",\"\\u227D\":\"&succcurlyeq;\",\"\\u227F\":\"&succsim;\",\"\\u2211\":\"&sum;\",\"\\u22D1\":\"&Supset;\",\"\\u2283\":\"&supset;\",\"\\u2287\":\"&supseteq;\",\\u00DE:\"&THORN;\",\"\\u2122\":\"&trade;\",\\u040B:\"&TSHcy;\",\\u0426:\"&TScy;\",\"\t\":\"&Tab;\",\\u03A4:\"&Tau;\",\\u0164:\"&Tcaron;\",\\u0162:\"&Tcedil;\",\\u0422:\"&Tcy;\",\"\\u{1D517}\":\"&Tfr;\",\"\\u2234\":\"&therefore;\",\\u0398:\"&Theta;\",\"\\u205F\\u200A\":\"&ThickSpace;\",\"\\u2009\":\"&thinsp;\",\"\\u223C\":\"&thksim;\",\"\\u2243\":\"&simeq;\",\"\\u2245\":\"&cong;\",\"\\u2248\":\"&thkap;\",\"\\u{1D54B}\":\"&Topf;\",\"\\u20DB\":\"&tdot;\",\"\\u{1D4AF}\":\"&Tscr;\",\\u0166:\"&Tstrok;\",\\u00DA:\"&Uacute;\",\"\\u219F\":\"&Uarr;\",\"\\u2949\":\"&Uarrocir;\",\\u040E:\"&Ubrcy;\",\\u016C:\"&Ubreve;\",\\u00DB:\"&Ucirc;\",\\u0423:\"&Ucy;\",\\u0170:\"&Udblac;\",\"\\u{1D518}\":\"&Ufr;\",\\u00D9:\"&Ugrave;\",\\u016A:\"&Umacr;\",_:\"&lowbar;\",\"\\u23DF\":\"&UnderBrace;\",\"\\u23B5\":\"&bbrk;\",\"\\u23DD\":\"&UnderParenthesis;\",\"\\u22C3\":\"&xcup;\",\"\\u228E\":\"&uplus;\",\\u0172:\"&Uogon;\",\"\\u{1D54C}\":\"&Uopf;\",\"\\u2912\":\"&UpArrowBar;\",\"\\u21C5\":\"&udarr;\",\"\\u2195\":\"&varr;\",\"\\u296E\":\"&udhar;\",\"\\u22A5\":\"&perp;\",\"\\u21A5\":\"&mapstoup;\",\"\\u2196\":\"&nwarrow;\",\"\\u2197\":\"&nearrow;\",\\u03D2:\"&upsih;\",\\u03A5:\"&Upsilon;\",\\u016E:\"&Uring;\",\"\\u{1D4B0}\":\"&Uscr;\",\\u0168:\"&Utilde;\",\\u00DC:\"&Uuml;\",\"\\u22AB\":\"&VDash;\",\"\\u2AEB\":\"&Vbar;\",\\u0412:\"&Vcy;\",\"\\u22A9\":\"&Vdash;\",\"\\u2AE6\":\"&Vdashl;\",\"\\u22C1\":\"&xvee;\",\"\\u2016\":\"&Vert;\",\"\\u2223\":\"&smid;\",\"|\":\"&vert;\",\"\\u2758\":\"&VerticalSeparator;\",\"\\u2240\":\"&wreath;\",\"\\u200A\":\"&hairsp;\",\"\\u{1D519}\":\"&Vfr;\",\"\\u{1D54D}\":\"&Vopf;\",\"\\u{1D4B1}\":\"&Vscr;\",\"\\u22AA\":\"&Vvdash;\",\\u0174:\"&Wcirc;\",\"\\u22C0\":\"&xwedge;\",\"\\u{1D51A}\":\"&Wfr;\",\"\\u{1D54E}\":\"&Wopf;\",\"\\u{1D4B2}\":\"&Wscr;\",\"\\u{1D51B}\":\"&Xfr;\",\\u039E:\"&Xi;\",\"\\u{1D54F}\":\"&Xopf;\",\"\\u{1D4B3}\":\"&Xscr;\",\\u042F:\"&YAcy;\",\\u0407:\"&YIcy;\",\\u042E:\"&YUcy;\",\\u00DD:\"&Yacute;\",\\u0176:\"&Ycirc;\",\\u042B:\"&Ycy;\",\"\\u{1D51C}\":\"&Yfr;\",\"\\u{1D550}\":\"&Yopf;\",\"\\u{1D4B4}\":\"&Yscr;\",\\u0178:\"&Yuml;\",\\u0416:\"&ZHcy;\",\\u0179:\"&Zacute;\",\\u017D:\"&Zcaron;\",\\u0417:\"&Zcy;\",\\u017B:\"&Zdot;\",\\u0396:\"&Zeta;\",\\u2128:\"&zeetrf;\",\\u2124:\"&integers;\",\"\\u{1D4B5}\":\"&Zscr;\",\\u00E1:\"&aacute;\",\\u0103:\"&abreve;\",\"\\u223E\":\"&mstpos;\",\"\\u223E\\u0333\":\"&acE;\",\"\\u223F\":\"&acd;\",\\u00E2:\"&acirc;\",\\u0430:\"&acy;\",\\u00E6:\"&aelig;\",\"\\u{1D51E}\":\"&afr;\",\\u00E0:\"&agrave;\",\\u2135:\"&aleph;\",\\u03B1:\"&alpha;\",\\u0101:\"&amacr;\",\"\\u2A3F\":\"&amalg;\",\"\\u2227\":\"&wedge;\",\"\\u2A55\":\"&andand;\",\"\\u2A5C\":\"&andd;\",\"\\u2A58\":\"&andslope;\",\"\\u2A5A\":\"&andv;\",\"\\u2220\":\"&angle;\",\"\\u29A4\":\"&ange;\",\"\\u2221\":\"&measuredangle;\",\"\\u29A8\":\"&angmsdaa;\",\"\\u29A9\":\"&angmsdab;\",\"\\u29AA\":\"&angmsdac;\",\"\\u29AB\":\"&angmsdad;\",\"\\u29AC\":\"&angmsdae;\",\"\\u29AD\":\"&angmsdaf;\",\"\\u29AE\":\"&angmsdag;\",\"\\u29AF\":\"&angmsdah;\",\"\\u221F\":\"&angrt;\",\"\\u22BE\":\"&angrtvb;\",\"\\u299D\":\"&angrtvbd;\",\"\\u2222\":\"&angsph;\",\"\\u237C\":\"&angzarr;\",\\u0105:\"&aogon;\",\"\\u{1D552}\":\"&aopf;\",\"\\u2A70\":\"&apE;\",\"\\u2A6F\":\"&apacir;\",\"\\u224A\":\"&approxeq;\",\"\\u224B\":\"&apid;\",\"'\":\"&apos;\",\\u00E5:\"&aring;\",\"\\u{1D4B6}\":\"&ascr;\",\"*\":\"&midast;\",\\u00E3:\"&atilde;\",\\u00E4:\"&auml;\",\"\\u2A11\":\"&awint;\",\"\\u2AED\":\"&bNot;\",\"\\u224C\":\"&bcong;\",\"\\u03F6\":\"&bepsi;\",\"\\u2035\":\"&bprime;\",\"\\u223D\":\"&bsim;\",\"\\u22CD\":\"&bsime;\",\"\\u22BD\":\"&barvee;\",\"\\u2305\":\"&barwedge;\",\"\\u23B6\":\"&bbrktbrk;\",\\u0431:\"&bcy;\",\"\\u201E\":\"&ldquor;\",\"\\u29B0\":\"&bemptyv;\",\\u03B2:\"&beta;\",\\u2136:\"&beth;\",\"\\u226C\":\"&twixt;\",\"\\u{1D51F}\":\"&bfr;\",\"\\u25EF\":\"&xcirc;\",\"\\u2A00\":\"&xodot;\",\"\\u2A01\":\"&xoplus;\",\"\\u2A02\":\"&xotime;\",\"\\u2A06\":\"&xsqcup;\",\"\\u2605\":\"&starf;\",\"\\u25BD\":\"&xdtri;\",\"\\u25B3\":\"&xutri;\",\"\\u2A04\":\"&xuplus;\",\"\\u290D\":\"&rbarr;\",\"\\u29EB\":\"&lozf;\",\"\\u25B4\":\"&utrif;\",\"\\u25BE\":\"&dtrif;\",\"\\u25C2\":\"&ltrif;\",\"\\u25B8\":\"&rtrif;\",\"\\u2423\":\"&blank;\",\"\\u2592\":\"&blk12;\",\"\\u2591\":\"&blk14;\",\"\\u2593\":\"&blk34;\",\"\\u2588\":\"&block;\",\"=\\u20E5\":\"&bne;\",\"\\u2261\\u20E5\":\"&bnequiv;\",\"\\u2310\":\"&bnot;\",\"\\u{1D553}\":\"&bopf;\",\"\\u22C8\":\"&bowtie;\",\"\\u2557\":\"&boxDL;\",\"\\u2554\":\"&boxDR;\",\"\\u2556\":\"&boxDl;\",\"\\u2553\":\"&boxDr;\",\"\\u2550\":\"&boxH;\",\"\\u2566\":\"&boxHD;\",\"\\u2569\":\"&boxHU;\",\"\\u2564\":\"&boxHd;\",\"\\u2567\":\"&boxHu;\",\"\\u255D\":\"&boxUL;\",\"\\u255A\":\"&boxUR;\",\"\\u255C\":\"&boxUl;\",\"\\u2559\":\"&boxUr;\",\"\\u2551\":\"&boxV;\",\"\\u256C\":\"&boxVH;\",\"\\u2563\":\"&boxVL;\",\"\\u2560\":\"&boxVR;\",\"\\u256B\":\"&boxVh;\",\"\\u2562\":\"&boxVl;\",\"\\u255F\":\"&boxVr;\",\"\\u29C9\":\"&boxbox;\",\"\\u2555\":\"&boxdL;\",\"\\u2552\":\"&boxdR;\",\"\\u2510\":\"&boxdl;\",\"\\u250C\":\"&boxdr;\",\"\\u2565\":\"&boxhD;\",\"\\u2568\":\"&boxhU;\",\"\\u252C\":\"&boxhd;\",\"\\u2534\":\"&boxhu;\",\"\\u229F\":\"&minusb;\",\"\\u229E\":\"&plusb;\",\"\\u22A0\":\"&timesb;\",\"\\u255B\":\"&boxuL;\",\"\\u2558\":\"&boxuR;\",\"\\u2518\":\"&boxul;\",\"\\u2514\":\"&boxur;\",\"\\u2502\":\"&boxv;\",\"\\u256A\":\"&boxvH;\",\"\\u2561\":\"&boxvL;\",\"\\u255E\":\"&boxvR;\",\"\\u253C\":\"&boxvh;\",\"\\u2524\":\"&boxvl;\",\"\\u251C\":\"&boxvr;\",\"\\xA6\":\"&brvbar;\",\"\\u{1D4B7}\":\"&bscr;\",\"\\u204F\":\"&bsemi;\",\"\\\\\":\"&bsol;\",\"\\u29C5\":\"&bsolb;\",\"\\u27C8\":\"&bsolhsub;\",\"\\u2022\":\"&bullet;\",\"\\u2AAE\":\"&bumpE;\",\\u0107:\"&cacute;\",\"\\u2229\":\"&cap;\",\"\\u2A44\":\"&capand;\",\"\\u2A49\":\"&capbrcup;\",\"\\u2A4B\":\"&capcap;\",\"\\u2A47\":\"&capcup;\",\"\\u2A40\":\"&capdot;\",\"\\u2229\\uFE00\":\"&caps;\",\"\\u2041\":\"&caret;\",\"\\u2A4D\":\"&ccaps;\",\\u010D:\"&ccaron;\",\\u00E7:\"&ccedil;\",\\u0109:\"&ccirc;\",\"\\u2A4C\":\"&ccups;\",\"\\u2A50\":\"&ccupssm;\",\\u010B:\"&cdot;\",\"\\u29B2\":\"&cemptyv;\",\"\\xA2\":\"&cent;\",\"\\u{1D520}\":\"&cfr;\",\\u0447:\"&chcy;\",\"\\u2713\":\"&checkmark;\",\\u03C7:\"&chi;\",\"\\u25CB\":\"&cir;\",\"\\u29C3\":\"&cirE;\",\"\\u02C6\":\"&circ;\",\"\\u2257\":\"&cire;\",\"\\u21BA\":\"&olarr;\",\"\\u21BB\":\"&orarr;\",\"\\u24C8\":\"&oS;\",\"\\u229B\":\"&oast;\",\"\\u229A\":\"&ocir;\",\"\\u229D\":\"&odash;\",\"\\u2A10\":\"&cirfnint;\",\"\\u2AEF\":\"&cirmid;\",\"\\u29C2\":\"&cirscir;\",\"\\u2663\":\"&clubsuit;\",\":\":\"&colon;\",\",\":\"&comma;\",\"@\":\"&commat;\",\"\\u2201\":\"&complement;\",\"\\u2A6D\":\"&congdot;\",\"\\u{1D554}\":\"&copf;\",\"\\u2117\":\"&copysr;\",\"\\u21B5\":\"&crarr;\",\"\\u2717\":\"&cross;\",\"\\u{1D4B8}\":\"&cscr;\",\"\\u2ACF\":\"&csub;\",\"\\u2AD1\":\"&csube;\",\"\\u2AD0\":\"&csup;\",\"\\u2AD2\":\"&csupe;\",\"\\u22EF\":\"&ctdot;\",\"\\u2938\":\"&cudarrl;\",\"\\u2935\":\"&cudarrr;\",\"\\u22DE\":\"&curlyeqprec;\",\"\\u22DF\":\"&curlyeqsucc;\",\"\\u21B6\":\"&curvearrowleft;\",\"\\u293D\":\"&cularrp;\",\"\\u222A\":\"&cup;\",\"\\u2A48\":\"&cupbrcap;\",\"\\u2A46\":\"&cupcap;\",\"\\u2A4A\":\"&cupcup;\",\"\\u228D\":\"&cupdot;\",\"\\u2A45\":\"&cupor;\",\"\\u222A\\uFE00\":\"&cups;\",\"\\u21B7\":\"&curvearrowright;\",\"\\u293C\":\"&curarrm;\",\"\\u22CE\":\"&cuvee;\",\"\\u22CF\":\"&cuwed;\",\"\\xA4\":\"&curren;\",\"\\u2231\":\"&cwint;\",\"\\u232D\":\"&cylcty;\",\"\\u2965\":\"&dHar;\",\"\\u2020\":\"&dagger;\",\\u2138:\"&daleth;\",\"\\u2010\":\"&hyphen;\",\"\\u290F\":\"&rBarr;\",\\u010F:\"&dcaron;\",\\u0434:\"&dcy;\",\"\\u21CA\":\"&downdownarrows;\",\"\\u2A77\":\"&eDDot;\",\"\\xB0\":\"&deg;\",\\u03B4:\"&delta;\",\"\\u29B1\":\"&demptyv;\",\"\\u297F\":\"&dfisht;\",\"\\u{1D521}\":\"&dfr;\",\"\\u2666\":\"&diams;\",\\u03DD:\"&gammad;\",\"\\u22F2\":\"&disin;\",\"\\xF7\":\"&divide;\",\"\\u22C7\":\"&divonx;\",\\u0452:\"&djcy;\",\"\\u231E\":\"&llcorner;\",\"\\u230D\":\"&dlcrop;\",$:\"&dollar;\",\"\\u{1D555}\":\"&dopf;\",\"\\u2251\":\"&eDot;\",\"\\u2238\":\"&minusd;\",\"\\u2214\":\"&plusdo;\",\"\\u22A1\":\"&sdotb;\",\"\\u231F\":\"&lrcorner;\",\"\\u230C\":\"&drcrop;\",\"\\u{1D4B9}\":\"&dscr;\",\\u0455:\"&dscy;\",\"\\u29F6\":\"&dsol;\",\\u0111:\"&dstrok;\",\"\\u22F1\":\"&dtdot;\",\"\\u25BF\":\"&triangledown;\",\"\\u29A6\":\"&dwangle;\",\\u045F:\"&dzcy;\",\"\\u27FF\":\"&dzigrarr;\",\\u00E9:\"&eacute;\",\"\\u2A6E\":\"&easter;\",\\u011B:\"&ecaron;\",\"\\u2256\":\"&eqcirc;\",\\u00EA:\"&ecirc;\",\"\\u2255\":\"&eqcolon;\",\\u044D:\"&ecy;\",\\u0117:\"&edot;\",\"\\u2252\":\"&fallingdotseq;\",\"\\u{1D522}\":\"&efr;\",\"\\u2A9A\":\"&eg;\",\\u00E8:\"&egrave;\",\"\\u2A96\":\"&eqslantgtr;\",\"\\u2A98\":\"&egsdot;\",\"\\u2A99\":\"&el;\",\"\\u23E7\":\"&elinters;\",\\u2113:\"&ell;\",\"\\u2A95\":\"&eqslantless;\",\"\\u2A97\":\"&elsdot;\",\\u0113:\"&emacr;\",\"\\u2205\":\"&varnothing;\",\"\\u2004\":\"&emsp13;\",\"\\u2005\":\"&emsp14;\",\"\\u2003\":\"&emsp;\",\\u014B:\"&eng;\",\"\\u2002\":\"&ensp;\",\\u0119:\"&eogon;\",\"\\u{1D556}\":\"&eopf;\",\"\\u22D5\":\"&epar;\",\"\\u29E3\":\"&eparsl;\",\"\\u2A71\":\"&eplus;\",\\u03B5:\"&epsilon;\",\"\\u03F5\":\"&varepsilon;\",\"=\":\"&equals;\",\"\\u225F\":\"&questeq;\",\"\\u2A78\":\"&equivDD;\",\"\\u29E5\":\"&eqvparsl;\",\"\\u2253\":\"&risingdotseq;\",\"\\u2971\":\"&erarr;\",\\u212F:\"&escr;\",\\u03B7:\"&eta;\",\\u00F0:\"&eth;\",\\u00EB:\"&euml;\",\"\\u20AC\":\"&euro;\",\"!\":\"&excl;\",\\u0444:\"&fcy;\",\"\\u2640\":\"&female;\",\\uFB03:\"&ffilig;\",\\uFB00:\"&fflig;\",\\uFB04:\"&ffllig;\",\"\\u{1D523}\":\"&ffr;\",\\uFB01:\"&filig;\",fj:\"&fjlig;\",\"\\u266D\":\"&flat;\",\\uFB02:\"&fllig;\",\"\\u25B1\":\"&fltns;\",\\u0192:\"&fnof;\",\"\\u{1D557}\":\"&fopf;\",\"\\u22D4\":\"&pitchfork;\",\"\\u2AD9\":\"&forkv;\",\"\\u2A0D\":\"&fpartint;\",\"\\xBD\":\"&half;\",\"\\u2153\":\"&frac13;\",\"\\xBC\":\"&frac14;\",\"\\u2155\":\"&frac15;\",\"\\u2159\":\"&frac16;\",\"\\u215B\":\"&frac18;\",\"\\u2154\":\"&frac23;\",\"\\u2156\":\"&frac25;\",\"\\xBE\":\"&frac34;\",\"\\u2157\":\"&frac35;\",\"\\u215C\":\"&frac38;\",\"\\u2158\":\"&frac45;\",\"\\u215A\":\"&frac56;\",\"\\u215D\":\"&frac58;\",\"\\u215E\":\"&frac78;\",\"\\u2044\":\"&frasl;\",\"\\u2322\":\"&sfrown;\",\"\\u{1D4BB}\":\"&fscr;\",\"\\u2A8C\":\"&gtreqqless;\",\\u01F5:\"&gacute;\",\\u03B3:\"&gamma;\",\"\\u2A86\":\"&gtrapprox;\",\\u011F:\"&gbreve;\",\\u011D:\"&gcirc;\",\\u0433:\"&gcy;\",\\u0121:\"&gdot;\",\"\\u2AA9\":\"&gescc;\",\"\\u2A80\":\"&gesdot;\",\"\\u2A82\":\"&gesdoto;\",\"\\u2A84\":\"&gesdotol;\",\"\\u22DB\\uFE00\":\"&gesl;\",\"\\u2A94\":\"&gesles;\",\"\\u{1D524}\":\"&gfr;\",\\u2137:\"&gimel;\",\\u0453:\"&gjcy;\",\"\\u2A92\":\"&glE;\",\"\\u2AA5\":\"&gla;\",\"\\u2AA4\":\"&glj;\",\"\\u2269\":\"&gneqq;\",\"\\u2A8A\":\"&gnapprox;\",\"\\u2A88\":\"&gneq;\",\"\\u22E7\":\"&gnsim;\",\"\\u{1D558}\":\"&gopf;\",\\u210A:\"&gscr;\",\"\\u2A8E\":\"&gsime;\",\"\\u2A90\":\"&gsiml;\",\"\\u2AA7\":\"&gtcc;\",\"\\u2A7A\":\"&gtcir;\",\"\\u22D7\":\"&gtrdot;\",\"\\u2995\":\"&gtlPar;\",\"\\u2A7C\":\"&gtquest;\",\"\\u2978\":\"&gtrarr;\",\"\\u2269\\uFE00\":\"&gvnE;\",\\u044A:\"&hardcy;\",\"\\u2948\":\"&harrcir;\",\"\\u21AD\":\"&leftrightsquigarrow;\",\\u210F:\"&plankv;\",\\u0125:\"&hcirc;\",\"\\u2665\":\"&heartsuit;\",\"\\u2026\":\"&mldr;\",\"\\u22B9\":\"&hercon;\",\"\\u{1D525}\":\"&hfr;\",\"\\u2925\":\"&searhk;\",\"\\u2926\":\"&swarhk;\",\"\\u21FF\":\"&hoarr;\",\"\\u223B\":\"&homtht;\",\"\\u21A9\":\"&larrhk;\",\"\\u21AA\":\"&rarrhk;\",\"\\u{1D559}\":\"&hopf;\",\"\\u2015\":\"&horbar;\",\"\\u{1D4BD}\":\"&hscr;\",\\u0127:\"&hstrok;\",\"\\u2043\":\"&hybull;\",\\u00ED:\"&iacute;\",\\u00EE:\"&icirc;\",\\u0438:\"&icy;\",\\u0435:\"&iecy;\",\"\\xA1\":\"&iexcl;\",\"\\u{1D526}\":\"&ifr;\",\\u00EC:\"&igrave;\",\"\\u2A0C\":\"&qint;\",\"\\u222D\":\"&tint;\",\"\\u29DC\":\"&iinfin;\",\"\\u2129\":\"&iiota;\",\\u0133:\"&ijlig;\",\\u012B:\"&imacr;\",\\u0131:\"&inodot;\",\"\\u22B7\":\"&imof;\",\\u01B5:\"&imped;\",\"\\u2105\":\"&incare;\",\"\\u221E\":\"&infin;\",\"\\u29DD\":\"&infintie;\",\"\\u22BA\":\"&intercal;\",\"\\u2A17\":\"&intlarhk;\",\"\\u2A3C\":\"&iprod;\",\\u0451:\"&iocy;\",\\u012F:\"&iogon;\",\"\\u{1D55A}\":\"&iopf;\",\\u03B9:\"&iota;\",\"\\xBF\":\"&iquest;\",\"\\u{1D4BE}\":\"&iscr;\",\"\\u22F9\":\"&isinE;\",\"\\u22F5\":\"&isindot;\",\"\\u22F4\":\"&isins;\",\"\\u22F3\":\"&isinsv;\",\\u0129:\"&itilde;\",\\u0456:\"&iukcy;\",\\u00EF:\"&iuml;\",\\u0135:\"&jcirc;\",\\u0439:\"&jcy;\",\"\\u{1D527}\":\"&jfr;\",\"\\u0237\":\"&jmath;\",\"\\u{1D55B}\":\"&jopf;\",\"\\u{1D4BF}\":\"&jscr;\",\\u0458:\"&jsercy;\",\\u0454:\"&jukcy;\",\\u03BA:\"&kappa;\",\\u03F0:\"&varkappa;\",\\u0137:\"&kcedil;\",\\u043A:\"&kcy;\",\"\\u{1D528}\":\"&kfr;\",\\u0138:\"&kgreen;\",\\u0445:\"&khcy;\",\\u045C:\"&kjcy;\",\"\\u{1D55C}\":\"&kopf;\",\"\\u{1D4C0}\":\"&kscr;\",\"\\u291B\":\"&lAtail;\",\"\\u290E\":\"&lBarr;\",\"\\u2A8B\":\"&lesseqqgtr;\",\"\\u2962\":\"&lHar;\",\\u013A:\"&lacute;\",\"\\u29B4\":\"&laemptyv;\",\\u03BB:\"&lambda;\",\"\\u2991\":\"&langd;\",\"\\u2A85\":\"&lessapprox;\",\"\\xAB\":\"&laquo;\",\"\\u291F\":\"&larrbfs;\",\"\\u291D\":\"&larrfs;\",\"\\u21AB\":\"&looparrowleft;\",\"\\u2939\":\"&larrpl;\",\"\\u2973\":\"&larrsim;\",\"\\u21A2\":\"&leftarrowtail;\",\"\\u2AAB\":\"&lat;\",\"\\u2919\":\"&latail;\",\"\\u2AAD\":\"&late;\",\"\\u2AAD\\uFE00\":\"&lates;\",\"\\u290C\":\"&lbarr;\",\"\\u2772\":\"&lbbrk;\",\"{\":\"&lcub;\",\"[\":\"&lsqb;\",\"\\u298B\":\"&lbrke;\",\"\\u298F\":\"&lbrksld;\",\"\\u298D\":\"&lbrkslu;\",\\u013E:\"&lcaron;\",\\u013C:\"&lcedil;\",\\u043B:\"&lcy;\",\"\\u2936\":\"&ldca;\",\"\\u2967\":\"&ldrdhar;\",\"\\u294B\":\"&ldrushar;\",\"\\u21B2\":\"&ldsh;\",\"\\u2264\":\"&leq;\",\"\\u21C7\":\"&llarr;\",\"\\u22CB\":\"&lthree;\",\"\\u2AA8\":\"&lescc;\",\"\\u2A7F\":\"&lesdot;\",\"\\u2A81\":\"&lesdoto;\",\"\\u2A83\":\"&lesdotor;\",\"\\u22DA\\uFE00\":\"&lesg;\",\"\\u2A93\":\"&lesges;\",\"\\u22D6\":\"&ltdot;\",\"\\u297C\":\"&lfisht;\",\"\\u{1D529}\":\"&lfr;\",\"\\u2A91\":\"&lgE;\",\"\\u296A\":\"&lharul;\",\"\\u2584\":\"&lhblk;\",\\u0459:\"&ljcy;\",\"\\u296B\":\"&llhard;\",\"\\u25FA\":\"&lltri;\",\\u0140:\"&lmidot;\",\"\\u23B0\":\"&lmoustache;\",\"\\u2268\":\"&lneqq;\",\"\\u2A89\":\"&lnapprox;\",\"\\u2A87\":\"&lneq;\",\"\\u22E6\":\"&lnsim;\",\"\\u27EC\":\"&loang;\",\"\\u21FD\":\"&loarr;\",\"\\u27FC\":\"&xmap;\",\"\\u21AC\":\"&rarrlp;\",\"\\u2985\":\"&lopar;\",\"\\u{1D55D}\":\"&lopf;\",\"\\u2A2D\":\"&loplus;\",\"\\u2A34\":\"&lotimes;\",\"\\u2217\":\"&lowast;\",\"\\u25CA\":\"&lozenge;\",\"(\":\"&lpar;\",\"\\u2993\":\"&lparlt;\",\"\\u296D\":\"&lrhard;\",\"\\u200E\":\"&lrm;\",\"\\u22BF\":\"&lrtri;\",\"\\u2039\":\"&lsaquo;\",\"\\u{1D4C1}\":\"&lscr;\",\"\\u2A8D\":\"&lsime;\",\"\\u2A8F\":\"&lsimg;\",\"\\u201A\":\"&sbquo;\",\\u0142:\"&lstrok;\",\"\\u2AA6\":\"&ltcc;\",\"\\u2A79\":\"&ltcir;\",\"\\u22C9\":\"&ltimes;\",\"\\u2976\":\"&ltlarr;\",\"\\u2A7B\":\"&ltquest;\",\"\\u2996\":\"&ltrPar;\",\"\\u25C3\":\"&triangleleft;\",\"\\u294A\":\"&lurdshar;\",\"\\u2966\":\"&luruhar;\",\"\\u2268\\uFE00\":\"&lvnE;\",\"\\u223A\":\"&mDDot;\",\"\\xAF\":\"&strns;\",\"\\u2642\":\"&male;\",\"\\u2720\":\"&maltese;\",\"\\u25AE\":\"&marker;\",\"\\u2A29\":\"&mcomma;\",\\u043C:\"&mcy;\",\"\\u2014\":\"&mdash;\",\"\\u{1D52A}\":\"&mfr;\",\"\\u2127\":\"&mho;\",\\u00B5:\"&micro;\",\"\\u2AF0\":\"&midcir;\",\"\\u2212\":\"&minus;\",\"\\u2A2A\":\"&minusdu;\",\"\\u2ADB\":\"&mlcp;\",\"\\u22A7\":\"&models;\",\"\\u{1D55E}\":\"&mopf;\",\"\\u{1D4C2}\":\"&mscr;\",\\u03BC:\"&mu;\",\"\\u22B8\":\"&mumap;\",\"\\u22D9\\u0338\":\"&nGg;\",\"\\u226B\\u20D2\":\"&nGt;\",\"\\u21CD\":\"&nlArr;\",\"\\u21CE\":\"&nhArr;\",\"\\u22D8\\u0338\":\"&nLl;\",\"\\u226A\\u20D2\":\"&nLt;\",\"\\u21CF\":\"&nrArr;\",\"\\u22AF\":\"&nVDash;\",\"\\u22AE\":\"&nVdash;\",\\u0144:\"&nacute;\",\"\\u2220\\u20D2\":\"&nang;\",\"\\u2A70\\u0338\":\"&napE;\",\"\\u224B\\u0338\":\"&napid;\",\\u0149:\"&napos;\",\"\\u266E\":\"&natural;\",\"\\u2A43\":\"&ncap;\",\\u0148:\"&ncaron;\",\\u0146:\"&ncedil;\",\"\\u2A6D\\u0338\":\"&ncongdot;\",\"\\u2A42\":\"&ncup;\",\\u043D:\"&ncy;\",\"\\u2013\":\"&ndash;\",\"\\u21D7\":\"&neArr;\",\"\\u2924\":\"&nearhk;\",\"\\u2250\\u0338\":\"&nedot;\",\"\\u2928\":\"&toea;\",\"\\u{1D52B}\":\"&nfr;\",\"\\u21AE\":\"&nleftrightarrow;\",\"\\u2AF2\":\"&nhpar;\",\"\\u22FC\":\"&nis;\",\"\\u22FA\":\"&nisd;\",\\u045A:\"&njcy;\",\"\\u2266\\u0338\":\"&nleqq;\",\"\\u219A\":\"&nleftarrow;\",\"\\u2025\":\"&nldr;\",\"\\u{1D55F}\":\"&nopf;\",\"\\xAC\":\"&not;\",\"\\u22F9\\u0338\":\"&notinE;\",\"\\u22F5\\u0338\":\"&notindot;\",\"\\u22F7\":\"&notinvb;\",\"\\u22F6\":\"&notinvc;\",\"\\u22FE\":\"&notnivb;\",\"\\u22FD\":\"&notnivc;\",\"\\u2AFD\\u20E5\":\"&nparsl;\",\"\\u2202\\u0338\":\"&npart;\",\"\\u2A14\":\"&npolint;\",\"\\u219B\":\"&nrightarrow;\",\"\\u2933\\u0338\":\"&nrarrc;\",\"\\u219D\\u0338\":\"&nrarrw;\",\"\\u{1D4C3}\":\"&nscr;\",\"\\u2284\":\"&nsub;\",\"\\u2AC5\\u0338\":\"&nsubseteqq;\",\"\\u2285\":\"&nsup;\",\"\\u2AC6\\u0338\":\"&nsupseteqq;\",\\u00F1:\"&ntilde;\",\\u03BD:\"&nu;\",\"#\":\"&num;\",\"\\u2116\":\"&numero;\",\"\\u2007\":\"&numsp;\",\"\\u22AD\":\"&nvDash;\",\"\\u2904\":\"&nvHarr;\",\"\\u224D\\u20D2\":\"&nvap;\",\"\\u22AC\":\"&nvdash;\",\"\\u2265\\u20D2\":\"&nvge;\",\">\\u20D2\":\"&nvgt;\",\"\\u29DE\":\"&nvinfin;\",\"\\u2902\":\"&nvlArr;\",\"\\u2264\\u20D2\":\"&nvle;\",\"<\\u20D2\":\"&nvlt;\",\"\\u22B4\\u20D2\":\"&nvltrie;\",\"\\u2903\":\"&nvrArr;\",\"\\u22B5\\u20D2\":\"&nvrtrie;\",\"\\u223C\\u20D2\":\"&nvsim;\",\"\\u21D6\":\"&nwArr;\",\"\\u2923\":\"&nwarhk;\",\"\\u2927\":\"&nwnear;\",\\u00F3:\"&oacute;\",\\u00F4:\"&ocirc;\",\\u043E:\"&ocy;\",\\u0151:\"&odblac;\",\"\\u2A38\":\"&odiv;\",\"\\u29BC\":\"&odsold;\",\\u0153:\"&oelig;\",\"\\u29BF\":\"&ofcir;\",\"\\u{1D52C}\":\"&ofr;\",\"\\u02DB\":\"&ogon;\",\\u00F2:\"&ograve;\",\"\\u29C1\":\"&ogt;\",\"\\u29B5\":\"&ohbar;\",\"\\u29BE\":\"&olcir;\",\"\\u29BB\":\"&olcross;\",\"\\u29C0\":\"&olt;\",\\u014D:\"&omacr;\",\\u03C9:\"&omega;\",\\u03BF:\"&omicron;\",\"\\u29B6\":\"&omid;\",\"\\u{1D560}\":\"&oopf;\",\"\\u29B7\":\"&opar;\",\"\\u29B9\":\"&operp;\",\"\\u2228\":\"&vee;\",\"\\u2A5D\":\"&ord;\",\\u2134:\"&oscr;\",\\u00AA:\"&ordf;\",\\u00BA:\"&ordm;\",\"\\u22B6\":\"&origof;\",\"\\u2A56\":\"&oror;\",\"\\u2A57\":\"&orslope;\",\"\\u2A5B\":\"&orv;\",\\u00F8:\"&oslash;\",\"\\u2298\":\"&osol;\",\\u00F5:\"&otilde;\",\"\\u2A36\":\"&otimesas;\",\\u00F6:\"&ouml;\",\"\\u233D\":\"&ovbar;\",\"\\xB6\":\"&para;\",\"\\u2AF3\":\"&parsim;\",\"\\u2AFD\":\"&parsl;\",\\u043F:\"&pcy;\",\"%\":\"&percnt;\",\".\":\"&period;\",\"\\u2030\":\"&permil;\",\"\\u2031\":\"&pertenk;\",\"\\u{1D52D}\":\"&pfr;\",\\u03C6:\"&phi;\",\\u03D5:\"&varphi;\",\"\\u260E\":\"&phone;\",\\u03C0:\"&pi;\",\\u03D6:\"&varpi;\",\\u210E:\"&planckh;\",\"+\":\"&plus;\",\"\\u2A23\":\"&plusacir;\",\"\\u2A22\":\"&pluscir;\",\"\\u2A25\":\"&plusdu;\",\"\\u2A72\":\"&pluse;\",\"\\u2A26\":\"&plussim;\",\"\\u2A27\":\"&plustwo;\",\"\\u2A15\":\"&pointint;\",\"\\u{1D561}\":\"&popf;\",\"\\xA3\":\"&pound;\",\"\\u2AB3\":\"&prE;\",\"\\u2AB7\":\"&precapprox;\",\"\\u2AB9\":\"&prnap;\",\"\\u2AB5\":\"&prnE;\",\"\\u22E8\":\"&prnsim;\",\"\\u2032\":\"&prime;\",\"\\u232E\":\"&profalar;\",\"\\u2312\":\"&profline;\",\"\\u2313\":\"&profsurf;\",\"\\u22B0\":\"&prurel;\",\"\\u{1D4C5}\":\"&pscr;\",\\u03C8:\"&psi;\",\"\\u2008\":\"&puncsp;\",\"\\u{1D52E}\":\"&qfr;\",\"\\u{1D562}\":\"&qopf;\",\"\\u2057\":\"&qprime;\",\"\\u{1D4C6}\":\"&qscr;\",\"\\u2A16\":\"&quatint;\",\"?\":\"&quest;\",\"\\u291C\":\"&rAtail;\",\"\\u2964\":\"&rHar;\",\"\\u223D\\u0331\":\"&race;\",\\u0155:\"&racute;\",\"\\u29B3\":\"&raemptyv;\",\"\\u2992\":\"&rangd;\",\"\\u29A5\":\"&range;\",\"\\xBB\":\"&raquo;\",\"\\u2975\":\"&rarrap;\",\"\\u2920\":\"&rarrbfs;\",\"\\u2933\":\"&rarrc;\",\"\\u291E\":\"&rarrfs;\",\"\\u2945\":\"&rarrpl;\",\"\\u2974\":\"&rarrsim;\",\"\\u21A3\":\"&rightarrowtail;\",\"\\u219D\":\"&rightsquigarrow;\",\"\\u291A\":\"&ratail;\",\"\\u2236\":\"&ratio;\",\"\\u2773\":\"&rbbrk;\",\"}\":\"&rcub;\",\"]\":\"&rsqb;\",\"\\u298C\":\"&rbrke;\",\"\\u298E\":\"&rbrksld;\",\"\\u2990\":\"&rbrkslu;\",\\u0159:\"&rcaron;\",\\u0157:\"&rcedil;\",\\u0440:\"&rcy;\",\"\\u2937\":\"&rdca;\",\"\\u2969\":\"&rdldhar;\",\"\\u21B3\":\"&rdsh;\",\"\\u25AD\":\"&rect;\",\"\\u297D\":\"&rfisht;\",\"\\u{1D52F}\":\"&rfr;\",\"\\u296C\":\"&rharul;\",\\u03C1:\"&rho;\",\\u03F1:\"&varrho;\",\"\\u21C9\":\"&rrarr;\",\"\\u22CC\":\"&rthree;\",\"\\u02DA\":\"&ring;\",\"\\u200F\":\"&rlm;\",\"\\u23B1\":\"&rmoustache;\",\"\\u2AEE\":\"&rnmid;\",\"\\u27ED\":\"&roang;\",\"\\u21FE\":\"&roarr;\",\"\\u2986\":\"&ropar;\",\"\\u{1D563}\":\"&ropf;\",\"\\u2A2E\":\"&roplus;\",\"\\u2A35\":\"&rotimes;\",\")\":\"&rpar;\",\"\\u2994\":\"&rpargt;\",\"\\u2A12\":\"&rppolint;\",\"\\u203A\":\"&rsaquo;\",\"\\u{1D4C7}\":\"&rscr;\",\"\\u22CA\":\"&rtimes;\",\"\\u25B9\":\"&triangleright;\",\"\\u29CE\":\"&rtriltri;\",\"\\u2968\":\"&ruluhar;\",\"\\u211E\":\"&rx;\",\\u015B:\"&sacute;\",\"\\u2AB4\":\"&scE;\",\"\\u2AB8\":\"&succapprox;\",\\u0161:\"&scaron;\",\\u015F:\"&scedil;\",\\u015D:\"&scirc;\",\"\\u2AB6\":\"&succneqq;\",\"\\u2ABA\":\"&succnapprox;\",\"\\u22E9\":\"&succnsim;\",\"\\u2A13\":\"&scpolint;\",\\u0441:\"&scy;\",\"\\u22C5\":\"&sdot;\",\"\\u2A66\":\"&sdote;\",\"\\u21D8\":\"&seArr;\",\"\\xA7\":\"&sect;\",\";\":\"&semi;\",\"\\u2929\":\"&tosa;\",\"\\u2736\":\"&sext;\",\"\\u{1D530}\":\"&sfr;\",\"\\u266F\":\"&sharp;\",\\u0449:\"&shchcy;\",\\u0448:\"&shcy;\",\"\\xAD\":\"&shy;\",\\u03C3:\"&sigma;\",\\u03C2:\"&varsigma;\",\"\\u2A6A\":\"&simdot;\",\"\\u2A9E\":\"&simg;\",\"\\u2AA0\":\"&simgE;\",\"\\u2A9D\":\"&siml;\",\"\\u2A9F\":\"&simlE;\",\"\\u2246\":\"&simne;\",\"\\u2A24\":\"&simplus;\",\"\\u2972\":\"&simrarr;\",\"\\u2A33\":\"&smashp;\",\"\\u29E4\":\"&smeparsl;\",\"\\u2323\":\"&ssmile;\",\"\\u2AAA\":\"&smt;\",\"\\u2AAC\":\"&smte;\",\"\\u2AAC\\uFE00\":\"&smtes;\",\\u044C:\"&softcy;\",\"/\":\"&sol;\",\"\\u29C4\":\"&solb;\",\"\\u233F\":\"&solbar;\",\"\\u{1D564}\":\"&sopf;\",\"\\u2660\":\"&spadesuit;\",\"\\u2293\\uFE00\":\"&sqcaps;\",\"\\u2294\\uFE00\":\"&sqcups;\",\"\\u{1D4C8}\":\"&sscr;\",\"\\u2606\":\"&star;\",\"\\u2282\":\"&subset;\",\"\\u2AC5\":\"&subseteqq;\",\"\\u2ABD\":\"&subdot;\",\"\\u2AC3\":\"&subedot;\",\"\\u2AC1\":\"&submult;\",\"\\u2ACB\":\"&subsetneqq;\",\"\\u228A\":\"&subsetneq;\",\"\\u2ABF\":\"&subplus;\",\"\\u2979\":\"&subrarr;\",\"\\u2AC7\":\"&subsim;\",\"\\u2AD5\":\"&subsub;\",\"\\u2AD3\":\"&subsup;\",\"\\u266A\":\"&sung;\",\"\\xB9\":\"&sup1;\",\"\\xB2\":\"&sup2;\",\"\\xB3\":\"&sup3;\",\"\\u2AC6\":\"&supseteqq;\",\"\\u2ABE\":\"&supdot;\",\"\\u2AD8\":\"&supdsub;\",\"\\u2AC4\":\"&supedot;\",\"\\u27C9\":\"&suphsol;\",\"\\u2AD7\":\"&suphsub;\",\"\\u297B\":\"&suplarr;\",\"\\u2AC2\":\"&supmult;\",\"\\u2ACC\":\"&supsetneqq;\",\"\\u228B\":\"&supsetneq;\",\"\\u2AC0\":\"&supplus;\",\"\\u2AC8\":\"&supsim;\",\"\\u2AD4\":\"&supsub;\",\"\\u2AD6\":\"&supsup;\",\"\\u21D9\":\"&swArr;\",\"\\u292A\":\"&swnwar;\",\\u00DF:\"&szlig;\",\"\\u2316\":\"&target;\",\\u03C4:\"&tau;\",\\u0165:\"&tcaron;\",\\u0163:\"&tcedil;\",\\u0442:\"&tcy;\",\"\\u2315\":\"&telrec;\",\"\\u{1D531}\":\"&tfr;\",\\u03B8:\"&theta;\",\\u03D1:\"&vartheta;\",\\u00FE:\"&thorn;\",\"\\xD7\":\"&times;\",\"\\u2A31\":\"&timesbar;\",\"\\u2A30\":\"&timesd;\",\"\\u2336\":\"&topbot;\",\"\\u2AF1\":\"&topcir;\",\"\\u{1D565}\":\"&topf;\",\"\\u2ADA\":\"&topfork;\",\"\\u2034\":\"&tprime;\",\"\\u25B5\":\"&utri;\",\"\\u225C\":\"&trie;\",\"\\u25EC\":\"&tridot;\",\"\\u2A3A\":\"&triminus;\",\"\\u2A39\":\"&triplus;\",\"\\u29CD\":\"&trisb;\",\"\\u2A3B\":\"&tritime;\",\"\\u23E2\":\"&trpezium;\",\"\\u{1D4C9}\":\"&tscr;\",\\u0446:\"&tscy;\",\\u045B:\"&tshcy;\",\\u0167:\"&tstrok;\",\"\\u2963\":\"&uHar;\",\\u00FA:\"&uacute;\",\\u045E:\"&ubrcy;\",\\u016D:\"&ubreve;\",\\u00FB:\"&ucirc;\",\\u0443:\"&ucy;\",\\u0171:\"&udblac;\",\"\\u297E\":\"&ufisht;\",\"\\u{1D532}\":\"&ufr;\",\\u00F9:\"&ugrave;\",\"\\u2580\":\"&uhblk;\",\"\\u231C\":\"&ulcorner;\",\"\\u230F\":\"&ulcrop;\",\"\\u25F8\":\"&ultri;\",\\u016B:\"&umacr;\",\\u0173:\"&uogon;\",\"\\u{1D566}\":\"&uopf;\",\\u03C5:\"&upsilon;\",\"\\u21C8\":\"&uuarr;\",\"\\u231D\":\"&urcorner;\",\"\\u230E\":\"&urcrop;\",\\u016F:\"&uring;\",\"\\u25F9\":\"&urtri;\",\"\\u{1D4CA}\":\"&uscr;\",\"\\u22F0\":\"&utdot;\",\\u0169:\"&utilde;\",\\u00FC:\"&uuml;\",\"\\u29A7\":\"&uwangle;\",\"\\u2AE8\":\"&vBar;\",\"\\u2AE9\":\"&vBarv;\",\"\\u299C\":\"&vangrt;\",\"\\u228A\\uFE00\":\"&vsubne;\",\"\\u2ACB\\uFE00\":\"&vsubnE;\",\"\\u228B\\uFE00\":\"&vsupne;\",\"\\u2ACC\\uFE00\":\"&vsupnE;\",\\u0432:\"&vcy;\",\"\\u22BB\":\"&veebar;\",\"\\u225A\":\"&veeeq;\",\"\\u22EE\":\"&vellip;\",\"\\u{1D533}\":\"&vfr;\",\"\\u{1D567}\":\"&vopf;\",\"\\u{1D4CB}\":\"&vscr;\",\"\\u299A\":\"&vzigzag;\",\\u0175:\"&wcirc;\",\"\\u2A5F\":\"&wedbar;\",\"\\u2259\":\"&wedgeq;\",\"\\u2118\":\"&wp;\",\"\\u{1D534}\":\"&wfr;\",\"\\u{1D568}\":\"&wopf;\",\"\\u{1D4CC}\":\"&wscr;\",\"\\u{1D535}\":\"&xfr;\",\\u03BE:\"&xi;\",\"\\u22FB\":\"&xnis;\",\"\\u{1D569}\":\"&xopf;\",\"\\u{1D4CD}\":\"&xscr;\",\\u00FD:\"&yacute;\",\\u044F:\"&yacy;\",\\u0177:\"&ycirc;\",\\u044B:\"&ycy;\",\"\\xA5\":\"&yen;\",\"\\u{1D536}\":\"&yfr;\",\\u0457:\"&yicy;\",\"\\u{1D56A}\":\"&yopf;\",\"\\u{1D4CE}\":\"&yscr;\",\\u044E:\"&yucy;\",\\u00FF:\"&yuml;\",\\u017A:\"&zacute;\",\\u017E:\"&zcaron;\",\\u0437:\"&zcy;\",\\u017C:\"&zdot;\",\\u03B6:\"&zeta;\",\"\\u{1D537}\":\"&zfr;\",\\u0436:\"&zhcy;\",\"\\u21DD\":\"&zigrarr;\",\"\\u{1D56B}\":\"&zopf;\",\"\\u{1D4CF}\":\"&zscr;\",\"\\u200D\":\"&zwj;\",\"\\u200C\":\"&zwnj;\"}}}});var nn=L(kr=>{\"use strict\";Object.defineProperty(kr,\"__esModule\",{value:!0});kr.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}});var an=L(_e=>{\"use strict\";Object.defineProperty(_e,\"__esModule\",{value:!0});_e.fromCodePoint=String.fromCodePoint||function(e){return String.fromCharCode(Math.floor((e-65536)/1024)+55296,(e-65536)%1024+56320)};_e.getCodePoint=String.prototype.codePointAt?function(e,t){return e.codePointAt(t)}:function(e,t){return(e.charCodeAt(t)-55296)*1024+e.charCodeAt(t+1)-56320+65536};_e.highSurrogateFrom=55296;_e.highSurrogateTo=56319});var un=L(xe=>{\"use strict\";var Oe=xe&&xe.__assign||function(){return Oe=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++){t=arguments[r];for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s])}return e},Oe.apply(this,arguments)};Object.defineProperty(xe,\"__esModule\",{value:!0});var je=sn(),ln=nn(),Hr=an(),Mr=Oe(Oe({},je.namedReferences),{all:je.namedReferences.html5}),Cc={specialChars:/[<>'\"&]/g,nonAscii:/[<>'\"&\\u0080-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g,nonAsciiPrintable:/[<>'\"&\\x01-\\x08\\x11-\\x15\\x17-\\x1F\\x7f-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g,nonAsciiPrintableOnly:/[\\x01-\\x08\\x11-\\x15\\x17-\\x1F\\x7f-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g,extensive:/[\\x01-\\x0c\\x0e-\\x1f\\x21-\\x2c\\x2e-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7d\\x7f-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g},_c={mode:\"specialChars\",level:\"all\",numeric:\"decimal\"};function Oc(e,t){var p=t===void 0?_c:t,d=p.mode,r=d===void 0?\"specialChars\":d,i=p.numeric,s=i===void 0?\"decimal\":i,a=p.level,o=a===void 0?\"all\":a;if(!e)return\"\";var l=Cc[r],c=Mr[o].characters,u=s===\"hexadecimal\";l.lastIndex=0;var p=l.exec(e),d;if(p){d=\"\";var i=0;do{i!==p.index&&(d+=e.substring(i,p.index));var a=p[0],f=c[a];if(!f){var E=a.length>1?Hr.getCodePoint(a,0):a.charCodeAt(0);f=(u?\"&#x\"+E.toString(16):\"&#\"+E)+\";\"}d+=f,i=p.index+a.length}while(p=l.exec(e));i!==e.length&&(d+=e.substring(i))}else d=e;return d}n(Oc,\"encode\");xe.encode=Oc;var Pc={scope:\"body\",level:\"all\"},Dr=/&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);/g,Ir=/&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g,on={xml:{strict:Dr,attribute:Ir,body:je.bodyRegExps.xml},html4:{strict:Dr,attribute:Ir,body:je.bodyRegExps.html4},html5:{strict:Dr,attribute:Ir,body:je.bodyRegExps.html5}},Lc=Oe(Oe({},on),{all:on.html5}),Ur=String.fromCharCode,cn=Ur(65533),Nc={level:\"all\"};function qc(e,t){var i=(t===void 0?Nc:t).level,r=i===void 0?\"all\":i;if(!e)return\"\";var i=e,s=e[e.length-1],a=Mr[r].entities[e];if(a)i=a;else if(e[0]===\"&\"&&e[1]===\"#\"){var o=e[2],l=o==\"x\"||o==\"X\"?parseInt(e.substr(3),16):parseInt(e.substr(2));i=l>=1114111?cn:l>65535?Hr.fromCodePoint(l):Ur(ln.numericUnicodeMap[l]||l)}return i}n(qc,\"decodeEntity\");xe.decodeEntity=qc;function kc(e,t){var r=t===void 0?Pc:t,i=r.level,s=i===void 0?\"all\":i,a=r.scope,o=a===void 0?s===\"xml\"?\"strict\":\"body\":a;if(!e)return\"\";var l=Lc[s][o],c=Mr[s].entities,u=o===\"attribute\",p=o===\"strict\";l.lastIndex=0;var d=l.exec(e),f;if(d){f=\"\";var E=0;do{E!==d.index&&(f+=e.substring(E,d.index));var b=d[0],y=b,x=b[b.length-1];if(u&&x===\"=\")y=b;else if(p&&x!==\";\")y=b;else{var R=c[b];if(R)y=R;else if(b[0]===\"&\"&&b[1]===\"#\"){var T=b[2],w=T==\"x\"||T==\"X\"?parseInt(b.substr(3),16):parseInt(b.substr(2));y=w>=1114111?cn:w>65535?Hr.fromCodePoint(w):Ur(ln.numericUnicodeMap[w]||w)}}f+=y,E=d.index+b.length}while(d=l.exec(e));E!==e.length&&(f+=e.substring(E))}else f=e;return f}n(kc,\"decode\");xe.decode=kc});var Fr=L(Pe=>{function pn(){var e={};return e[\"align-content\"]=!1,e[\"align-items\"]=!1,e[\"align-self\"]=!1,e[\"alignment-adjust\"]=!1,e[\"alignment-baseline\"]=!1,e.all=!1,e[\"anchor-point\"]=!1,e.animation=!1,e[\"animation-delay\"]=!1,e[\"animation-direction\"]=!1,e[\"animation-duration\"]=!1,e[\"animation-fill-mode\"]=!1,e[\"animation-iteration-count\"]=!1,e[\"animation-name\"]=!1,e[\"animation-play-state\"]=!1,e[\"animation-timing-function\"]=!1,e.azimuth=!1,e[\"backface-visibility\"]=!1,e.background=!0,e[\"background-attachment\"]=!0,e[\"background-clip\"]=!0,e[\"background-color\"]=!0,e[\"background-image\"]=!0,e[\"background-origin\"]=!0,e[\"background-position\"]=!0,e[\"background-repeat\"]=!0,e[\"background-size\"]=!0,e[\"baseline-shift\"]=!1,e.binding=!1,e.bleed=!1,e[\"bookmark-label\"]=!1,e[\"bookmark-level\"]=!1,e[\"bookmark-state\"]=!1,e.border=!0,e[\"border-bottom\"]=!0,e[\"border-bottom-color\"]=!0,e[\"border-bottom-left-radius\"]=!0,e[\"border-bottom-right-radius\"]=!0,e[\"border-bottom-style\"]=!0,e[\"border-bottom-width\"]=!0,e[\"border-collapse\"]=!0,e[\"border-color\"]=!0,e[\"border-image\"]=!0,e[\"border-image-outset\"]=!0,e[\"border-image-repeat\"]=!0,e[\"border-image-slice\"]=!0,e[\"border-image-source\"]=!0,e[\"border-image-width\"]=!0,e[\"border-left\"]=!0,e[\"border-left-color\"]=!0,e[\"border-left-style\"]=!0,e[\"border-left-width\"]=!0,e[\"border-radius\"]=!0,e[\"border-right\"]=!0,e[\"border-right-color\"]=!0,e[\"border-right-style\"]=!0,e[\"border-right-width\"]=!0,e[\"border-spacing\"]=!0,e[\"border-style\"]=!0,e[\"border-top\"]=!0,e[\"border-top-color\"]=!0,e[\"border-top-left-radius\"]=!0,e[\"border-top-right-radius\"]=!0,e[\"border-top-style\"]=!0,e[\"border-top-width\"]=!0,e[\"border-width\"]=!0,e.bottom=!1,e[\"box-decoration-break\"]=!0,e[\"box-shadow\"]=!0,e[\"box-sizing\"]=!0,e[\"box-snap\"]=!0,e[\"box-suppress\"]=!0,e[\"break-after\"]=!0,e[\"break-before\"]=!0,e[\"break-inside\"]=!0,e[\"caption-side\"]=!1,e.chains=!1,e.clear=!0,e.clip=!1,e[\"clip-path\"]=!1,e[\"clip-rule\"]=!1,e.color=!0,e[\"color-interpolation-filters\"]=!0,e[\"column-count\"]=!1,e[\"column-fill\"]=!1,e[\"column-gap\"]=!1,e[\"column-rule\"]=!1,e[\"column-rule-color\"]=!1,e[\"column-rule-style\"]=!1,e[\"column-rule-width\"]=!1,e[\"column-span\"]=!1,e[\"column-width\"]=!1,e.columns=!1,e.contain=!1,e.content=!1,e[\"counter-increment\"]=!1,e[\"counter-reset\"]=!1,e[\"counter-set\"]=!1,e.crop=!1,e.cue=!1,e[\"cue-after\"]=!1,e[\"cue-before\"]=!1,e.cursor=!1,e.direction=!1,e.display=!0,e[\"display-inside\"]=!0,e[\"display-list\"]=!0,e[\"display-outside\"]=!0,e[\"dominant-baseline\"]=!1,e.elevation=!1,e[\"empty-cells\"]=!1,e.filter=!1,e.flex=!1,e[\"flex-basis\"]=!1,e[\"flex-direction\"]=!1,e[\"flex-flow\"]=!1,e[\"flex-grow\"]=!1,e[\"flex-shrink\"]=!1,e[\"flex-wrap\"]=!1,e.float=!1,e[\"float-offset\"]=!1,e[\"flood-color\"]=!1,e[\"flood-opacity\"]=!1,e[\"flow-from\"]=!1,e[\"flow-into\"]=!1,e.font=!0,e[\"font-family\"]=!0,e[\"font-feature-settings\"]=!0,e[\"font-kerning\"]=!0,e[\"font-language-override\"]=!0,e[\"font-size\"]=!0,e[\"font-size-adjust\"]=!0,e[\"font-stretch\"]=!0,e[\"font-style\"]=!0,e[\"font-synthesis\"]=!0,e[\"font-variant\"]=!0,e[\"font-variant-alternates\"]=!0,e[\"font-variant-caps\"]=!0,e[\"font-variant-east-asian\"]=!0,e[\"font-variant-ligatures\"]=!0,e[\"font-variant-numeric\"]=!0,e[\"font-variant-position\"]=!0,e[\"font-weight\"]=!0,e.grid=!1,e[\"grid-area\"]=!1,e[\"grid-auto-columns\"]=!1,e[\"grid-auto-flow\"]=!1,e[\"grid-auto-rows\"]=!1,e[\"grid-column\"]=!1,e[\"grid-column-end\"]=!1,e[\"grid-column-start\"]=!1,e[\"grid-row\"]=!1,e[\"grid-row-end\"]=!1,e[\"grid-row-start\"]=!1,e[\"grid-template\"]=!1,e[\"grid-template-areas\"]=!1,e[\"grid-template-columns\"]=!1,e[\"grid-template-rows\"]=!1,e[\"hanging-punctuation\"]=!1,e.height=!0,e.hyphens=!1,e.icon=!1,e[\"image-orientation\"]=!1,e[\"image-resolution\"]=!1,e[\"ime-mode\"]=!1,e[\"initial-letters\"]=!1,e[\"inline-box-align\"]=!1,e[\"justify-content\"]=!1,e[\"justify-items\"]=!1,e[\"justify-self\"]=!1,e.left=!1,e[\"letter-spacing\"]=!0,e[\"lighting-color\"]=!0,e[\"line-box-contain\"]=!1,e[\"line-break\"]=!1,e[\"line-grid\"]=!1,e[\"line-height\"]=!1,e[\"line-snap\"]=!1,e[\"line-stacking\"]=!1,e[\"line-stacking-ruby\"]=!1,e[\"line-stacking-shift\"]=!1,e[\"line-stacking-strategy\"]=!1,e[\"list-style\"]=!0,e[\"list-style-image\"]=!0,e[\"list-style-position\"]=!0,e[\"list-style-type\"]=!0,e.margin=!0,e[\"margin-bottom\"]=!0,e[\"margin-left\"]=!0,e[\"margin-right\"]=!0,e[\"margin-top\"]=!0,e[\"marker-offset\"]=!1,e[\"marker-side\"]=!1,e.marks=!1,e.mask=!1,e[\"mask-box\"]=!1,e[\"mask-box-outset\"]=!1,e[\"mask-box-repeat\"]=!1,e[\"mask-box-slice\"]=!1,e[\"mask-box-source\"]=!1,e[\"mask-box-width\"]=!1,e[\"mask-clip\"]=!1,e[\"mask-image\"]=!1,e[\"mask-origin\"]=!1,e[\"mask-position\"]=!1,e[\"mask-repeat\"]=!1,e[\"mask-size\"]=!1,e[\"mask-source-type\"]=!1,e[\"mask-type\"]=!1,e[\"max-height\"]=!0,e[\"max-lines\"]=!1,e[\"max-width\"]=!0,e[\"min-height\"]=!0,e[\"min-width\"]=!0,e[\"move-to\"]=!1,e[\"nav-down\"]=!1,e[\"nav-index\"]=!1,e[\"nav-left\"]=!1,e[\"nav-right\"]=!1,e[\"nav-up\"]=!1,e[\"object-fit\"]=!1,e[\"object-position\"]=!1,e.opacity=!1,e.order=!1,e.orphans=!1,e.outline=!1,e[\"outline-color\"]=!1,e[\"outline-offset\"]=!1,e[\"outline-style\"]=!1,e[\"outline-width\"]=!1,e.overflow=!1,e[\"overflow-wrap\"]=!1,e[\"overflow-x\"]=!1,e[\"overflow-y\"]=!1,e.padding=!0,e[\"padding-bottom\"]=!0,e[\"padding-left\"]=!0,e[\"padding-right\"]=!0,e[\"padding-top\"]=!0,e.page=!1,e[\"page-break-after\"]=!1,e[\"page-break-before\"]=!1,e[\"page-break-inside\"]=!1,e[\"page-policy\"]=!1,e.pause=!1,e[\"pause-after\"]=!1,e[\"pause-before\"]=!1,e.perspective=!1,e[\"perspective-origin\"]=!1,e.pitch=!1,e[\"pitch-range\"]=!1,e[\"play-during\"]=!1,e.position=!1,e[\"presentation-level\"]=!1,e.quotes=!1,e[\"region-fragment\"]=!1,e.resize=!1,e.rest=!1,e[\"rest-after\"]=!1,e[\"rest-before\"]=!1,e.richness=!1,e.right=!1,e.rotation=!1,e[\"rotation-point\"]=!1,e[\"ruby-align\"]=!1,e[\"ruby-merge\"]=!1,e[\"ruby-position\"]=!1,e[\"shape-image-threshold\"]=!1,e[\"shape-outside\"]=!1,e[\"shape-margin\"]=!1,e.size=!1,e.speak=!1,e[\"speak-as\"]=!1,e[\"speak-header\"]=!1,e[\"speak-numeral\"]=!1,e[\"speak-punctuation\"]=!1,e[\"speech-rate\"]=!1,e.stress=!1,e[\"string-set\"]=!1,e[\"tab-size\"]=!1,e[\"table-layout\"]=!1,e[\"text-align\"]=!0,e[\"text-align-last\"]=!0,e[\"text-combine-upright\"]=!0,e[\"text-decoration\"]=!0,e[\"text-decoration-color\"]=!0,e[\"text-decoration-line\"]=!0,e[\"text-decoration-skip\"]=!0,e[\"text-decoration-style\"]=!0,e[\"text-emphasis\"]=!0,e[\"text-emphasis-color\"]=!0,e[\"text-emphasis-position\"]=!0,e[\"text-emphasis-style\"]=!0,e[\"text-height\"]=!0,e[\"text-indent\"]=!0,e[\"text-justify\"]=!0,e[\"text-orientation\"]=!0,e[\"text-overflow\"]=!0,e[\"text-shadow\"]=!0,e[\"text-space-collapse\"]=!0,e[\"text-transform\"]=!0,e[\"text-underline-position\"]=!0,e[\"text-wrap\"]=!0,e.top=!1,e.transform=!1,e[\"transform-origin\"]=!1,e[\"transform-style\"]=!1,e.transition=!1,e[\"transition-delay\"]=!1,e[\"transition-duration\"]=!1,e[\"transition-property\"]=!1,e[\"transition-timing-function\"]=!1,e[\"unicode-bidi\"]=!1,e[\"vertical-align\"]=!1,e.visibility=!1,e[\"voice-balance\"]=!1,e[\"voice-duration\"]=!1,e[\"voice-family\"]=!1,e[\"voice-pitch\"]=!1,e[\"voice-range\"]=!1,e[\"voice-rate\"]=!1,e[\"voice-stress\"]=!1,e[\"voice-volume\"]=!1,e.volume=!1,e[\"white-space\"]=!1,e.widows=!1,e.width=!0,e[\"will-change\"]=!1,e[\"word-break\"]=!0,e[\"word-spacing\"]=!0,e[\"word-wrap\"]=!0,e[\"wrap-flow\"]=!1,e[\"wrap-through\"]=!1,e[\"writing-mode\"]=!1,e[\"z-index\"]=!1,e}n(pn,\"getDefaultWhiteList\");function Dc(e,t,r){}n(Dc,\"onAttr\");function Ic(e,t,r){}n(Ic,\"onIgnoreAttr\");var Hc=/javascript\\s*\\:/img;function Mc(e,t){return Hc.test(t)?\"\":t}n(Mc,\"safeAttrValue\");Pe.whiteList=pn();Pe.getDefaultWhiteList=pn;Pe.onAttr=Dc;Pe.onIgnoreAttr=Ic;Pe.safeAttrValue=Mc});var $r=L((Gh,fn)=>{fn.exports={indexOf:function(e,t){var r,i;if(Array.prototype.indexOf)return e.indexOf(t);for(r=0,i=e.length;r<i;r++)if(e[r]===t)return r;return-1},forEach:function(e,t,r){var i,s;if(Array.prototype.forEach)return e.forEach(t,r);for(i=0,s=e.length;i<s;i++)t.call(r,e[i],i,e)},trim:function(e){return String.prototype.trim?e.trim():e.replace(/(^\\s*)|(\\s*$)/g,\"\")},trimRight:function(e){return String.prototype.trimRight?e.trimRight():e.replace(/(\\s*$)/g,\"\")}}});var hn=L((Vh,dn)=>{var Qe=$r();function Uc(e,t){e=Qe.trimRight(e),e[e.length-1]!==\";\"&&(e+=\";\");var r=e.length,i=!1,s=0,a=0,o=\"\";function l(){if(!i){var p=Qe.trim(e.slice(s,a)),d=p.indexOf(\":\");if(d!==-1){var f=Qe.trim(p.slice(0,d)),E=Qe.trim(p.slice(d+1));if(f){var b=t(s,o.length,f,E,p);b&&(o+=b+\"; \")}}}s=a+1}for(n(l,\"addNewAttr\");a<r;a++){var c=e[a];if(c===\"/\"&&e[a+1]===\"*\"){var u=e.indexOf(\"*/\",a+2);if(u===-1)break;a=u+1,s=a+1,i=!1}else c===\"(\"?i=!0:c===\")\"?i=!1:c===\";\"?i||l():c===`\n`&&l()}return Qe.trim(o)}n(Uc,\"parseStyle\");dn.exports=Uc});var bn=L((Kh,yn)=>{var xt=Fr(),Fc=hn(),Qh=$r();function gn(e){return e==null}n(gn,\"isNull\");function $c(e){var t={};for(var r in e)t[r]=e[r];return t}n($c,\"shallowCopyObject\");function mn(e){e=$c(e||{}),e.whiteList=e.whiteList||xt.whiteList,e.onAttr=e.onAttr||xt.onAttr,e.onIgnoreAttr=e.onIgnoreAttr||xt.onIgnoreAttr,e.safeAttrValue=e.safeAttrValue||xt.safeAttrValue,this.options=e}n(mn,\"FilterCSS\");mn.prototype.process=function(e){if(e=e||\"\",e=e.toString(),!e)return\"\";var t=this,r=t.options,i=r.whiteList,s=r.onAttr,a=r.onIgnoreAttr,o=r.safeAttrValue,l=Fc(e,function(c,u,p,d,f){var E=i[p],b=!1;if(E===!0?b=E:typeof E==\"function\"?b=E(d):E instanceof RegExp&&(b=E.test(d)),b!==!0&&(b=!1),d=o(p,d),!!d){var y={position:u,sourcePosition:c,source:f,isWhite:b};if(b){var x=s(p,d,y);return gn(x)?p+\":\"+d:x}else{var x=a(p,d,y);if(!gn(x))return x}}});return l};yn.exports=mn});var Rt=L((vt,zr)=>{var An=Fr(),En=bn();function Bc(e,t){var r=new En(t);return r.process(e)}n(Bc,\"filterCSS\");vt=zr.exports=Bc;vt.FilterCSS=En;for(Br in An)vt[Br]=An[Br];var Br;typeof window<\"u\"&&(window.filterCSS=zr.exports)});var wt=L((Xh,xn)=>{xn.exports={indexOf:function(e,t){var r,i;if(Array.prototype.indexOf)return e.indexOf(t);for(r=0,i=e.length;r<i;r++)if(e[r]===t)return r;return-1},forEach:function(e,t,r){var i,s;if(Array.prototype.forEach)return e.forEach(t,r);for(i=0,s=e.length;i<s;i++)t.call(r,e[i],i,e)},trim:function(e){return String.prototype.trim?e.trim():e.replace(/(^\\s*)|(\\s*$)/g,\"\")},spaceIndex:function(e){var t=/\\s|\\n|\\t/,r=t.exec(e);return r?r.index:-1}}});var Gr=L(B=>{var zc=Rt().FilterCSS,Gc=Rt().getDefaultWhiteList,Tt=wt();function wn(){return{a:[\"target\",\"href\",\"title\"],abbr:[\"title\"],address:[],area:[\"shape\",\"coords\",\"href\",\"alt\"],article:[],aside:[],audio:[\"autoplay\",\"controls\",\"crossorigin\",\"loop\",\"muted\",\"preload\",\"src\"],b:[],bdi:[\"dir\"],bdo:[\"dir\"],big:[],blockquote:[\"cite\"],br:[],caption:[],center:[],cite:[],code:[],col:[\"align\",\"valign\",\"span\",\"width\"],colgroup:[\"align\",\"valign\",\"span\",\"width\"],dd:[],del:[\"datetime\"],details:[\"open\"],div:[],dl:[],dt:[],em:[],figcaption:[],figure:[],font:[\"color\",\"size\",\"face\"],footer:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],header:[],hr:[],i:[],img:[\"src\",\"alt\",\"title\",\"width\",\"height\"],ins:[\"datetime\"],li:[],mark:[],nav:[],ol:[],p:[],pre:[],s:[],section:[],small:[],span:[],sub:[],summary:[],sup:[],strong:[],strike:[],table:[\"width\",\"border\",\"align\",\"valign\"],tbody:[\"align\",\"valign\"],td:[\"width\",\"rowspan\",\"colspan\",\"align\",\"valign\"],tfoot:[\"align\",\"valign\"],th:[\"width\",\"rowspan\",\"colspan\",\"align\",\"valign\"],thead:[\"align\",\"valign\"],tr:[\"rowspan\",\"align\",\"valign\"],tt:[],u:[],ul:[],video:[\"autoplay\",\"controls\",\"crossorigin\",\"loop\",\"muted\",\"playsinline\",\"poster\",\"preload\",\"src\",\"height\",\"width\"]}}n(wn,\"getDefaultWhiteList\");var Sn=new zc;function Vc(e,t,r){}n(Vc,\"onTag\");function jc(e,t,r){}n(jc,\"onIgnoreTag\");function Qc(e,t,r){}n(Qc,\"onTagAttr\");function Kc(e,t,r){}n(Kc,\"onIgnoreTagAttr\");function Tn(e){return e.replace(Yc,\"&lt;\").replace(Xc,\"&gt;\")}n(Tn,\"escapeHtml\");function Wc(e,t,r,i){if(r=Nn(r),t===\"href\"||t===\"src\"){if(r=Tt.trim(r),r===\"#\")return\"#\";if(!(r.substr(0,7)===\"http://\"||r.substr(0,8)===\"https://\"||r.substr(0,7)===\"mailto:\"||r.substr(0,4)===\"tel:\"||r.substr(0,11)===\"data:image/\"||r.substr(0,6)===\"ftp://\"||r.substr(0,2)===\"./\"||r.substr(0,3)===\"../\"||r[0]===\"#\"||r[0]===\"/\"))return\"\"}else if(t===\"background\"){if(St.lastIndex=0,St.test(r))return\"\"}else if(t===\"style\"){if(vn.lastIndex=0,vn.test(r)||(Rn.lastIndex=0,Rn.test(r)&&(St.lastIndex=0,St.test(r))))return\"\";i!==!1&&(i=i||Sn,r=i.process(r))}return r=qn(r),r}n(Wc,\"safeAttrValue\");var Yc=/</g,Xc=/>/g,Zc=/\"/g,Jc=/&quot;/g,eu=/&#([a-zA-Z0-9]*);?/gim,tu=/&colon;?/gim,ru=/&newline;?/gim,St=/((j\\s*a\\s*v\\s*a|v\\s*b|l\\s*i\\s*v\\s*e)\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*|m\\s*o\\s*c\\s*h\\s*a):/gi,vn=/e\\s*x\\s*p\\s*r\\s*e\\s*s\\s*s\\s*i\\s*o\\s*n\\s*\\(.*/gi,Rn=/u\\s*r\\s*l\\s*\\(.*/gi;function Cn(e){return e.replace(Zc,\"&quot;\")}n(Cn,\"escapeQuote\");function _n(e){return e.replace(Jc,'\"')}n(_n,\"unescapeQuote\");function On(e){return e.replace(eu,n(function(r,i){return i[0]===\"x\"||i[0]===\"X\"?String.fromCharCode(parseInt(i.substr(1),16)):String.fromCharCode(parseInt(i,10))},\"replaceUnicode\"))}n(On,\"escapeHtmlEntities\");function Pn(e){return e.replace(tu,\":\").replace(ru,\" \")}n(Pn,\"escapeDangerHtml5Entities\");function Ln(e){for(var t=\"\",r=0,i=e.length;r<i;r++)t+=e.charCodeAt(r)<32?\" \":e.charAt(r);return Tt.trim(t)}n(Ln,\"clearNonPrintableCharacter\");function Nn(e){return e=_n(e),e=On(e),e=Pn(e),e=Ln(e),e}n(Nn,\"friendlyAttrValue\");function qn(e){return e=Cn(e),e=Tn(e),e}n(qn,\"escapeAttrValue\");function iu(){return\"\"}n(iu,\"onIgnoreTagStripAll\");function su(e,t){typeof t!=\"function\"&&(t=n(function(){},\"next\"));var r=!Array.isArray(e);function i(o){return r?!0:Tt.indexOf(e,o)!==-1}n(i,\"isRemoveTag\");var s=[],a=!1;return{onIgnoreTag:function(o,l,c){if(i(o))if(c.isClosing){var u=\"[/removed]\",p=c.position+u.length;return s.push([a!==!1?a:c.position,p]),a=!1,u}else return a||(a=c.position),\"[removed]\";else return t(o,l,c)},remove:function(o){var l=\"\",c=0;return Tt.forEach(s,function(u){l+=o.slice(c,u[0]),c=u[1]}),l+=o.slice(c),l}}}n(su,\"StripTagBody\");function nu(e){for(var t=\"\",r=0;r<e.length;){var i=e.indexOf(\"<!--\",r);if(i===-1){t+=e.slice(r);break}t+=e.slice(r,i);var s=e.indexOf(\"-->\",i);if(s===-1)break;r=s+3}return t}n(nu,\"stripCommentTag\");function au(e){var t=e.split(\"\");return t=t.filter(function(r){var i=r.charCodeAt(0);return i===127?!1:i<=31?i===10||i===13:!0}),t.join(\"\")}n(au,\"stripBlankChar\");B.whiteList=wn();B.getDefaultWhiteList=wn;B.onTag=Vc;B.onIgnoreTag=jc;B.onTagAttr=Qc;B.onIgnoreTagAttr=Kc;B.safeAttrValue=Wc;B.escapeHtml=Tn;B.escapeQuote=Cn;B.unescapeQuote=_n;B.escapeHtmlEntities=On;B.escapeDangerHtml5Entities=Pn;B.clearNonPrintableCharacter=Ln;B.friendlyAttrValue=Nn;B.escapeAttrValue=qn;B.onIgnoreTagStripAll=iu;B.StripTagBody=su;B.stripCommentTag=nu;B.stripBlankChar=au;B.cssFilter=Sn;B.getDefaultCSSWhiteList=Gc});var jr=L(Vr=>{var me=wt();function ou(e){var t=me.spaceIndex(e),r;return t===-1?r=e.slice(1,-1):r=e.slice(1,t+1),r=me.trim(r).toLowerCase(),r.slice(0,1)===\"/\"&&(r=r.slice(1)),r.slice(-1)===\"/\"&&(r=r.slice(0,-1)),r}n(ou,\"getTagName\");function lu(e){return e.slice(0,2)===\"</\"}n(lu,\"isClosing\");function cu(e,t,r){\"use strict\";var i=\"\",s=0,a=!1,o=!1,l=0,c=e.length,u=\"\",p=\"\";e:for(l=0;l<c;l++){var d=e.charAt(l);if(a===!1){if(d===\"<\"){a=l;continue}}else if(o===!1){if(d===\"<\"){i+=r(e.slice(s,l)),a=l,s=l;continue}if(d===\">\"||l===c-1){i+=r(e.slice(s,a)),p=e.slice(a,l+1),u=ou(p),i+=t(a,i.length,u,p,lu(p)),s=l+1,a=!1;continue}if(d==='\"'||d===\"'\")for(var f=1,E=e.charAt(l-f);E.trim()===\"\"||E===\"=\";){if(E===\"=\"){o=d;continue e}E=e.charAt(l-++f)}}else if(d===o){o=!1;continue}}return s<c&&(i+=r(e.substr(s))),i}n(cu,\"parseTag\");var uu=/[^a-zA-Z0-9\\\\_:.-]/gim;function pu(e,t){\"use strict\";var r=0,i=0,s=[],a=!1,o=e.length;function l(f,E){if(f=me.trim(f),f=f.replace(uu,\"\").toLowerCase(),!(f.length<1)){var b=t(f,E||\"\");b&&s.push(b)}}n(l,\"addAttr\");for(var c=0;c<o;c++){var u=e.charAt(c),p,d;if(a===!1&&u===\"=\"){a=e.slice(r,c),r=c+1,i=e.charAt(r)==='\"'||e.charAt(r)===\"'\"?r:du(e,c+1);continue}if(a!==!1&&c===i){if(d=e.indexOf(u,c+1),d===-1)break;p=me.trim(e.slice(i+1,d)),l(a,p),a=!1,c=d,r=c+1;continue}if(/\\s|\\n|\\t/.test(u))if(e=e.replace(/\\s|\\n|\\t/g,\" \"),a===!1)if(d=fu(e,c),d===-1){p=me.trim(e.slice(r,c)),l(p),a=!1,r=c+1;continue}else{c=d-1;continue}else if(d=hu(e,c-1),d===-1){p=me.trim(e.slice(r,c)),p=kn(p),l(a,p),a=!1,r=c+1;continue}else continue}return r<e.length&&(a===!1?l(e.slice(r)):l(a,kn(me.trim(e.slice(r))))),me.trim(s.join(\" \"))}n(pu,\"parseAttr\");function fu(e,t){for(;t<e.length;t++){var r=e[t];if(r!==\" \")return r===\"=\"?t:-1}}n(fu,\"findNextEqual\");function du(e,t){for(;t<e.length;t++){var r=e[t];if(r!==\" \")return r===\"'\"||r==='\"'?t:-1}}n(du,\"findNextQuotationMark\");function hu(e,t){for(;t>0;t--){var r=e[t];if(r!==\" \")return r===\"=\"?t:-1}}n(hu,\"findBeforeEqual\");function gu(e){return e[0]==='\"'&&e[e.length-1]==='\"'||e[0]===\"'\"&&e[e.length-1]===\"'\"}n(gu,\"isQuoteWrapString\");function kn(e){return gu(e)?e.substr(1,e.length-2):e}n(kn,\"stripQuoteWrap\");Vr.parseTag=cu;Vr.parseAttr=pu});var Mn=L((rg,Hn)=>{var mu=Rt().FilterCSS,se=Gr(),Dn=jr(),yu=Dn.parseTag,bu=Dn.parseAttr,_t=wt();function Ct(e){return e==null}n(Ct,\"isNull\");function Au(e){var t=_t.spaceIndex(e);if(t===-1)return{html:\"\",closing:e[e.length-2]===\"/\"};e=_t.trim(e.slice(t+1,-1));var r=e[e.length-1]===\"/\";return r&&(e=_t.trim(e.slice(0,-1))),{html:e,closing:r}}n(Au,\"getAttrs\");function Eu(e){var t={};for(var r in e)t[r]=e[r];return t}n(Eu,\"shallowCopyObject\");function xu(e){var t={};for(var r in e)Array.isArray(e[r])?t[r.toLowerCase()]=e[r].map(function(i){return i.toLowerCase()}):t[r.toLowerCase()]=e[r];return t}n(xu,\"keysToLowerCase\");function In(e){e=Eu(e||{}),e.stripIgnoreTag&&(e.onIgnoreTag&&console.error('Notes: cannot use these two options \"stripIgnoreTag\" and \"onIgnoreTag\" at the same time'),e.onIgnoreTag=se.onIgnoreTagStripAll),e.whiteList||e.allowList?e.whiteList=xu(e.whiteList||e.allowList):e.whiteList=se.whiteList,e.onTag=e.onTag||se.onTag,e.onTagAttr=e.onTagAttr||se.onTagAttr,e.onIgnoreTag=e.onIgnoreTag||se.onIgnoreTag,e.onIgnoreTagAttr=e.onIgnoreTagAttr||se.onIgnoreTagAttr,e.safeAttrValue=e.safeAttrValue||se.safeAttrValue,e.escapeHtml=e.escapeHtml||se.escapeHtml,this.options=e,e.css===!1?this.cssFilter=!1:(e.css=e.css||{},this.cssFilter=new mu(e.css))}n(In,\"FilterXSS\");In.prototype.process=function(e){if(e=e||\"\",e=e.toString(),!e)return\"\";var t=this,r=t.options,i=r.whiteList,s=r.onTag,a=r.onIgnoreTag,o=r.onTagAttr,l=r.onIgnoreTagAttr,c=r.safeAttrValue,u=r.escapeHtml,p=t.cssFilter;r.stripBlankChar&&(e=se.stripBlankChar(e)),r.allowCommentTag||(e=se.stripCommentTag(e));var d=!1;r.stripIgnoreTagBody&&(d=se.StripTagBody(r.stripIgnoreTagBody,a),a=d.onIgnoreTag);var f=yu(e,function(E,b,y,x,R){var T={sourcePosition:E,position:b,isClosing:R,isWhite:Object.prototype.hasOwnProperty.call(i,y)},w=s(y,x,T);if(!Ct(w))return w;if(T.isWhite){if(T.isClosing)return\"</\"+y+\">\";var q=Au(x),k=i[y],V=bu(q.html,function(D,S){var _=_t.indexOf(k,D)!==-1,I=o(y,D,S,_);return Ct(I)?_?(S=c(y,D,S,p),S?D+'=\"'+S+'\"':D):(I=l(y,D,S,_),Ct(I)?void 0:I):I});return x=\"<\"+y,V&&(x+=\" \"+V),q.closing&&(x+=\" /\"),x+=\">\",x}else return w=a(y,x,T),Ct(w)?u(x):w},u);return d&&(f=d.remove(f)),f};Hn.exports=In});var zn=L((Le,Ot)=>{var Un=Gr(),Fn=jr(),$n=Mn();function Bn(e,t){var r=new $n(t);return r.process(e)}n(Bn,\"filterXSS\");Le=Ot.exports=Bn;Le.filterXSS=Bn;Le.FilterXSS=$n;(function(){for(var e in Un)Le[e]=Un[e];for(var t in Fn)Le[t]=Fn[t]})();typeof window<\"u\"&&(window.filterXSS=Ot.exports);function vu(){return typeof self<\"u\"&&typeof DedicatedWorkerGlobalScope<\"u\"&&self instanceof DedicatedWorkerGlobalScope}n(vu,\"isWorkerEnv\");vu()&&(self.filterXSS=Ot.exports)});var rp={};ti(rp,{Authorizations:()=>Mt,CustomError:()=>N,PrismaAppSync:()=>Gt,_:()=>tp,log:()=>G,queryBuilder:()=>te});module.exports=Sa(rp);var Ta=n(e=>Number.isInteger(e),\"testObject\"),Ca=n(e=>Object.is(e,-0)?\"-0\":String(e),\"serialize\"),_a=n(e=>Oa.test(e),\"testString\"),Oa=/^-?\\d+$/u,Pa=Number,La=n(e=>e,\"normalize\"),Na=n((e,t)=>Object.is(e,t),\"equals\"),fe={name:\"index\",testObject:Ta,serialize:Ca,testString:_a,parse:Pa,normalize:La,equals:Na};var nt=n((e,t)=>typeof e==\"object\"&&e!==null&&e.type===t,\"isTokenObject\");var ii=n((e,t)=>({name:e,testObject:qa.bind(void 0,e),serialize:ka.bind(void 0,t),testString:Da.bind(void 0,t),parse:Ia.bind(void 0,e),normalize:Ha,equals:Ma}),\"createSimpleTokenType\"),qa=n((e,t)=>nt(t,e),\"testObject\"),ka=n(e=>e,\"serialize\"),Da=n((e,t)=>t===e,\"testString\"),Ia=n(e=>({type:e}),\"parse\"),Ha=n(({type:e})=>({type:e}),\"normalize\"),Ma=n(()=>!0,\"equals\"),jt=ii(\"any\",\"*\"),Qt=ii(\"anyDeep\",\"**\");var de=\"\\\\\",at=\" \",si=\"a space\",le=\".\",ni=new Set([de,le,at]),ot=n(e=>e.replace(Ua,`${de}$&`),\"escapeSpecialChars\"),Ua=/[\\\\. ]/gu;var Fa=n(e=>e instanceof RegExp,\"testObject\"),$a=n(e=>{let t=ot(e.source);return`${He}${t}${He}${e.flags}`},\"serialize\"),Ba=n(e=>e[0]===He&&e.lastIndexOf(He)>1,\"testString\"),za=n(e=>{let t=e.lastIndexOf(He),r=e.slice(1,t),i=e.slice(t+1);return new RegExp(r,i)},\"parse\"),He=\"/\",Ga=n(e=>e,\"normalize\"),Va=n((e,t)=>e.source===t.source&&e.flags===t.flags&&e.lastIndex===t.lastIndex,\"equals\"),Kt={name:\"regExp\",testObject:Fa,serialize:$a,testString:Ba,parse:za,normalize:Ga,equals:Va};var ja=n(e=>nt(e,ui)&&ai(e.from)&&ai(e.to),\"testObject\"),ai=n(e=>e===void 0||fe.testObject(e),\"isEdge\"),Qa=n(({from:e,to:t})=>`${oi(e)}${ci}${oi(t)}`,\"serialize\"),oi=n(e=>e===void 0?li:fe.serialize(e),\"serializeEdge\"),Ka=n(e=>Wa.test(e),\"testString\"),Wa=/^(-?\\d+)?:(-?\\d+)?$/u,Ya=n(e=>{let[t,r]=e.split(ci).map(Xa);return{type:ui,from:t,to:r}},\"parse\"),Xa=n(e=>e===li?void 0:fe.parse(e),\"parseEdge\"),li=\"\",ci=\":\",ui=\"slice\",Wt=n(({type:e,from:t=0,to:r})=>Object.is(r,-0)||r===void 0?{type:e,from:t}:{type:e,from:t,to:r},\"normalize\"),Za=n((e,t)=>{let{from:r,to:i}=Wt(e),{from:s,to:a}=Wt(t);return Object.is(r,s)&&Object.is(i,a)},\"equals\"),Yt={name:\"slice\",testObject:ja,serialize:Qa,testString:Ka,parse:Ya,normalize:Wt,equals:Za};var pi=n(e=>Xt.find(t=>t.testString(e)),\"getOtherStringTokenType\"),Xt=[jt,Qt,Kt,Yt,fe],fi=[fe,jt,Qt,Kt,Yt];var Ja=n(e=>typeof e==\"string\",\"testObject\"),eo=n((e,t)=>{if(e===\"\"&&t===0)return le;let r=ot(e);return pi(r)===void 0?r:`${de}${r}`},\"serialize\"),to=n(()=>!0,\"testString\"),ro=n(e=>e,\"parse\"),io=n(e=>e,\"normalize\"),so=n((e,t)=>e===t,\"equals\"),Me={name:\"prop\",testObject:Ja,serialize:eo,testString:to,parse:ro,normalize:io,equals:so};var Ue=n(e=>{let t=Fe(e);return t===void 0?no:t.name},\"getTokenType\"),no=\"unknown\",Fe=n(e=>oo.find(t=>t.testObject(e)),\"getObjectTokenType\"),di=n((e,t)=>t?Me:ao.find(r=>r.testString(e)),\"getStringTokenType\"),ao=[...Xt,Me],oo=[Me,...fi],hi=n(e=>Me.testObject(e)||fe.testObject(e)&&e>=0&&!Object.is(e,-0),\"isPathToken\");var lt=n((e,t,r)=>{re(e,`Invalid token: ${t}\n${r}`)},\"throwTokenError\"),re=n((e,t)=>{throw new Error(`Invalid query: ${e}\n${t}`)},\"throwQueryError\");var gi=n((e,t)=>{e.length!==1&&re(t,\"It must not be a union.\");let[r]=e;return mi(r,t),r},\"normalizeArraysPath\"),ct=n((e,t)=>{Array.isArray(e)||re(t,\"It must be an array.\"),e.some(Array.isArray)&&re(t,\"It must not be a union.\"),mi(e,t)},\"validatePath\"),mi=n((e,t)=>{e.forEach(r=>{lo(r,t)})},\"validatePathTokens\"),lo=n((e,t)=>{hi(e)||lt(t,e,\"It must be a property name or a positive array index.\")},\"validatePathToken\");var yi=n(e=>{ut(e)||re(e,\"It must be a string.\")},\"validateQueryString\"),ut=n(e=>typeof e==\"string\",\"isQueryString\"),bi=n((e,t)=>{e.length===0&&re(t,\"It must not be an empty string.\")},\"validateEmptyQuery\");var Ai=n((e,t)=>{let r=t[e.index+1];if(ni.has(r)){e.index+=1,e.chars+=r;return}e.chars.length!==0&&re(t,`Character \"${de}\" must either be at the start of a token, or be followed by ${si} or ${le} or ${de}`),e.isProp=!0},\"parseEscape\");var Ei=n(e=>{let t=co();for(;t.index<=e.length;t.index+=1){let r=e[t.index];r===de?Ai(t,e):r===at||t.index===e.length?uo(t):r===le?vi(t):t.chars+=r}return t.arrays},\"parseQueryString\"),co=n(()=>{let e={arrays:[],index:0};return xi(e),wi(e),e},\"getInitialState\"),uo=n(e=>{po(e)||(Ri(e)||vi(e),e.arrays.push(e.array),xi(e))},\"addQueryArray\"),po=n(e=>e.firstToken&&e.chars.length===0&&e.array.length===0,\"hasNoQueryArray\"),xi=n(e=>{e.array=[],e.firstToken=!0,e.onlyDots=!0},\"resetQueryArrayState\"),vi=n(e=>{if(fo(e))return;e.onlyDots=Ri(e);let t=di(e.chars,e.isProp),r=t.normalize(t.parse(e.chars));e.array.push(r),wi(e)},\"addToken\"),Ri=n(e=>e.onlyDots&&e.chars.length===0,\"hasOnlyDots\"),fo=n(e=>e.firstToken?(e.firstToken=!1,e.chars.length===0):!1,\"handleLeadingDot\"),wi=n(e=>{e.isProp=!1,e.chars=\"\"},\"resetTokenState\");var Si=n(e=>{let t=Zt(e);return gi(t,e)},\"parsePath\"),Zt=n(e=>{yi(e);let t=Ei(e);return bi(t,e),t},\"parseQuery\");var Ti=n((e,t)=>pt(e,t).normalize(e),\"normalizeToken\"),pt=n((e,t)=>{let r=Fe(e);return ho(r,e,t),r},\"getValidTokenType\"),ho=n((e,t,r)=>{e===void 0&&lt(r,t,`It must be one of the following:\n - a property name string\n - an array index integer, positive or negative\n - a property name regular expression\n - { type: \"any\" }\n - { type: \"slice\", from: integer, to: integer }`)},\"validateToken\");var Ci=n((e,t)=>(go(e,t),(e.every(Array.isArray)&&e.length!==0?e:[e]).map(i=>mo(i,t))),\"normalizeQueryArrays\"),go=n((e,t)=>{Array.isArray(e)||re(t,\"It must be an array.\")},\"validateQueryArrays\"),mo=n((e,t)=>e.map(r=>Ti(r,t)),\"normalizeQueryArray\");var Jt=n(e=>ut(e)?Si(e):(ct(e,e),e),\"normalizePath\"),er=n(e=>ut(e)?Zt(e):Ci(e,e),\"normalizeQuery\");var tr=n((e,t)=>{if(Object.is(e,t))return!0;let r=pt(e),i=pt(t);return r===i&&r.equals(e,t)},\"isSameToken\");var rr=n(e=>(ct(e,e),yo(e)),\"serializePath\"),yo=n(e=>e.every(bo)?le.repeat(e.length+1):e.map(Eo).join(le),\"serializeQueryArray\"),bo=n(e=>e===Ao,\"isEmptyToken\"),Ao=\"\",Eo=n((e,t)=>Fe(e).serialize(e,t),\"serializeToken\");var _i=n(({classes:e,inherited:t})=>{if(t&&!e)throw new Error('The \"classes\" option must be true when the \"inherited\" option is true.')},\"validateInherited\"),Oi=n(({missing:e,entries:t})=>{if(e&&!t)throw new Error('The \"entries\" option must be true when the \"missing\" option is true.')},\"validateMissing\"),Pi=n(({roots:e,leaves:t})=>{if(e&&t)throw new Error('The \"roots\" and \"leaves\" options must not be true at the same time.')},\"validateLeaves\");var Li=n(({childFirst:e=!1,roots:t=!1,leaves:r=!1,sort:i=!1,missing:s=!1,entries:a=!1,shallowArrays:o=!1,classes:l=!1,inherited:c=!1}={})=>{let u={childFirst:e||r,roots:t,leaves:r,sort:i,missing:s,entries:a,shallowArrays:o,classes:l,inherited:c};return _i(u),Pi(u),Oi(u),u},\"getOptions\");var xo=n((e,t,{inherited:r,shallowArrays:i})=>Array.isArray(e)?i?[{value:e,missing:!1}]:e.map((s,a)=>({value:s,prop:a,missing:!1})):ir(e,r).map(s=>({value:e[s],prop:s,missing:!1})),\"iterate\"),ir=n((e,t)=>{if(!t)return Object.keys(e);let r=[];for(let i in e)r.push(i);return r},\"getKeys\"),sr={name:\"any\",valueType:\"objectArray\",iterate:xo};var vo=n((e,t)=>{let r=e.slice(0,t),i=Ni(e,t);return[[...r,...e.slice(i+1)],[...r,{type:\"any\"},...e.slice(i)]]},\"recurse\"),Ni=n((e,t)=>t<=e.length-1&&Ue(e[t])===\"anyDeep\"?Ni(e,t+1):t-1,\"getLastIndex\"),nr={name:\"anyDeep\",array:!1,recurse:vo};var Ro=n((e,t)=>{let r=ar(e,t);return[{value:e[r],prop:r,missing:r>=e.length}]},\"iterate\"),ar=n((e,t)=>t>0||Object.is(t,0)?t:Math.max(e.length+t,0),\"getArrayIndex\"),or={name:\"index\",valueType:\"array\",iterate:Ro};var wo=n((e,t)=>[{value:e[t],prop:t,missing:!(t in e)}],\"iterate\"),lr={name:\"prop\",valueType:\"weakObject\",iterate:wo};var So=n((e,t,{inherited:r})=>ir(e,r).filter(i=>t.test(i)).map(i=>({value:e[i],prop:i,missing:!1})),\"iterate\"),cr={name:\"regExp\",valueType:\"strictObject\",iterate:So};var To=n((e,{from:t,to:r=-0})=>{let i=qi(e,t),s=Math.max(qi(e,r),i);return new Array(s-i).fill().map((a,o)=>({value:e[o+i],prop:o+i,missing:!1}))},\"iterate\"),qi=n((e,t)=>{let r=ar(e,t);return Math.min(r,e.length)},\"getBoundedIndex\"),ur={name:\"slice\",valueType:\"array\",iterate:To};var ft=n(e=>{let t=Ue(e);return Co[t]},\"getTokenType\"),Co={[sr.name]:sr,[nr.name]:nr,[or.name]:or,[lr.name]:lr,[cr.name]:cr,[ur.name]:ur};function pr(e){if(typeof e!=\"object\"||e===null)return!1;let t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)}n(pr,\"isPlainObject\");var fr=n((e,t)=>t?dr(e):pr(e),\"isObject\"),dr=n(e=>{let t=typeof e;return(t===\"object\"||t===\"function\")&&e!==null},\"isWeakObject\");var ki=n((e,t,r)=>{let i=ft(t),{isPresent:s,getDefaultValue:a}=gr[i.valueType],o=!s(e,r),l=o?a():e;return{tokenType:i,missing:o,value:l}},\"handleMissingValue\"),hr=n(()=>({}),\"getDefaultObject\"),_o=n(()=>[],\"getDefaultArray\"),gr={objectArray:{isPresent:(e,t)=>fr(e,t)||Array.isArray(e),getDefaultValue:hr},array:{isPresent:Array.isArray,getDefaultValue:_o},strictObject:{isPresent:(e,t)=>fr(e,t),getDefaultValue:hr},weakObject:{isPresent:dr,getDefaultValue:hr}};var Di=n((e,t,r)=>e.filter(({queryArray:i})=>i.length!==t).flatMap(i=>Oo(i,t,r)),\"expandTokens\"),Oo=n(({queryArray:e,value:t,path:r},i,s)=>{let a=e[i],o=ki(t,a,s.classes);return No(a,o,s).filter(Po).map(({value:c,prop:u,missing:p})=>({queryArray:e,value:c,path:u===void 0?r:[...r,u],missing:o.missing||p}))},\"expandToken\"),Po=n(({prop:e})=>mr(e),\"isAllowedEntry\"),mr=n(e=>!Lo.has(e),\"isAllowedProp\"),Lo=new Set([\"__proto__\",\"prototype\",\"constructor\"]),No=n((e,{tokenType:t,missing:r,value:i},s)=>s.missing?t.iterate(i,e,s):r?[]:t.iterate(i,e,s).filter(qo),\"iterateToken\"),qo=n(({missing:e})=>!e,\"isNotMissing\");var Ii=n((e,t,{missing:r,entries:i})=>{let{value:s,missing:a}=ko(e,t);return a&&!r?{matches:!1}:{entry:i?{value:s,path:t,missing:a}:s,matches:!0}},\"getPathValue\"),ko=n((e,t)=>{for(let r of t){if(!Do(e,r)||!mr(r))return{value:void 0,missing:!0};e=e[r]}return{value:e,missing:!1}},\"getDeepValue\"),Do=n((e,t)=>typeof t==\"string\"?Ho(e)&&t in e:Io(e)&&t<e.length,\"isPresent\"),{array:{isPresent:Io},weakObject:{isPresent:Ho}}=gr;var Hi=n((e,t)=>{let r={};return e.forEach((i,s)=>{Mo(i,s,r,t)}),r},\"groupBy\"),Mo=n((e,t,r,i)=>{let s=i(e,t),a=String(s);if(r[a]===void 0){r[a]=[e];return}r[a].push(e)},\"addGroup\");var Mi=n(function*({entries:e,parentEntry:t,index:r,parents:i,opts:s,iterateLevel:a}){if(!Uo(e,t,s))return!1;let o=!1;for(let l of Fo({entries:e,index:r,parents:i,opts:s,iterateLevel:a}))o=!0,yield l;return o},\"iterateChildEntries\"),Uo=n((e,t,{roots:r})=>t===void 0||e.length!==1&&!r,\"shouldIterateChildren\"),Fo=n(function*({entries:e,index:t,parents:r,opts:i,iterateLevel:s}){let a=Di(e,t,i);if(a.length===0)return;let o=t+1;if(a.length===1){yield*s({entries:a,index:o,parents:r,opts:i});return}let l=$o(a,i);for(let c of l)yield*s({entries:c,index:o,parents:r,opts:i})},\"iterateChildren\"),$o=n((e,{sort:t})=>{let r=Hi(e,Bo);return t?Object.keys(r).sort().map(i=>r[i]):Object.values(r)},\"groupSortChildEntries\"),Bo=n(({path:e})=>e[e.length-1],\"getLastProp\");var Ui=n(e=>e.length===1?e:e.filter(zo),\"removeDuplicates\"),zo=n((e,t,r)=>r.every((i,s)=>t<=s||!Go(e,i)),\"isNotDuplicate\"),Go=n(({queryArray:e,path:t},{queryArray:r})=>e.length===r.length&&e.every((i,s)=>s<t.length||tr(i,r[s])),\"isDuplicate\");var Fi=n((e,t)=>{let r=e.map(i=>Vo(i,t));return r.some(Boolean)?e.flatMap((i,s)=>jo(i,r[s],t)):e},\"expandRecursiveTokens\"),Vo=n((e,t)=>{let r=e.queryArray[t];return r===void 0?void 0:ft(r).recurse},\"getRecurseFunc\"),jo=n((e,t,r)=>t===void 0?e:t(e.queryArray,r).map(s=>({...e,queryArray:s})),\"expandRecursiveToken\");var zi=n(function*(e,t,r){let i=new Set([]),s=Qo(e,t);yield*Gi({entries:s,index:0,parents:i,opts:r})},\"iterateQuery\"),Qo=n((e,t)=>t.map(r=>({queryArray:r,value:e,path:[],missing:!1})),\"getRootEntries\"),Gi=n(function*({entries:e,entries:[{value:t,missing:r}],index:i,parents:s,opts:a}){if(r){yield*$i({entries:e,index:i,parents:s,opts:a});return}s.has(t)||(s.add(t),yield*$i({entries:e,index:i,parents:s,opts:a}),s.delete(t))},\"iterateLevel\"),$i=n(function*({entries:e,index:t,parents:r,opts:i}){let s=Fi(e,t),a=Ui(s),o=Ko(a,t);Wo(o,i)&&(yield Bi(o,i));let l=yield*Mi({entries:a,parentEntry:o,index:t,parents:r,opts:i,iterateLevel:Gi});Yo(o,l,i)&&(yield Bi(o,i))},\"iterateToken\"),Ko=n((e,t)=>e.find(({queryArray:r})=>r.length===t),\"getParentEntry\"),Bi=n(({value:e,path:t,missing:r},{entries:i})=>i?{value:e,path:t,missing:r}:e,\"normalizeEntry\"),Wo=n((e,{childFirst:t})=>e!==void 0&&!t,\"shouldYieldParentFirst\"),Yo=n((e,t,{childFirst:r,leaves:i})=>e!==void 0&&r&&!(i&&t),\"shouldYieldParentLast\");var yr=n((e,t,r)=>{let{opts:i,pathArray:s,queryArrays:a}=Xo(t,r);if(s===void 0)return[...zi(e,a,i)];let{entry:o,matches:l}=Ii(e,s,i);return l?[o]:[]},\"list\");var Xo=n((e,t)=>{let r=Li(t),{pathArray:i,queryArrays:s}=Zo(e);return{opts:r,pathArray:i,queryArrays:s}},\"normalizeArgs\"),Zo=n(e=>{try{return{pathArray:Jt(e)}}catch{return{queryArrays:er(e)}}},\"normalizePathOrQuery\");var dt=n((e,{sort:t,shallowArrays:r,classes:i,inherited:s}={})=>{let a=yr(e,\"**\",{childFirst:!1,roots:!1,leaves:!0,sort:t,missing:!1,entries:!0,shallowArrays:r,classes:i,inherited:s});return Object.fromEntries(a.map(Jo))},\"flatten\"),Jo=n(({path:e,value:t})=>[rr(e),t],\"flattenEntry\");var Gn=Ie(Zs()),Qr=Ie(rn()),Lt=Ie(un()),Vn=Ie(zn());function pe(...e){return Qr.default.all([{},...e])}n(pe,\"merge\");function Re(e){return(0,Qr.default)({},e)}n(Re,\"clone\");function Nt(e){return(0,Lt.decode)(e)}n(Nt,\"decode\");function qt(e){return(0,Lt.encode)(e)}n(qt,\"encode\");function jn(e){return dt(e,{shallowArrays:!0})}n(jn,\"dotate\");function Qn(e){let t=dt(e),r=Object.keys(t).map(a=>a.split(\".\").filter(o=>!!!/\\b(\\d+)\\b/gi.exec(o)).join(\"/\")),i=[],s=new Set;for(let a of r){let o=a.split(\"/\"),l=\"\";for(let c of o)l+=l===\"\"?c:`/${c}`,s.has(l)||(i.push(l),s.add(l))}return i}n(Qn,\"objectToPaths\");function Kn(e,t){let r=Re(e);return(Array.isArray(t)?t:[t]).forEach(s=>delete r?.[s]),r}n(Kn,\"omit\");function We(e,t){return(0,Gn.isMatch)(e,t)}n(We,\"isMatchingGlob\");function kt(e){return(0,Vn.default)(e)}n(kt,\"filterXSS\");function W(e){return e==null||typeof e>\"u\"||typeof e==\"string\"&&e.trim()===\"\"||Array.isArray(e)&&e.length===0||Object.getPrototypeOf(e)===Object.prototype&&Object.keys(e).length===0}n(W,\"isEmpty\");function Ye(e){return e===void 0||typeof e>\"u\"}n(Ye,\"isUndefined\");var Ru=n(e=>Array.isArray(e),\"isArray\");function Dt(e){return e?e.charAt(0).toLowerCase()+e.slice(1):\"\"}n(Dt,\"lowerFirst\");var ve=n(e=>Object.prototype.toString.call(e)===\"[object Object]\",\"isObject\");async function we(e,t){return Array.isArray(e)?await Promise.all(e.map(async r=>await Pt(r,t))):ve(e)?await Pt(e,t):e}n(we,\"walk\");async function Pt(e,t,r=new Ke){let i=Re(e),s={},a=Object.keys(i);for(let o of a){let l=new Ke([...r._path,o]),{key:c,value:u}=await t({key:o,value:i[o]},l);if(u&&ve(u)&&!l._ignoreChildren)u=await Pt(u,t,l);else if(u&&Ru(u)&&!l._ignoreChildren)for(let p=0;p<u.length;p++)u[p]&&ve(u[p])&&(u[p]=await Pt(u[p],t,new Ke([...l._path,p])));s[c]=u}return s}n(Pt,\"walkObj\");var Ke=class{constructor(t=[],r=!1){this._path=t;this._ignoreChildren=r;this._path=t,this._ignoreChildren=r}static{n(this,\"WalkNode\")}ignoreChilds(){this._ignoreChildren=!0}getPath(){return this._path}};function Wn(e,t,r){let i=[],s={};for(let a=0;a<t.length;a++)i.push(t[a].replace(/([-[\\]{}()*+?.\\\\^$|#,])/g,\"\\\\$1\")),s[t[a]]=r[a];return i=i.join(\"|\"),e=e.replace(new RegExp(i,\"g\"),a=>s[a]),e}n(Wn,\"replaceAll\");function Xe(e){return Array.from(new Set(e))}n(Xe,\"uniq\");var ne=require(\"@prisma/client\");var Kr=(w=>(w.get=\"get\",w.list=\"list\",w.count=\"count\",w.createMany=\"createMany\",w.updateMany=\"updateMany\",w.deleteMany=\"deleteMany\",w.create=\"create\",w.update=\"update\",w.upsert=\"upsert\",w.delete=\"delete\",w.onCreatedMany=\"onCreatedMany\",w.onUpdatedMany=\"onUpdatedMany\",w.onDeletedMany=\"onDeletedMany\",w.onMutatedMany=\"onMutatedMany\",w.onCreated=\"onCreated\",w.onUpdated=\"onUpdated\",w.onUpserted=\"onUpserted\",w.onDeleted=\"onDeleted\",w.onMutated=\"onMutated\",w))(Kr||{});var Mt=(a=>(a.API_KEY=\"API_KEY\",a.AWS_IAM=\"AWS_IAM\",a.AMAZON_COGNITO_USER_POOLS=\"AMAZON_COGNITO_USER_POOLS\",a.AWS_LAMBDA=\"AWS_LAMBDA\",a.OPENID_CONNECT=\"OPENID_CONNECT\",a))(Mt||{}),Yn=[\"where\",\"data\",\"select\",\"orderBy\",\"include\",\"distinct\"],wu=[\"create\",\"createMany\",\"set\",\"connect\",\"connectOrCreate\",\"disconnect\",\"update\",\"upsert\",\"delete\",\"updateMany\",\"deleteMany\"],Xn=[\"equals\",\"not\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"contains\",\"search\",\"mode\",\"startsWith\",\"endsWith\",\"AND\",\"OR\",\"NOT\"],Zn=[\"some\",\"every\",\"none\",\"is\",\"isNot\"],Su=[\"set\",\"push\",\"unset\"],Jn=[\"has\",\"hasEvery\",\"hasSome\",\"isEmpty\",\"isSet\",\"equals\"],Tu=[\"set\",\"unset\",\"update\",\"upsert\",\"push\"],ea=[\"equals\",\"is\",\"isNot\",\"isEmpty\",\"every\",\"some\",\"none\"],Cu=[\"increment\",\"decrement\",\"multiply\",\"divide\",\"set\"],ta=[\"path\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_contains\",\"array_starts_with\",\"array_ends_with\"],ra=Xe([...Yn,...Xn,...Zn,...Jn,...ea,...ta]),ug=Xe([...Yn,...wu,...Xn,...Zn,...Su,...Jn,...Tu,...ea,...Cu,...ta]),Ne={access:[\"get\",\"list\",\"count\"],batchAccess:[\"list\",\"count\"],create:[\"create\",\"createMany\"],batchCreate:[\"createMany\"],modify:[\"upsert\",\"update\",\"updateMany\",\"delete\",\"deleteMany\"],batchModify:[\"updateMany\",\"deleteMany\"],delete:[\"delete\",\"deleteMany\"],batchDelete:[\"deleteMany\"],subscribe:[\"onCreatedMany\",\"onUpdatedMany\",\"onDeletedMany\",\"onMutatedMany\",\"onCreated\",\"onUpdated\",\"onUpserted\",\"onDeleted\",\"onMutated\"],batchSubscribe:[\"onCreatedMany\",\"onUpdatedMany\",\"onDeletedMany\",\"onMutatedMany\"]},It=[],Ht=[];for(let e in Ne)e.startsWith(\"batch\")?It=It.concat(Ne[e]):Ht=Ht.concat(Ne[e]);var pg=Ht.filter((e,t)=>Ht.indexOf(e)===t),Ut=It.filter((e,t)=>It.indexOf(e)===t),Ze=\"__prismaAppsync\";var ia=require(\"node:util\");var Wr={FORBIDDEN:401,BAD_USER_INPUT:400,INTERNAL_SERVER_ERROR:500,TOO_MANY_REQUESTS:429},N=class extends Error{static{n(this,\"CustomError\")}constructor(t,r){super(t),this.error=t,this.type=r.type,this.cause=r?.cause?.meta?.cause||r?.cause,this.code=typeof Wr[this.type]<\"u\"?Wr[this.type]:Wr.INTERNAL_SERVER_ERROR,this.message=JSON.stringify({error:this.error,type:this.type,code:this.code});let i=500;this.cause?.message?.length>i&&(this.cause.message=`... ${this.cause.message.slice(this.cause.message.length-i)}`),this.details={error:this.error,type:this.type,code:this.code,...this.cause&&{cause:this.cause}},process?.env?.PRISMA_APPSYNC_TESTING!==\"true\"&&G(t,this.details,\"ERROR\")}};function sa(e){return e instanceof N?e:new N(e.message,{type:\"INTERNAL_SERVER_ERROR\",cause:e})}n(sa,\"parseError\");function G(e,t,r){Ft(r||\"INFO\")&&(_u(e,r||\"INFO\"),t&&console.log((0,ia.inspect)(t,{compact:!1,depth:5,breakLength:80,maxStringLength:800,...!process.env.LAMBDA_TASK_ROOT&&{colors:!0}})))}n(G,\"log\");function _u(e,t){let s=[`\\u25ED ${new Date().toLocaleString(void 0,{day:\"numeric\",month:\"numeric\",year:\"numeric\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\"})} <<${t}>>`,e].join(\" \");t===\"ERROR\"&&Ft(t)?console.error(`\\x1B[31m${s}`):t===\"WARN\"&&Ft(t)?console.warn(`\\x1B[33m${s}`):t===\"INFO\"&&Ft(t)&&console.info(`\\x1B[36m${s}`)}n(_u,\"printLog\");function Ft(e){if(process?.env?.PRISMA_APPSYNC_TESTING===\"true\")return!1;let t=String(process.env.PRISMA_APPSYNC_LOG_LEVEL);return t===\"ERROR\"&&e===\"ERROR\"||t===\"WARN\"&&[\"WARN\",\"ERROR\"].includes(e)||t===\"INFO\"}n(Ft,\"canPrintLog\");var ke=Ie(require(\"assert\"),1);var Je=typeof performance==\"object\"&&performance&&typeof performance.now==\"function\"?performance:Date,aa=new Set,Yr=typeof process==\"object\"&&process?process:{},oa=n((e,t,r,i)=>{typeof Yr.emitWarning==\"function\"?Yr.emitWarning(e,t,r,i):console.error(`[${r}] ${t}: ${e}`)},\"emitWarning\"),$t=globalThis.AbortController,na=globalThis.AbortSignal;if(typeof $t>\"u\"){na=class{static{n(this,\"AbortSignal\")}onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},$t=class{static{n(this,\"AbortController\")}constructor(){t()}signal=new na;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let e=Yr.env?.LRU_CACHE_IGNORE_AC_WARNING!==\"1\",t=n(()=>{e&&(e=!1,oa(\"AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.\",\"NO_ABORT_CONTROLLER\",\"ENOTSUP\",t))},\"warnACPolyfill\")}var Ou=n(e=>!aa.has(e),\"shouldWarn\"),yg=Symbol(\"type\"),ye=n(e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),\"isPosInt\"),la=n(e=>ye(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?qe:null:null,\"getUintArray\"),qe=class extends Array{static{n(this,\"ZeroArray\")}constructor(t){super(t),this.fill(0)}},Xr=class e{static{n(this,\"Stack\")}heap;length;static#l=!1;static create(t){let r=la(t);if(!r)return[];e.#l=!0;let i=new e(t,r);return e.#l=!1,i}constructor(t,r){if(!e.#l)throw new TypeError(\"instantiate Stack using Stack.create(n)\");this.heap=new r(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},Bt=class e{static{n(this,\"LRUCache\")}#l;#p;#b;#h;#O;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#i;#g;#s;#r;#e;#c;#f;#o;#n;#m;#a;#v;#R;#y;#A;#S;#u;static unsafeExposeInternals(t){return{starts:t.#R,ttls:t.#y,sizes:t.#v,keyMap:t.#s,keyList:t.#r,valList:t.#e,next:t.#c,prev:t.#f,get head(){return t.#o},get tail(){return t.#n},free:t.#m,isBackgroundFetch:r=>t.#t(r),backgroundFetch:(r,i,s,a)=>t.#N(r,i,s,a),moveToTail:r=>t.#_(r),indexes:r=>t.#E(r),rindexes:r=>t.#x(r),isStale:r=>t.#d(r)}}get max(){return this.#l}get maxSize(){return this.#p}get calculatedSize(){return this.#g}get size(){return this.#i}get fetchMethod(){return this.#O}get dispose(){return this.#b}get disposeAfter(){return this.#h}constructor(t){let{max:r=0,ttl:i,ttlResolution:s=1,ttlAutopurge:a,updateAgeOnGet:o,updateAgeOnHas:l,allowStale:c,dispose:u,disposeAfter:p,noDisposeOnSet:d,noUpdateTTL:f,maxSize:E=0,maxEntrySize:b=0,sizeCalculation:y,fetchMethod:x,noDeleteOnFetchRejection:R,noDeleteOnStaleGet:T,allowStaleOnFetchRejection:w,allowStaleOnFetchAbort:q,ignoreFetchAbort:k}=t;if(r!==0&&!ye(r))throw new TypeError(\"max option must be a nonnegative integer\");let V=r?la(r):Array;if(!V)throw new Error(\"invalid max value: \"+r);if(this.#l=r,this.#p=E,this.maxEntrySize=b||this.#p,this.sizeCalculation=y,this.sizeCalculation){if(!this.#p&&!this.maxEntrySize)throw new TypeError(\"cannot set sizeCalculation without setting maxSize or maxEntrySize\");if(typeof this.sizeCalculation!=\"function\")throw new TypeError(\"sizeCalculation set to non-function\")}if(x!==void 0&&typeof x!=\"function\")throw new TypeError(\"fetchMethod must be a function if specified\");if(this.#O=x,this.#S=!!x,this.#s=new Map,this.#r=new Array(r).fill(void 0),this.#e=new Array(r).fill(void 0),this.#c=new V(r),this.#f=new V(r),this.#o=0,this.#n=0,this.#m=Xr.create(r),this.#i=0,this.#g=0,typeof u==\"function\"&&(this.#b=u),typeof p==\"function\"?(this.#h=p,this.#a=[]):(this.#h=void 0,this.#a=void 0),this.#A=!!this.#b,this.#u=!!this.#h,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!f,this.noDeleteOnFetchRejection=!!R,this.allowStaleOnFetchRejection=!!w,this.allowStaleOnFetchAbort=!!q,this.ignoreFetchAbort=!!k,this.maxEntrySize!==0){if(this.#p!==0&&!ye(this.#p))throw new TypeError(\"maxSize must be a positive integer if specified\");if(!ye(this.maxEntrySize))throw new TypeError(\"maxEntrySize must be a positive integer if specified\");this.#M()}if(this.allowStale=!!c,this.noDeleteOnStaleGet=!!T,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!l,this.ttlResolution=ye(s)||s===0?s:1,this.ttlAutopurge=!!a,this.ttl=i||0,this.ttl){if(!ye(this.ttl))throw new TypeError(\"ttl must be a positive integer if specified\");this.#q()}if(this.#l===0&&this.ttl===0&&this.#p===0)throw new TypeError(\"At least one of max, maxSize, or ttl is required\");if(!this.ttlAutopurge&&!this.#l&&!this.#p){let D=\"LRU_CACHE_UNBOUNDED\";Ou(D)&&(aa.add(D),oa(\"TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.\",\"UnboundedCacheWarning\",D,e))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#q(){let t=new qe(this.#l),r=new qe(this.#l);this.#y=t,this.#R=r,this.#k=(a,o,l=Je.now())=>{if(r[a]=o!==0?l:0,t[a]=o,o!==0&&this.ttlAutopurge){let c=setTimeout(()=>{this.#d(a)&&this.delete(this.#r[a])},o+1);c.unref&&c.unref()}},this.#T=a=>{r[a]=t[a]!==0?Je.now():0},this.#w=(a,o)=>{if(t[o]){let l=t[o],c=r[o];a.ttl=l,a.start=c,a.now=i||s();let u=a.now-c;a.remainingTTL=l-u}};let i=0,s=n(()=>{let a=Je.now();if(this.ttlResolution>0){i=a;let o=setTimeout(()=>i=0,this.ttlResolution);o.unref&&o.unref()}return a},\"getNow\");this.getRemainingTTL=a=>{let o=this.#s.get(a);if(o===void 0)return 0;let l=t[o],c=r[o];if(l===0||c===0)return 1/0;let u=(i||s())-c;return l-u},this.#d=a=>t[a]!==0&&r[a]!==0&&(i||s())-r[a]>t[a]}#T=()=>{};#w=()=>{};#k=()=>{};#d=()=>!1;#M(){let t=new qe(this.#l);this.#g=0,this.#v=t,this.#C=r=>{this.#g-=t[r],t[r]=0},this.#D=(r,i,s,a)=>{if(this.#t(i))return 0;if(!ye(s))if(a){if(typeof a!=\"function\")throw new TypeError(\"sizeCalculation must be a function\");if(s=a(i,r),!ye(s))throw new TypeError(\"sizeCalculation return invalid (expect positive integer)\")}else throw new TypeError(\"invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.\");return s},this.#P=(r,i,s)=>{if(t[r]=i,this.#p){let a=this.#p-t[r];for(;this.#g>a;)this.#L(!0)}this.#g+=t[r],s&&(s.entrySize=i,s.totalCalculatedSize=this.#g)}}#C=t=>{};#P=(t,r,i)=>{};#D=(t,r,i,s)=>{if(i||s)throw new TypeError(\"cannot set size without setting maxSize or maxEntrySize on cache\");return 0};*#E({allowStale:t=this.allowStale}={}){if(this.#i)for(let r=this.#n;!(!this.#I(r)||((t||!this.#d(r))&&(yield r),r===this.#o));)r=this.#f[r]}*#x({allowStale:t=this.allowStale}={}){if(this.#i)for(let r=this.#o;!(!this.#I(r)||((t||!this.#d(r))&&(yield r),r===this.#n));)r=this.#c[r]}#I(t){return t!==void 0&&this.#s.get(this.#r[t])===t}*entries(){for(let t of this.#E())this.#e[t]!==void 0&&this.#r[t]!==void 0&&!this.#t(this.#e[t])&&(yield[this.#r[t],this.#e[t]])}*rentries(){for(let t of this.#x())this.#e[t]!==void 0&&this.#r[t]!==void 0&&!this.#t(this.#e[t])&&(yield[this.#r[t],this.#e[t]])}*keys(){for(let t of this.#E()){let r=this.#r[t];r!==void 0&&!this.#t(this.#e[t])&&(yield r)}}*rkeys(){for(let t of this.#x()){let r=this.#r[t];r!==void 0&&!this.#t(this.#e[t])&&(yield r)}}*values(){for(let t of this.#E())this.#e[t]!==void 0&&!this.#t(this.#e[t])&&(yield this.#e[t])}*rvalues(){for(let t of this.#x())this.#e[t]!==void 0&&!this.#t(this.#e[t])&&(yield this.#e[t])}[Symbol.iterator](){return this.entries()}find(t,r={}){for(let i of this.#E()){let s=this.#e[i],a=this.#t(s)?s.__staleWhileFetching:s;if(a!==void 0&&t(a,this.#r[i],this))return this.get(this.#r[i],r)}}forEach(t,r=this){for(let i of this.#E()){let s=this.#e[i],a=this.#t(s)?s.__staleWhileFetching:s;a!==void 0&&t.call(r,a,this.#r[i],this)}}rforEach(t,r=this){for(let i of this.#x()){let s=this.#e[i],a=this.#t(s)?s.__staleWhileFetching:s;a!==void 0&&t.call(r,a,this.#r[i],this)}}purgeStale(){let t=!1;for(let r of this.#x({allowStale:!0}))this.#d(r)&&(this.delete(this.#r[r]),t=!0);return t}dump(){let t=[];for(let r of this.#E({allowStale:!0})){let i=this.#r[r],s=this.#e[r],a=this.#t(s)?s.__staleWhileFetching:s;if(a===void 0||i===void 0)continue;let o={value:a};if(this.#y&&this.#R){o.ttl=this.#y[r];let l=Je.now()-this.#R[r];o.start=Math.floor(Date.now()-l)}this.#v&&(o.size=this.#v[r]),t.unshift([i,o])}return t}load(t){this.clear();for(let[r,i]of t){if(i.start){let s=Date.now()-i.start;i.start=Je.now()-s}this.set(r,i.value,i)}}set(t,r,i={}){if(r===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:a,noDisposeOnSet:o=this.noDisposeOnSet,sizeCalculation:l=this.sizeCalculation,status:c}=i,{noUpdateTTL:u=this.noUpdateTTL}=i,p=this.#D(t,r,i.size||0,l);if(this.maxEntrySize&&p>this.maxEntrySize)return c&&(c.set=\"miss\",c.maxEntrySizeExceeded=!0),this.delete(t),this;let d=this.#i===0?void 0:this.#s.get(t);if(d===void 0)d=this.#i===0?this.#n:this.#m.length!==0?this.#m.pop():this.#i===this.#l?this.#L(!1):this.#i,this.#r[d]=t,this.#e[d]=r,this.#s.set(t,d),this.#c[this.#n]=d,this.#f[d]=this.#n,this.#n=d,this.#i++,this.#P(d,p,c),c&&(c.set=\"add\"),u=!1;else{this.#_(d);let f=this.#e[d];if(r!==f){if(this.#S&&this.#t(f)?f.__abortController.abort(new Error(\"replaced\")):o||(this.#A&&this.#b?.(f,t,\"set\"),this.#u&&this.#a?.push([f,t,\"set\"])),this.#C(d),this.#P(d,p,c),this.#e[d]=r,c){c.set=\"replace\";let E=f&&this.#t(f)?f.__staleWhileFetching:f;E!==void 0&&(c.oldValue=E)}}else c&&(c.set=\"update\")}if(s!==0&&!this.#y&&this.#q(),this.#y&&(u||this.#k(d,s,a),c&&this.#w(c,d)),!o&&this.#u&&this.#a){let f=this.#a,E;for(;E=f?.shift();)this.#h?.(...E)}return this}pop(){try{for(;this.#i;){let t=this.#e[this.#o];if(this.#L(!0),this.#t(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#u&&this.#a){let t=this.#a,r;for(;r=t?.shift();)this.#h?.(...r)}}}#L(t){let r=this.#o,i=this.#r[r],s=this.#e[r];return this.#S&&this.#t(s)?s.__abortController.abort(new Error(\"evicted\")):(this.#A||this.#u)&&(this.#A&&this.#b?.(s,i,\"evict\"),this.#u&&this.#a?.push([s,i,\"evict\"])),this.#C(r),t&&(this.#r[r]=void 0,this.#e[r]=void 0,this.#m.push(r)),this.#i===1?(this.#o=this.#n=0,this.#m.length=0):this.#o=this.#c[r],this.#s.delete(i),this.#i--,r}has(t,r={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=r,a=this.#s.get(t);if(a!==void 0){let o=this.#e[a];if(this.#t(o)&&o.__staleWhileFetching===void 0)return!1;if(this.#d(a))s&&(s.has=\"stale\",this.#w(s,a));else return i&&this.#T(a),s&&(s.has=\"hit\",this.#w(s,a)),!0}else s&&(s.has=\"miss\");return!1}peek(t,r={}){let{allowStale:i=this.allowStale}=r,s=this.#s.get(t);if(s!==void 0&&(i||!this.#d(s))){let a=this.#e[s];return this.#t(a)?a.__staleWhileFetching:a}}#N(t,r,i,s){let a=r===void 0?void 0:this.#e[r];if(this.#t(a))return a;let o=new $t,{signal:l}=i;l?.addEventListener(\"abort\",()=>o.abort(l.reason),{signal:o.signal});let c={signal:o.signal,options:i,context:s},u=n((y,x=!1)=>{let{aborted:R}=o.signal,T=i.ignoreFetchAbort&&y!==void 0;if(i.status&&(R&&!x?(i.status.fetchAborted=!0,i.status.fetchError=o.signal.reason,T&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),R&&!T&&!x)return d(o.signal.reason);let w=E;return this.#e[r]===E&&(y===void 0?w.__staleWhileFetching?this.#e[r]=w.__staleWhileFetching:this.delete(t):(i.status&&(i.status.fetchUpdated=!0),this.set(t,y,c.options))),y},\"cb\"),p=n(y=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=y),d(y)),\"eb\"),d=n(y=>{let{aborted:x}=o.signal,R=x&&i.allowStaleOnFetchAbort,T=R||i.allowStaleOnFetchRejection,w=T||i.noDeleteOnFetchRejection,q=E;if(this.#e[r]===E&&(!w||q.__staleWhileFetching===void 0?this.delete(t):R||(this.#e[r]=q.__staleWhileFetching)),T)return i.status&&q.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),q.__staleWhileFetching;if(q.__returned===q)throw y},\"fetchFail\"),f=n((y,x)=>{let R=this.#O?.(t,a,c);R&&R instanceof Promise&&R.then(T=>y(T===void 0?void 0:T),x),o.signal.addEventListener(\"abort\",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(y(void 0),i.allowStaleOnFetchAbort&&(y=n(T=>u(T,!0),\"res\")))})},\"pcall\");i.status&&(i.status.fetchDispatched=!0);let E=new Promise(f).then(u,p),b=Object.assign(E,{__abortController:o,__staleWhileFetching:a,__returned:void 0});return r===void 0?(this.set(t,b,{...c.options,status:void 0}),r=this.#s.get(t)):this.#e[r]=b,b}#t(t){if(!this.#S)return!1;let r=t;return!!r&&r instanceof Promise&&r.hasOwnProperty(\"__staleWhileFetching\")&&r.__abortController instanceof $t}async fetch(t,r={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:a=this.noDeleteOnStaleGet,ttl:o=this.ttl,noDisposeOnSet:l=this.noDisposeOnSet,size:c=0,sizeCalculation:u=this.sizeCalculation,noUpdateTTL:p=this.noUpdateTTL,noDeleteOnFetchRejection:d=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:f=this.allowStaleOnFetchRejection,ignoreFetchAbort:E=this.ignoreFetchAbort,allowStaleOnFetchAbort:b=this.allowStaleOnFetchAbort,context:y,forceRefresh:x=!1,status:R,signal:T}=r;if(!this.#S)return R&&(R.fetch=\"get\"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:a,status:R});let w={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:a,ttl:o,noDisposeOnSet:l,size:c,sizeCalculation:u,noUpdateTTL:p,noDeleteOnFetchRejection:d,allowStaleOnFetchRejection:f,allowStaleOnFetchAbort:b,ignoreFetchAbort:E,status:R,signal:T},q=this.#s.get(t);if(q===void 0){R&&(R.fetch=\"miss\");let k=this.#N(t,q,w,y);return k.__returned=k}else{let k=this.#e[q];if(this.#t(k)){let I=i&&k.__staleWhileFetching!==void 0;return R&&(R.fetch=\"inflight\",I&&(R.returnedStale=!0)),I?k.__staleWhileFetching:k.__returned=k}let V=this.#d(q);if(!x&&!V)return R&&(R.fetch=\"hit\"),this.#_(q),s&&this.#T(q),R&&this.#w(R,q),k;let D=this.#N(t,q,w,y),_=D.__staleWhileFetching!==void 0&&i;return R&&(R.fetch=V?\"stale\":\"refresh\",_&&V&&(R.returnedStale=!0)),_?D.__staleWhileFetching:D.__returned=D}}get(t,r={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:a=this.noDeleteOnStaleGet,status:o}=r,l=this.#s.get(t);if(l!==void 0){let c=this.#e[l],u=this.#t(c);return o&&this.#w(o,l),this.#d(l)?(o&&(o.get=\"stale\"),u?(o&&i&&c.__staleWhileFetching!==void 0&&(o.returnedStale=!0),i?c.__staleWhileFetching:void 0):(a||this.delete(t),o&&i&&(o.returnedStale=!0),i?c:void 0)):(o&&(o.get=\"hit\"),u?c.__staleWhileFetching:(this.#_(l),s&&this.#T(l),c))}else o&&(o.get=\"miss\")}#H(t,r){this.#f[r]=t,this.#c[t]=r}#_(t){t!==this.#n&&(t===this.#o?this.#o=this.#c[t]:this.#H(this.#f[t],this.#c[t]),this.#H(this.#n,t),this.#n=t)}delete(t){let r=!1;if(this.#i!==0){let i=this.#s.get(t);if(i!==void 0)if(r=!0,this.#i===1)this.clear();else{this.#C(i);let s=this.#e[i];this.#t(s)?s.__abortController.abort(new Error(\"deleted\")):(this.#A||this.#u)&&(this.#A&&this.#b?.(s,t,\"delete\"),this.#u&&this.#a?.push([s,t,\"delete\"])),this.#s.delete(t),this.#r[i]=void 0,this.#e[i]=void 0,i===this.#n?this.#n=this.#f[i]:i===this.#o?this.#o=this.#c[i]:(this.#c[this.#f[i]]=this.#c[i],this.#f[this.#c[i]]=this.#f[i]),this.#i--,this.#m.push(i)}}if(this.#u&&this.#a?.length){let i=this.#a,s;for(;s=i?.shift();)this.#h?.(...s)}return r}clear(){for(let t of this.#x({allowStale:!0})){let r=this.#e[t];if(this.#t(r))r.__abortController.abort(new Error(\"deleted\"));else{let i=this.#r[t];this.#A&&this.#b?.(r,i,\"delete\"),this.#u&&this.#a?.push([r,i,\"delete\"])}}if(this.#s.clear(),this.#e.fill(void 0),this.#r.fill(void 0),this.#y&&this.#R&&(this.#y.fill(0),this.#R.fill(0)),this.#v&&this.#v.fill(0),this.#o=0,this.#n=0,this.#m.length=0,this.#g=0,this.#i=0,this.#u&&this.#a){let t=this.#a,r;for(;r=t?.shift();)this.#h?.(...r)}}};var et=class extends Bt{static{n(this,\"LRUe\")}constructor({cacheNull:t=!0,...r}){super(r),(0,ke.default)(!(\"maxAge\"in r),'Please use \"ttl\" instead of \"maxAge\"'),(0,ke.default)(\"max\"in r,'Please add a \"max\" value'),this.cacheNull=t}async memoize(t,r){(0,ke.default)(typeof r==\"function\"),this.has(t)||this.set(t,r());try{let i=await this.peek(t);return i===null&&this.cacheNull!==!0&&this.delete(t),i}catch(i){throw this.delete(t),i}}memoizeSync(t,r){if((0,ke.default)(typeof r==\"function\"),!this.has(t)){let s=r();(0,ke.default)(!(s instanceof Promise),\"Use memoize() instead\"),this.set(t,s)}let i=this.peek(t);return i===null&&this.cacheNull!==!0&&this.delete(t),i}};var ca=n(e=>{let t=new et({max:parseInt(e.uniqueTokenPerInterval||500,10),ttl:parseInt(e.interval||6e4,10)});return{check:(r,i)=>new Promise((s,a)=>{let o=t.get(i)||[0];o[0]===0&&t.set(i,o),o[0]+=1,(o[0]<=parseInt(r,10)?s:a)(o[0])})}},\"default\");var Pu=ca({interval:60*1e3,uniqueTokenPerInterval:1e3});async function ua(e){return await we(e,async({key:t,value:r},i)=>(typeof t==\"string\"&&t===Ze&&i.ignoreChilds(),typeof r==\"string\"&&(r=qt(kt(r))),{key:t,value:r}))}n(ua,\"sanitize\");async function pa(e){return await we(e,async({key:t,value:r},i)=>(typeof t==\"string\"&&t===Ze&&i.ignoreChilds(),typeof r==\"string\"&&(r=Nt(r)),{key:t,value:r}))}n(pa,\"clarify\");async function Lu({shield:e,shieldRule:t,globPattern:r,matcher:i,context:s}){let a={canAccess:!0,reason:\"\",prismaFilter:{},matcher:\"\",globPattern:\"\"};if(typeof t==\"boolean\")a.canAccess=e[i];else{if(typeof t.rule>\"u\")throw new Error(\"Badly formed shield rule.\");if(typeof t.rule==\"boolean\")a.canAccess=t.rule;else if(typeof t.rule==\"function\"){let c=t.rule(s);if(c instanceof Promise)a.canAccess=await c;else if(typeof c==\"boolean\")a.canAccess=c;else throw new Error(\"Shield rule must return a boolean.\")}else a.canAccess=!0,a.prismaFilter||(a.prismaFilter={}),a.prismaFilter=pe(a.prismaFilter,t.rule)}a.matcher=i,a.globPattern=r;let o=typeof t!=\"boolean\"&&typeof t.reason<\"u\",l=`Matcher: ${a.matcher}`;return o&&typeof t.reason==\"function\"?l=t.reason({action:s.action,model:s.model?.singular||s.action}):o&&typeof t.reason==\"string\"&&(l=t.reason),a.reason=l,a}n(Lu,\"getFieldAuthorization\");async function fa({shield:e,paths:t,context:r}){let i={canAccess:!0,reason:\"\",prismaFilter:{},matcher:\"\",globPattern:\"\"};for(let s in e){let a=[],o=s;for(let c=t.length-1;c>=0;c--){let u=t[c];if(We(u,o)){let p=e[s];a.push(Lu({shield:e,shieldRule:p,globPattern:o,matcher:s,context:r}))}}let l=await Promise.allSettled(a);for(let c=0;c<l.length;c++){let u=l[c];if(u.status===\"rejected\")throw new N(u.reason,{type:\"INTERNAL_SERVER_ERROR\"});if(i=u.value,!u.value.canAccess)break}}return i}n(fa,\"getShieldAuthorization\");function da({paths:e,context:t,fieldsMapping:r}){let i=0,s=[];if(!W(r))for(let a in r)r[a].type.toLowerCase()===\"json\"&&s.push(String(a));return e.forEach(a=>{let o=s.find(p=>a.includes(p)),l=o?o.split(\"/\").length-1:void 0,u=a.split(\"/\").filter(Boolean).slice(1,l?l+1:void 0).length;u>i&&(i=u)}),t.model===null&&(i+=1),i}n(da,\"getDepth\");async function Zr({when:e,hooks:t,prismaClient:r,QueryParams:i,result:s}){let a=Object.keys(t).filter(l=>{let c=l.split(\":\"),u=c[0],p=c[1],d=i.operation;return u===e&&We(d,p)}),o=e===\"after\"?{...i,result:s}:i;if(a.length>0)for(let l=0;l<a.length;l++){let c=a[l];Object.prototype.hasOwnProperty.call(t,c)&&(o=await t[c]({...i,...typeof s<\"u\"&&e===\"after\"&&{result:s},prismaClient:r}))}return o}n(Zr,\"runHooks\");async function ha({callerUuid:e,maxReqPerMinute:t}){let r=!1,i=-1;try{i=await Pu.check(t,e)}catch{r=!0,i=t}return{limitExceeded:r,count:i}}n(ha,\"preventDOS\");async function ma(e,t,r){if(W(e?.info?.fieldName)||Ye(e?.info?.selectionSetList)||W(e?.info?.parentTypeName)||Ye(e?.arguments))throw new N(\"Error reading required parameters from appsyncEvent.\",{type:\"INTERNAL_SERVER_ERROR\"});let i=ku({fieldName:e.info.fieldName}),s=qu({customResolvers:r,options:t,operation:i}),{identity:a,authorization:o}=Nu({appsyncEvent:e}),l=Mu({_selectionSetList:e.info.selectionSetList}),c=t.sanitize?await ua(await ga(e.arguments)):await ga(e.arguments),u=Re(c),p=Fu({action:s.action,defaultPagination:t.defaultPagination,_arguments:Re(c),_selectionSetList:e.info.selectionSetList}),d=Uu({_parentTypeName:e.info.parentTypeName}),f=Gu({operation:i,context:s,prismaArgs:p}),E=e?.request?.headers||{};return{operation:i,context:s,fields:l,args:u,prismaArgs:p,type:d,authorization:o,identity:a,paths:f,headers:E}}n(ma,\"parseEvent\");async function ga(e){return await we(e,async({key:t,value:r},i)=>{if(t===\"is\"||t===\"isNot\")r=r===\"NULL\"?null:void 0,i.ignoreChilds();else if(r&&ve(r)&&Object.keys(r).includes(\"isNull\")){let{isNull:s,...a}=r;s===!0?r={...a,equals:null}:r={...a,not:null},i.ignoreChilds()}return{key:t,value:r}})}n(ga,\"addNullables\");function Nu({appsyncEvent:e}){let t=null,r=null;if(W(e?.identity))t=\"API_KEY\",r={...e?.request?.headers&&typeof e.request.headers[\"x-api-key\"]<\"u\"&&{requestApiKey:e.request.headers[\"x-api-key\"]},...e?.request?.headers&&typeof e.request.headers[\"user-agent\"]<\"u\"&&{requestUserAgent:e.request.headers[\"user-agent\"]}};else if(e?.identity&&typeof e.identity.resolverContext<\"u\")t=\"AWS_LAMBDA\",r=e.identity;else if(e?.identity&&typeof e.identity.cognitoIdentityAuthType<\"u\"&&typeof e.identity.cognitoIdentityAuthProvider<\"u\"&&typeof e.identity.cognitoIdentityPoolId<\"u\"&&typeof e.identity.cognitoIdentityId<\"u\")t=\"AWS_IAM\",r=e.identity;else if(e?.identity&&typeof e.identity.sub<\"u\"&&typeof e.identity.issuer<\"u\"&&typeof e.identity.username<\"u\"&&typeof e.identity.claims<\"u\"&&typeof e.identity.sourceIp<\"u\")t=\"AMAZON_COGNITO_USER_POOLS\",r=e.identity;else if(e?.identity&&typeof e.identity.sub<\"u\"&&typeof e.identity.issuer<\"u\"&&typeof e.identity.claims<\"u\")t=\"OPENID_CONNECT\",r=e.identity;else throw new N(\"Couldn't detect caller identity.\",{type:\"INTERNAL_SERVER_ERROR\"});return{authorization:t,identity:r}}n(Nu,\"getAuthIdentity\");function qu({customResolvers:e,operation:t,options:r}){let i={action:\"\",alias:null,model:null};return e&&typeof e[t]<\"u\"?(i.action=t,i.alias=\"custom\",i.model=null):(i.action=Du({operation:t}),i.model=Hu({operation:t,action:i.action,options:r}),i.alias=Iu({action:i.action})),i}n(qu,\"getContext\");function ku({fieldName:e}){let t=e;if(!(t.length>0))throw new N(\"Error parsing 'operation' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});return t}n(ku,\"getOperation\");function Du({operation:e}){let r=Object.keys(Kr).sort().reverse().find(i=>e.toLowerCase().startsWith(String(i).toLowerCase()));if(!(typeof r<\"u\"&&String(r).length>0))throw new N(\"Error parsing 'action' from input event. If you are trying to query a custom resolver, make sure it is properly declared inside 'prismaAppSync.resolve({ event, resolvers: { /* HERE */ } })'.\",{type:\"INTERNAL_SERVER_ERROR\"});return r}n(Du,\"getAction\");function Iu({action:e}){let t=null;for(let r in Ne)if(Ne[r].includes(e)){t=r;break}if(!(typeof e<\"u\"&&String(e).length>0))throw new N(\"Error parsing 'actionAlias' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});return t}n(Iu,\"getActionAlias\");function Hu({operation:e,action:t,options:r}){let i=e.replace(String(t),\"\");if(!(i.length>0))throw new N(\"Error parsing 'model' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});let s=r?.modelsMapping?.[i];if(!s)throw new N(`Resolver \"${i}\" not found. If it's a custom resolver, please ensure it's available within your Lambda function.`,{type:\"INTERNAL_SERVER_ERROR\"});return s}n(Hu,\"getModel\");function Mu({_selectionSetList:e}){let t=[];return e.forEach(r=>{let i=r.split(\"/\")[0];!t.includes(i)&&!i.startsWith(\"__\")&&t.push(r)}),t}n(Mu,\"getFields\");function Uu({_parentTypeName:e}){let t=e;if(![\"Query\",\"Mutation\",\"Subscription\"].includes(t))throw new N(\"Error parsing 'type' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});return t}n(Uu,\"getType\");function Fu({action:e,defaultPagination:t,_arguments:r,_selectionSetList:i}){let s={};if(typeof r.data<\"u\"&&typeof r.operation<\"u\")throw new N(\"Using 'data' and 'operation' together is not possible.\",{type:\"BAD_USER_INPUT\"});return typeof r.data<\"u\"?s.data=r.data:typeof r.operation<\"u\"&&(s.data=r.operation),typeof r.create<\"u\"&&(s.create=r.create),typeof r.update<\"u\"&&(s.update=r.update),typeof r.where<\"u\"&&(s.where=r.where),typeof r.orderBy<\"u\"&&(s.orderBy=$u(r.orderBy)),typeof r.skipDuplicates<\"u\"&&(s.skipDuplicates=r.skipDuplicates),typeof i<\"u\"&&(s.select=zu(i)),W(s.select)&&delete s.select,typeof r.skip<\"u\"?s.skip=Number.parseInt(r.skip):t!==!1&&e===\"list\"&&(s.skip=0),typeof r.take<\"u\"?s.take=Number.parseInt(r.take):t!==!1&&e===\"list\"&&(s.take=t),s}n(Fu,\"getPrismaArgs\");function ya(e){if(Object.keys(e).length>1)throw new N(\"Wrong 'orderBy' input format.\",{type:\"BAD_USER_INPUT\"});let t=Object.keys(e)[0],r=typeof e[t]==\"object\"?ya(e[t]):e[t].toLowerCase();return{[t]:r}}n(ya,\"getOrderBy\");function $u(e){let t=[];return(Array.isArray(e)?e:[e]).forEach(i=>{t.push(ya(i))}),t}n($u,\"parseOrderBy\");function Bu(e){let t=e[0],r=e.length>1?Jr(e.splice(1)):!0;return{include:{[t]:r}}}n(Bu,\"getInclude\");function Jr(e){let t=e[0],r=e.length>1?Jr(e.splice(1)):!0;return{select:{[t]:r}}}n(Jr,\"getSelect\");function zu(e){let t={select:{}};for(let r=0;r<e.length;r++){let s=e[r].split(\"/\");s.includes(\"__typename\")||(s.length>1?t=pe(t,Bu(s)):t=pe(t,Jr(s)))}if(t.include){for(let r in t.include)typeof t.select[r]<\"u\"&&delete t.select[r];t.select=pe(t.select,t.include),delete t.include}return typeof t.select<\"u\"?t.select:{}}n(zu,\"parseSelectionList\");function Gu({operation:e,context:t,prismaArgs:r}){let i=[e,...Qn({...r?.data&&{data:r.data},...r?.select&&{select:r.select}})];return i.forEach((s,a)=>{if(s.startsWith(\"data\"))i[a]=s.replace(\"data\",e);else if(s.startsWith(\"select\")){let o=Ut.includes(t.action)?\"list\":\"get\";if(t.model!==null){let l=o===\"list\"?t.model.plural:t.model.singular;i[a]=s.replace(\"select\",`${Dt(o)}${l}`)}else i[a]=s.replace(\"select\",e)}}),Xe(i.map(s=>s.split(\"/\").filter(a=>!ra.includes(a)).join(\"/\")).filter(Boolean))}n(Gu,\"getPaths\");var ei={};ti(ei,{countQuery:()=>Qu,createManyQuery:()=>Wu,createQuery:()=>Ku,deleteManyQuery:()=>ep,deleteQuery:()=>Ju,getQuery:()=>Vu,listQuery:()=>ju,prismaQueryJoin:()=>ee,queryBuilder:()=>te,updateManyQuery:()=>Xu,updateQuery:()=>Yu,upsertQuery:()=>Zu});function ee(e,t){let r={};return t.forEach(i=>{e.forEach(s=>{s?.[i]&&(i===\"where\"?r.where?.AND?r.where.AND.push(s.where):r.where?r.where={...r.where,AND:[s.where]}:r.where=s.where:r?.[i]?r[i]=pe(r[i],s[i]):r[i]=s[i])})}),r}n(ee,\"prismaQueryJoin\");var te={prismaGet:(...e)=>ee(e,[\"where\",\"select\"]),prismaList:(...e)=>ee(e,[\"where\",\"orderBy\",\"select\",\"skip\",\"take\"]),prismaCount:(...e)=>ee(e,[\"where\",\"orderBy\",\"select\",\"skip\",\"take\"]),prismaCreate:(...e)=>ee(e,[\"data\",\"select\"]),prismaCreateMany:(...e)=>ee(e,[\"data\",\"skipDuplicates\"]),prismaUpdate:(...e)=>ee(e,[\"data\",\"where\",\"select\"]),prismaUpdateMany:(...e)=>ee(e,[\"data\",\"where\"]),prismaUpsert:(...e)=>ee(e,[\"where\",\"create\",\"update\",\"select\"]),prismaDelete:(...e)=>ee(e,[\"where\",\"select\"]),prismaDeleteMany:(...e)=>ee(e,[\"where\"])};async function Vu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].findUnique(te.prismaGet(t.prismaArgs))}n(Vu,\"getQuery\");async function ju(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].findMany(te.prismaList(t.prismaArgs))}n(ju,\"listQuery\");async function Qu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].count(te.prismaCount(t.prismaArgs))}n(Qu,\"countQuery\");async function Ku(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].create(te.prismaCreate(t.prismaArgs))}n(Ku,\"createQuery\");async function Wu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].createMany(te.prismaCreateMany(t.prismaArgs))}n(Wu,\"createManyQuery\");async function Yu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].update(te.prismaUpdate(t.prismaArgs))}n(Yu,\"updateQuery\");async function Xu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].updateMany(te.prismaUpdateMany(t.prismaArgs))}n(Xu,\"updateManyQuery\");async function Zu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].upsert(te.prismaUpsert(t.prismaArgs))}n(Zu,\"upsertQuery\");async function Ju(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].delete(te.prismaDelete(t.prismaArgs))}n(Ju,\"deleteQuery\");async function ep(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].deleteMany(te.prismaDeleteMany(t.prismaArgs))}n(ep,\"deleteManyQuery\");var zt={\"modelsMapping\":{\"Users\":{\"prismaRef\":\"user\",\"singular\":\"User\",\"plural\":\"Users\"},\"User\":{\"prismaRef\":\"user\",\"singular\":\"User\",\"plural\":\"Users\"},\"Posts\":{\"prismaRef\":\"post\",\"singular\":\"Post\",\"plural\":\"Posts\"},\"Post\":{\"prismaRef\":\"post\",\"singular\":\"Post\",\"plural\":\"Posts\"},\"Badges\":{\"prismaRef\":\"badge\",\"singular\":\"Badge\",\"plural\":\"Badges\"},\"Badge\":{\"prismaRef\":\"badge\",\"singular\":\"Badge\",\"plural\":\"Badges\"}},\"fieldsMapping\":{\"getUser/id\":{\"type\":\"Int\",\"isRelation\":false},\"listUsers/id\":{\"type\":\"Int\",\"isRelation\":false},\"countUsers/id\":{\"type\":\"Int\",\"isRelation\":false},\"createUser/id\":{\"type\":\"Int\",\"isRelation\":false},\"createManyUsers/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateUser/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyUsers/id\":{\"type\":\"Int\",\"isRelation\":false},\"upsertUser/id\":{\"type\":\"Int\",\"isRelation\":false},\"deleteUser/id\":{\"type\":\"Int\",\"isRelation\":false},\"deleteManyUsers/id\":{\"type\":\"Int\",\"isRelation\":false},\"getUser/email\":{\"type\":\"String\",\"isRelation\":false},\"listUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"countUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"createUser/email\":{\"type\":\"String\",\"isRelation\":false},\"createManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"updateUser/email\":{\"type\":\"String\",\"isRelation\":false},\"updateManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"upsertUser/email\":{\"type\":\"String\",\"isRelation\":false},\"deleteUser/email\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"getUser/password\":{\"type\":\"String\",\"isRelation\":false},\"listUsers/password\":{\"type\":\"String\",\"isRelation\":false},\"countUsers/password\":{\"type\":\"String\",\"isRelation\":false},\"createUser/password\":{\"type\":\"String\",\"isRelation\":false},\"createManyUsers/password\":{\"type\":\"String\",\"isRelation\":false},\"updateUser/password\":{\"type\":\"String\",\"isRelation\":false},\"updateManyUsers/password\":{\"type\":\"String\",\"isRelation\":false},\"upsertUser/password\":{\"type\":\"String\",\"isRelation\":false},\"deleteUser/password\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyUsers/password\":{\"type\":\"String\",\"isRelation\":false},\"getUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"listUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"countUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"createUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"createManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"updateUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"updateManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"upsertUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"deleteUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"deleteManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"getUser/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"listUsers/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"countUsers/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createUser/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createManyUsers/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updateUser/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updateManyUsers/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"upsertUser/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"deleteUser/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"deleteManyUsers/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"getPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"listPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"countPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"createPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"createManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"updatePost/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"upsertPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"getPost/title\":{\"type\":\"String\",\"isRelation\":false},\"listPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"countPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"createPost/title\":{\"type\":\"String\",\"isRelation\":false},\"createManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"updatePost/title\":{\"type\":\"String\",\"isRelation\":false},\"updateManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"upsertPost/title\":{\"type\":\"String\",\"isRelation\":false},\"getPost/source\":{\"type\":\"String\",\"isRelation\":false},\"listPosts/source\":{\"type\":\"String\",\"isRelation\":false},\"countPosts/source\":{\"type\":\"String\",\"isRelation\":false},\"createPost/source\":{\"type\":\"String\",\"isRelation\":false},\"createManyPosts/source\":{\"type\":\"String\",\"isRelation\":false},\"updatePost/source\":{\"type\":\"String\",\"isRelation\":false},\"updateManyPosts/source\":{\"type\":\"String\",\"isRelation\":false},\"upsertPost/source\":{\"type\":\"String\",\"isRelation\":false},\"getPost/author\":{\"type\":\"User\",\"isRelation\":true},\"listPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"countPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"createPost/author\":{\"type\":\"User\",\"isRelation\":true},\"createManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"updatePost/author\":{\"type\":\"User\",\"isRelation\":true},\"updateManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"upsertPost/author\":{\"type\":\"User\",\"isRelation\":true},\"getPost/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"listPosts/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"countPosts/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"createPost/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"createManyPosts/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"updatePost/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyPosts/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"upsertPost/authorId\":{\"type\":\"Int\",\"isRelation\":false},\"getPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"listPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"countPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"createPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"createManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"updatePost/views\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"upsertPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"getPost/status\":{\"type\":\"Status\",\"isRelation\":false},\"listPosts/status\":{\"type\":\"Status\",\"isRelation\":false},\"countPosts/status\":{\"type\":\"Status\",\"isRelation\":false},\"createPost/status\":{\"type\":\"Status\",\"isRelation\":false},\"createManyPosts/status\":{\"type\":\"Status\",\"isRelation\":false},\"updatePost/status\":{\"type\":\"Status\",\"isRelation\":false},\"updateManyPosts/status\":{\"type\":\"Status\",\"isRelation\":false},\"upsertPost/status\":{\"type\":\"Status\",\"isRelation\":false},\"getPost/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"listPosts/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"countPosts/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createPost/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createManyPosts/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updatePost/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updateManyPosts/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"upsertPost/createdAt\":{\"type\":\"DateTime\",\"isRelation\":false}},\"operations\":[\"getUser\",\"listUsers\",\"countUsers\",\"createUser\",\"createManyUsers\",\"updateUser\",\"updateManyUsers\",\"upsertUser\",\"deleteUser\",\"deleteManyUsers\",\"getPost\",\"listPosts\",\"countPosts\",\"createPost\",\"createManyPosts\",\"updatePost\",\"updateManyPosts\",\"upsertPost\"]}\nvar Gt=class{static{n(this,\"PrismaAppSync\")}constructor(t){if(typeof t?.connectionString<\"u\"&&(process.env.DATABASE_URL=t.connectionString),this.options={modelsMapping:{},fieldsMapping:{},connectionString:String(process.env.DATABASE_URL),sanitize:typeof t?.sanitize<\"u\"?t.sanitize:!0,logLevel:typeof t?.logLevel<\"u\"?t.logLevel:\"INFO\",defaultPagination:typeof t?.defaultPagination<\"u\"?t.defaultPagination:50,maxDepth:typeof t?.maxDepth<\"u\"?t.maxDepth:4,maxReqPerUserMinute:typeof t?.maxReqPerUserMinute<\"u\"?t.maxReqPerUserMinute:200},this.options.modelsMapping={},zt?.modelsMapping)this.options.modelsMapping=zt.modelsMapping;else if(process?.env?.PRISMA_APPSYNC_INJECTED_CONFIG)try{this.options.modelsMapping=JSON.parse(process.env.PRISMA_APPSYNC_INJECTED_CONFIG).modelsMapping}catch{}if(zt?.fieldsMapping)this.options.fieldsMapping=zt.fieldsMapping;else if(process?.env?.PRISMA_APPSYNC_INJECTED_CONFIG)try{this.options.fieldsMapping=JSON.parse(process.env.PRISMA_APPSYNC_INJECTED_CONFIG).fieldsMapping}catch{}if(Object.keys(this.options.modelsMapping).length===0)throw new N(\"Issue with auto-injected models mapping config.\",{type:\"INTERNAL_SERVER_ERROR\"});process.env.PRISMA_APPSYNC_LOG_LEVEL=this.options.logLevel;let{fieldsMapping:r,...i}=this.options;G(\"New Prisma-AppSync instance created:\",i);let s=[{emit:\"event\",level:\"query\"},{emit:\"event\",level:\"error\"},{emit:\"event\",level:\"info\"},{emit:\"event\",level:\"warn\"}];process?.env?.PRISMA_APPSYNC_TESTING===\"true\"?(global.prisma||(global.prisma=new ne.PrismaClient({log:s})),this.prismaClient=global.prisma):this.prismaClient=new ne.PrismaClient({log:s}),process?.env?.PRISMA_APPSYNC_TESTING!==\"true\"&&(this.prismaClient.$on(\"query\",a=>G(\"Prisma Client query:\",a,\"INFO\")),this.prismaClient.$on(\"info\",a=>G(\"Prisma Client info:\",a,\"INFO\")),this.prismaClient.$on(\"warn\",a=>G(\"Prisma Client warn:\",a,\"WARN\")),this.prismaClient.$on(\"error\",a=>G(\"Prisma Client error:\",a,\"ERROR\")))}async resolve(t){let r=null;try{G(\"Resolving API request w/ event (truncated):\",{arguments:t.event.arguments,identity:t.event.identity,info:Kn(t.event.info,\"selectionSetGraphQL\")});let s=await ma(t.event,this.options,t.resolvers);G(\"Parsed event:\",s);let a=s.identity?.sourceIp?.[0]||s.identity?.sourceIp||s.identity?.sub||JSON.stringify(s.identity);if(this.options.maxReqPerUserMinute&&a){let{limitExceeded:u,count:p}=await ha({callerUuid:a,maxReqPerMinute:this.options.maxReqPerUserMinute});if(u)throw new N(`Rate limit (maxReqPerUserMinute=${this.options.maxReqPerUserMinute}) exceeded for caller \"${a}\".`,{type:\"TOO_MANY_REQUESTS\"});G(`Rate limit check for caller \"${a}\" returned ${p}/${this.options.maxReqPerUserMinute} (last minute).`)}let o=da({paths:s.paths,context:s.context,fieldsMapping:this.options.fieldsMapping});if(o>this.options.maxDepth)throw new N(`Query has depth of ${o}, which exceeds max depth of ${this.options.maxDepth}.`,{type:\"FORBIDDEN\"});G(`Query has depth of ${o} (max allowed is ${this.options.maxDepth}).`);let l=t?.shield?await t.shield(s):{},c=await fa({shield:l,paths:s.paths,context:s.context});if(Object.keys(l).length===0?G(\"Query shield authorization: No Shield setup detected.\",null,\"WARN\"):G(\"Query shield authorization:\",c),!c.canAccess){let u=typeof c.reason==\"string\"?c.reason:c.reason({action:s.context.action,model:s.context.model?.singular||s.context.action});throw new N(u,{type:\"FORBIDDEN\"})}if(W(c.prismaFilter)||(G(\"QueryParams before adding Shield filters:\",s),s.prismaArgs=ee([s.prismaArgs,{where:c.prismaFilter}],[\"where\",\"data\",\"orderBy\",\"skip\",\"take\",\"skipDuplicates\",\"select\"]),G(\"QueryParams after adding Shield filters:\",s)),W(t?.hooks)||(s=await Zr({when:\"before\",hooks:t.hooks,prismaClient:this.prismaClient,QueryParams:s})),process?.env?.PRISMA_APPSYNC_TESTING===\"true\"){G(\"Resolving query for UNIT TESTS.\");let u=Ut.includes(s?.context?.action),p=n(()=>({...s.fields.reduce((d,f)=>{let E=W(s?.prismaArgs?.data?.[f])?(Math.random()+1).toString(36).substring(7):s.prismaArgs.data[f];return{...d,[f]:String(E)}},{}),[Ze]:{QueryParams:s}}),\"getTestResult\");u?r=[p(),p()]:r=p()}else{if(t?.resolvers&&typeof t.resolvers[s.operation]==\"boolean\"&&t.resolvers[s.operation]===!1)throw new N(`Query resolver for ${s.operation} is disabled.`,{type:\"FORBIDDEN\"});if(typeof t?.resolvers?.[s.operation]==\"function\"){G(`Resolving query for Custom Resolver \"${s.operation}\".`);let u=t.resolvers[s.operation];r=await u({...s,prismaClient:this.prismaClient})}else{if(W(s?.context?.model))throw new N(`Query resolver for ${s.operation} could not be found.`,{type:\"INTERNAL_SERVER_ERROR\"});G(`Resolving query for built-in CRUD operation \"${s.operation}\".`);try{r=await ei[`${s.context.action}Query`](this.prismaClient,s)}catch(u){throw u instanceof ne.Prisma.PrismaClientKnownRequestError?new N(`Prisma Client known request error${u?.code?` (code ${u.code})`:\"\"}. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientknownrequesterror`,{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientUnknownRequestError?new N(\"Prisma Client unknown request error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientunknownrequesterror\",{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientRustPanicError?new N(\"Prisma Client Rust panic error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientrustpanicerror\",{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientInitializationError?new N(`Prisma Client initialization error${u?.errorCode?` (errorCode ${u.errorCode})`:\"\"}. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientinitializationerror`,{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientValidationError?new N(\"Prisma Client validation error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientvalidationerror\",{type:\"INTERNAL_SERVER_ERROR\",cause:u}):new N(u?.message?.split(`\n`)?.pop()||\"Unknown error during query.\",{type:\"INTERNAL_SERVER_ERROR\",cause:u})}}}W(t?.hooks)||(r=(await Zr({when:\"after\",hooks:t.hooks,prismaClient:this.prismaClient,QueryParams:s,result:r})).result)}catch(s){return Promise.reject(sa(s))}let i=this.options.sanitize?await pa(r):r;return G(\"Returning response to API request w/ result:\",i),i}};var tp={merge:pe,clone:Re,decode:Nt,encode:qt,dotate:jn,isMatchingGlob:We,filterXSS:kt,isEmpty:W,isUndefined:Ye,lowerFirst:Dt,isObject:ve,walk:we,replaceAll:Wn};0&&(module.exports={Authorizations,CustomError,PrismaAppSync,_,log,queryBuilder});\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/inspector.d.ts",
    "content": "import type { logLevel } from './types';\ndeclare const errorCodes: {\n    FORBIDDEN: number;\n    BAD_USER_INPUT: number;\n    INTERNAL_SERVER_ERROR: number;\n    TOO_MANY_REQUESTS: number;\n};\nexport type ErrorExtensions = {\n    type: keyof typeof errorCodes;\n    cause?: any;\n};\nexport type ErrorDetails = {\n    error: string;\n    type: ErrorExtensions['type'];\n    code: number;\n    cause?: ErrorExtensions['cause'];\n};\nexport declare class CustomError extends Error {\n    error: ErrorDetails['error'];\n    type: ErrorDetails['type'];\n    code: ErrorDetails['code'];\n    cause: ErrorDetails['cause'];\n    details: ErrorDetails;\n    constructor(message: string, extensions: ErrorExtensions);\n}\nexport declare function parseError(error: Error): CustomError;\nexport declare function log(message: string, obj?: any, level?: logLevel): void;\nexport declare function printLog(message: any, level: logLevel): void;\nexport {};\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/resolver.d.ts",
    "content": "import type { PrismaArgs, PrismaClient, PrismaOperator, QueryBuilder, QueryParams } from './types';\n/**\n *  #### Query Builder\n */\nexport declare function prismaQueryJoin<T>(queries: PrismaArgs[], operators: PrismaOperator[]): T;\nexport declare const queryBuilder: QueryBuilder;\n/**\n *  #### Query :: Find Unique\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findunique\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function getQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Query :: Find Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findmany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function listQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Query :: Count\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#count\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function countQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Create\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#create\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function createQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Create Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#createmany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function createManyQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Update\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#update\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function updateQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Update Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#updatemany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function updateManyQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Upsert\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#upsert\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function upsertQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Delete\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#delete\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function deleteQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Delete Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#deletemany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function deleteManyQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/types.d.ts",
    "content": "import { Prisma, PrismaClient } from '@prisma/client';\nimport type { AppSyncIdentity, AppSyncIdentityCognito, AppSyncIdentityIAM, AppSyncIdentityLambda, AppSyncIdentityOIDC, AppSyncResolverEvent, AppSyncResolverHandler } from 'aws-lambda';\nimport type { Actions, ActionsAliases, Authorizations } from './consts';\nexport type logLevel = 'INFO' | 'WARN' | 'ERROR';\nexport type PrismaAppSyncOptionsType = {\n    connectionString?: string;\n    sanitize?: boolean;\n    logLevel?: logLevel;\n    defaultPagination?: number | false;\n    maxDepth?: number;\n    maxReqPerUserMinute?: number | false;\n};\nexport type Options = Required<PrismaAppSyncOptionsType> & {\n    modelsMapping: any;\n    fieldsMapping: any;\n};\nexport type InjectedConfig = {\n    modelsMapping?: {\n        [modelVariant: string]: {\n            prismaRef: string;\n            singular: string;\n            plural: string;\n        };\n    };\n    fieldsMapping?: {\n        [fieldPath: string]: {\n            type: string;\n            isRelation: boolean;\n        };\n    };\n    operations?: string;\n};\nexport type RuntimeConfig = {\n    modelsMapping: {\n        [modelVariant: string]: {\n            prismaRef: string;\n            singular: string;\n            plural: string;\n        };\n    };\n    fieldsMapping: {\n        [fieldPath: string]: {\n            type: string;\n            isRelation: boolean;\n        };\n    };\n    operations: string[];\n};\nexport type Action = typeof Actions[keyof typeof Actions] | string;\nexport type ActionsAlias = typeof ActionsAliases[keyof typeof ActionsAliases] | 'custom' | null;\nexport type ActionsAliasStr = keyof typeof ActionsAliases;\nexport type Context = {\n    action: Action;\n    alias: ActionsAlias;\n    model: Model;\n};\nexport type Model = {\n    prismaRef: string;\n    singular: string;\n    plural: string;\n} | null;\nexport type { AppSyncResolverHandler, AppSyncResolverEvent, AppSyncIdentity };\n/**\n * ### QueryParams\n *\n * @example\n * ```\n * {\n *     type: 'Query',\n *     operation: 'getPost',\n *     context: { action: 'get', alias: 'access', model: 'Post' },\n *     fields: ['title', 'status'],\n *     paths: ['get/post/title', 'get/post/status'],\n *     args: { where: { id: 5 } },\n *     prismaArgs: {\n *         where: { id: 5 },\n *         select: { title: true, status: true },\n *     },\n *     authorization: 'API_KEY',\n *     identity: { ... },\n * }\n * ```\n */\nexport type QueryParams<T = any> = {\n    type: GraphQLType;\n    operation: string;\n    context: Context;\n    fields: string[];\n    paths: string[];\n    args: T;\n    prismaArgs: PrismaArgs;\n    authorization: Authorization;\n    identity: Identity;\n    headers: any;\n};\nexport type Authorization = typeof Authorizations[keyof typeof Authorizations] | null;\nexport type PrismaGet = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaList = Pick<PrismaArgs, 'where' | 'orderBy' | 'select' | 'skip' | 'take'>;\nexport type PrismaCount = Pick<PrismaArgs, 'where' | 'orderBy' | 'select' | 'skip' | 'take'>;\nexport type PrismaCreate = Pick<Required<PrismaArgs>, 'data'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaCreateMany = Pick<Required<PrismaArgs>, 'data'> & Pick<PrismaArgs, 'skipDuplicates'>;\nexport type PrismaUpdate = Pick<Required<PrismaArgs>, 'data' | 'where'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaUpdateMany = Pick<Required<PrismaArgs>, 'data' | 'where'>;\nexport type PrismaUpsert = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'> & Pick<PrismaArgs, 'update'> & Pick<PrismaArgs, 'create'>;\nexport type PrismaDelete = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaDeleteMany = Pick<Required<PrismaArgs>, 'where'>;\nexport type QueryBuilder = {\n    prismaGet: (...prismaArgs: PrismaArgs[]) => PrismaGet;\n    prismaList: (...prismaArgs: PrismaArgs[]) => PrismaList;\n    prismaCount: (...prismaArgs: PrismaArgs[]) => PrismaCount;\n    prismaCreate: (...prismaArgs: PrismaArgs[]) => PrismaCreate;\n    prismaCreateMany: (...prismaArgs: PrismaArgs[]) => PrismaCreateMany;\n    prismaUpdate: (...prismaArgs: PrismaArgs[]) => PrismaUpdate;\n    prismaUpdateMany: (...prismaArgs: PrismaArgs[]) => PrismaUpdateMany;\n    prismaUpsert: (...prismaArgs: PrismaArgs[]) => PrismaUpsert;\n    prismaDelete: (...prismaArgs: PrismaArgs[]) => PrismaDelete;\n    prismaDeleteMany: (...prismaArgs: PrismaArgs[]) => PrismaDeleteMany;\n};\nexport type QueryParamsCustom<T = any> = QueryParams<T> & {\n    prismaClient: PrismaClient;\n};\nexport type BeforeHookParams = QueryParams & {\n    prismaClient: PrismaClient;\n};\n/**\n * ### AfterHookParams\n *\n * @example\n * ```\n * {\n *     type: 'Query',\n *     operation: 'getPost',\n *     context: { action: 'get', alias: 'access', model: 'Post' },\n *     fields: ['title', 'status'],\n *     paths: ['get/post/title', 'get/post/status'],\n *     args: { where: { id: 5 } },\n *     prismaArgs: {\n *         where: { id: 5 },\n *         select: { title: true, status: true },\n *     },\n *     authorization: 'API_KEY',\n *     identity: { ... },\n *     result: { title: 'Hello World', status: 'PUBLISHED' }\n * }\n * ```\n */\nexport type AfterHookParams = QueryParams & {\n    prismaClient: PrismaClient;\n    result: any | any[];\n};\nexport type ShieldContext = {\n    action: Action;\n    model: string;\n};\nexport type Reason = string | ((context: ShieldContext) => string);\nexport type ShieldRule = boolean | ((context: ShieldContext) => boolean | Promise<boolean>) | any;\nexport type Shield = {\n    [matcher: string]: boolean | {\n        rule: ShieldRule;\n        reason?: Reason;\n    };\n};\nexport type HooksProps = {\n    before: BeforeHookParams;\n    after: AfterHookParams;\n};\nexport type HooksReturn = {\n    before: Promise<BeforeHookParams>;\n    after: Promise<AfterHookParams>;\n};\nexport type HookPath<Operations extends string, CustomResolvers> = Operations | CustomResolvers;\nexport type HooksParameter<HookType extends 'before' | 'after', Operations extends string, CustomResolvers extends string> = `${HookType}:${HookPath<Operations, CustomResolvers>}` | `${HookType}:**`;\nexport type HooksParameters<HookType extends 'before' | 'after', Operations extends string, CustomResolvers extends string> = {\n    [matcher in HooksParameter<HookType, Operations, CustomResolvers>]?: (props: HooksProps[HookType]) => HooksReturn[HookType];\n};\nexport type Hooks<Operations extends string, CustomResolvers extends string> = HooksParameters<'before', Operations, CustomResolvers> | HooksParameters<'after', Operations, CustomResolvers>;\nexport type ShieldAuthorization = {\n    canAccess: boolean;\n    reason: Reason;\n    prismaFilter: any;\n    matcher: string;\n    globPattern: string;\n};\nexport type ResolveParams<Operations extends string, CustomResolvers extends string> = {\n    event: AppSyncEvent;\n    resolvers?: {\n        [resolver in CustomResolvers]: ((props: QueryParamsCustom) => Promise<any>) | boolean;\n    };\n    shield?: (props: QueryParams) => Shield;\n    hooks?: Hooks<Operations, CustomResolvers>;\n};\nexport { PrismaClient, Prisma };\nexport type PrismaArgs = {\n    where?: any;\n    create?: any;\n    update?: any;\n    data?: any;\n    select?: any;\n    orderBy?: any;\n    skip?: number | undefined;\n    take?: number | undefined;\n    skipDuplicates?: boolean | undefined;\n};\nexport type PrismaOperator = keyof Required<PrismaArgs>;\nexport type AppSyncEvent = AppSyncResolverEvent<any>;\nexport type GraphQLType = 'Query' | 'Mutation' | 'Subscription';\nexport type API_KEY = null | {\n    [key: string]: any;\n};\nexport type AWS_LAMBDA = AppSyncIdentityLambda;\nexport type AWS_IAM = AppSyncIdentityIAM;\nexport type AMAZON_COGNITO_USER_POOLS = AppSyncIdentityCognito;\nexport type OPENID_CONNECT = AppSyncIdentityOIDC;\nexport type Identity = API_KEY | AWS_LAMBDA | AWS_IAM | AMAZON_COGNITO_USER_POOLS | OPENID_CONNECT;\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/client/utils.d.ts",
    "content": "/**\n * #### Deep merge objects (without mutating the target object).\n *\n * @example const newObj = merge(obj1, obj2, obj3)\n *\n * @param {any[]} sources\n * @returns any\n */\nexport declare function merge(...sources: any[]): any;\n/**\n * #### Deep clone object.\n *\n * @example const newObj = clone(sourceObj)\n *\n * @param {any} source\n * @returns any\n */\nexport declare function clone(source: any): any;\n/**\n * #### Returns decoded text, replacing HTML special characters.\n *\n * @example decode('&lt; &gt; &quot; &apos; &amp; &#169; &#8710;')\n * // returns '< > \" \\' & © ∆'\n *\n * @param {string} str\n * @returns string\n */\nexport declare function decode(str: string): string;\n/**\n * #### Returns encoded text, version of string.\n *\n * @example encode('<script>alert(\"xss\");</scr' + \"ipt>\")\n *\n * @param {string} str\n * @returns string\n */\nexport declare function encode(str: string): string;\n/**\n * #### Transform an object to a dotted-key/value pair.\n *\n * @example dotate({ data: { title: \"glut\" } })\n * // returns { 'data.title': 'glut' }\n *\n * @param {any} source\n * @returns any\n */\nexport declare function dotate(source: any): any;\n/**\n * #### Transform an object to an array of paths.\n *\n * @example objectToPaths({ data: { title: \"glut\" } })\n * // returns [ 'data', 'data/title']\n *\n * @param {any} source\n * @returns any\n */\nexport declare function objectToPaths(source: any): string[];\n/**\n * #### Return an object ommitting one to multiple keys.\n *\n * @example omit({ foo: 'foo', bar: 'bar' }, 'foo')\n * // returns { foo: 'foo' }\n *\n * @param {any} obj\n * @param {string | string[]} omitKey\n * @returns any\n */\nexport declare function omit(obj: any, omitKey: string | string[]): any;\n/**\n * #### Returns true if specified path matches any of the glob patterns.\n *\n * @example isMatchingGlob('get/post/title', ['get/post{,/**}'])\n *\n * @param {string} path\n * @param {string|string[]} globPatterns\n * @returns boolean\n */\nexport declare function isMatchingGlob(path: string, globPatterns: string | string[]): boolean;\n/**\n * #### Sanitize untrusted HTML to prevent XSS.\n *\n * @example filterXSS('<script>alert(\"xss\");</scr' + \"ipt>\")\n *\n * @param {string} str\n * @returns string\n */\nexport declare function filterXSS(str: string): string;\n/**\n * #### Return true if element is Empty.\n *\n * @example isEmpty(prismaArgs?.data?.title)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare function isEmpty(element: any): boolean;\n/**\n * #### Return true if element is Undefined.\n *\n * @example isUndefined(prismaArgs?.data?.title)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare function isUndefined(element: any): boolean;\n/**\n * #### Return true if element is an Array\n *\n * @example isArray(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare const isArray: (val: any) => val is any[];\n/**\n * #### Return string with first letter lowercase.\n *\n * @example lowerFirst(\"PostOffice\")\n * // returns 'postOffice'\n *\n * @param {string} str\n * @returns string\n */\nexport declare function lowerFirst(str: string): string;\n/**\n * #### Return string with first letter uppercase.\n *\n * @example upperFirst(\"postOffice\")\n * // returns 'PostOffice'\n *\n * @param {string} str\n * @returns string\n */\nexport declare function upperFirst(str: string): string;\n/**\n * #### Return true if element is an object\n *\n * @example isObject(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare const isObject: (val: any) => val is object;\n/**\n * #### Return true if element is a function\n *\n * @example isFunction(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare const isFunction: <T extends Function>(val: any) => val is T;\n/**\n * Applies a mutation function to each key and value of an object recursively.\n * Ensures immutability of the original object by returning a new, deeply-copied and mutated object.\n *\n * @param {Object} obj - Original object.\n * @param {Function} fn - Async mutator function, should return an object with potentially new key-value pair.\n * @return {Object} - A new mutated object.\n */\nexport declare function walk(jsonObj: any, fn: (arg: {\n    key: string;\n    value: any;\n}, node: WalkNode) => Promise<{\n    key: string;\n    value: any;\n}>): Promise<any>;\ndeclare class WalkNode {\n    _path: (string | number)[];\n    _ignoreChildren: boolean;\n    constructor(_path?: (string | number)[], _ignoreChildren?: boolean);\n    ignoreChilds(): void;\n    getPath(): (string | number)[];\n}\n/**\n * #### Replace all from findArray with replaceArray\n *\n * @example replaceAll('you & me', ['you','me'], ['me','you'])\n *\n * @param {string} str\n * @param {string[]} findArray\n * @param {string[]} replaceArray\n * @returns string\n */\nexport declare function replaceAll(str: string, findArray: string[], replaceArray: string[]): string;\n/**\n * #### Creates a duplicate-free version of an array\n *\n * @example uniq(['a', 'b', 'a'])\n *\n * @param {any[]} array\n * @returns any[]\n */\nexport declare function uniq<T>(array: readonly T[]): T[];\n/**\n * #### Creates a duplicate-free version of an array using iteratee\n *\n * @category Array\n */\nexport declare function uniqBy<T>(array: readonly T[], iteratee: keyof T | ((a: any) => any)): T[];\nexport {};\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/resolvers.yaml",
    "content": "- typeName: Query\n  fieldName: getUser\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: listUsers\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: countUsers\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createManyUsers\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateManyUsers\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: upsertUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteManyUsers\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: getPost\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: listPosts\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: countPosts\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createPost\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createManyPosts\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updatePost\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateManyPosts\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: upsertPost\n  dataSource: prisma-appsync\n"
  },
  {
    "path": "tests/generator/schemas/generated/@gql/schema.gql",
    "content": "type BatchPayload {\n    count: Int!\n}\n\ntype User {\n    id: Int!\n    email: AWSEmail!\n    posts: [Post!]!\n    createdAt: AWSDateTime\n}\n\ntype Post {\n    id: Int!\n    title: String!\n    source: AWSURL\n    author: User\n    authorId: Int\n    views: Int\n    status: Status\n    createdAt: AWSDateTime\n}\n\ntype Badge {\n    level: Int!\n    rank: Int!\n}\n\nenum OrderByArg {\n    ASC\n    DESC\n}\n\nenum NullArg {\n    NULL\n}\n\nenum Status {\n    DRAFT\n    PUBLISHED\n    DELETED\n}\n\ninput IntOperation {\n    set: Int\n    increment: Int\n    decrement: Int\n    multiply: Int\n    divide: Int\n}\n\ninput FloatOperation {\n    set: Float\n    increment: Float\n    decrement: Float\n    multiply: Float\n    divide: Float\n}\n\ninput AWSDateTimeFilter {\n    equals: AWSDateTime\n    gt: AWSDateTime\n    gte: AWSDateTime\n    in: [AWSDateTime!]\n    lt: AWSDateTime\n    lte: AWSDateTime\n    not: AWSDateTimeFilter\n    notIn: [AWSDateTime!]\n}\n\ninput AWSDateTimeNullableFilter {\n    equals: AWSDateTime\n    gt: AWSDateTime\n    gte: AWSDateTime\n    in: [AWSDateTime!]\n    lt: AWSDateTime\n    lte: AWSDateTime\n    not: AWSDateTimeFilter\n    notIn: [AWSDateTime!]\n    isNull: Boolean\n}\n\ninput AWSDateTimeListFilter {\n    equals: [AWSDateTime!]\n    has: AWSDateTime\n    hasEvery: [AWSDateTime!]\n    hasSome: [AWSDateTime!]\n    isEmpty: Boolean\n}\n\ninput AWSDateFilter {\n    equals: AWSDate\n    gt: AWSDate\n    gte: AWSDate\n    in: [AWSDate!]\n    lt: AWSDate\n    lte: AWSDate\n    not: AWSDateFilter\n    notIn: [AWSDate!]\n}\n\ninput AWSDateNullableFilter {\n    equals: AWSDate\n    gt: AWSDate\n    gte: AWSDate\n    in: [AWSDate!]\n    lt: AWSDate\n    lte: AWSDate\n    not: AWSDateFilter\n    notIn: [AWSDate!]\n    isNull: Boolean\n}\n\ninput AWSDateListFilter {\n    equals: [AWSDate!]\n    has: AWSDate\n    hasEvery: [AWSDate!]\n    hasSome: [AWSDate!]\n    isEmpty: Boolean\n}\n\ninput FloatFilter {\n    equals: Float\n    gt: Float\n    gte: Float\n    in: [Float!]\n    lt: Float\n    lte: Float\n    not: FloatFilter\n    notIn: [Float!]\n    isNull: Boolean\n}\n\ninput FloatNullableFilter {\n    equals: Float\n    gt: Float\n    gte: Float\n    in: [Float!]\n    lt: Float\n    lte: Float\n    not: FloatFilter\n    notIn: [Float!]\n    isNull: Boolean\n}\n\ninput FloatListFilter {\n    equals: [Float!]\n    has: Float\n    hasEvery: [Float!]\n    hasSome: [Float!]\n    isEmpty: Boolean\n}\n\ninput IntFilter {\n    equals: Int\n    gt: Int\n    gte: Int\n    in: [Int!]\n    lt: Int\n    lte: Int\n    not: IntFilter\n    notIn: [Int!]\n}\n\ninput IntNullableFilter {\n    equals: Int\n    gt: Int\n    gte: Int\n    in: [Int!]\n    lt: Int\n    lte: Int\n    not: IntFilter\n    notIn: [Int!]\n    isNull: Boolean\n}\n\ninput IntListFilter {\n    equals: [Int!]\n    has: Int\n    hasEvery: [Int!]\n    hasSome: [Int!]\n    isEmpty: Boolean\n}\n\ninput AWSJSONFilter {\n    contains: String\n    endsWith: String\n    equals: AWSJSON\n    in: [AWSJSON!]\n    not: AWSJSONFilter\n    notIn: [AWSJSON!]\n    startsWith: String\n}\n\ninput AWSJSONNullableFilter {\n    contains: String\n    endsWith: String\n    equals: AWSJSON\n    in: [AWSJSON!]\n    not: AWSJSONFilter\n    notIn: [AWSJSON!]\n    startsWith: String\n    isNull: Boolean\n}\n\ninput AWSJSONListFilter {\n    equals: [AWSJSON!]\n    has: AWSJSON\n    hasEvery: [AWSJSON!]\n    hasSome: [AWSJSON!]\n    isEmpty: Boolean\n}\n\ninput AWSEmailFilter {\n    contains: String\n    endsWith: String\n    equals: AWSEmail\n    in: [AWSEmail!]\n    not: AWSEmailFilter\n    notIn: [AWSEmail!]\n    startsWith: String\n}\n\ninput AWSEmailNullableFilter {\n    contains: String\n    endsWith: String\n    equals: AWSEmail\n    in: [AWSEmail!]\n    not: AWSEmailFilter\n    notIn: [AWSEmail!]\n    startsWith: String\n    isNull: Boolean\n}\n\ninput AWSEmailListFilter {\n    equals: [AWSEmail!]\n    has: AWSEmail\n    hasEvery: [AWSEmail!]\n    hasSome: [AWSEmail!]\n    isEmpty: Boolean\n}\n\ninput AWSURLFilter {\n    contains: String\n    endsWith: String\n    equals: AWSURL\n    in: [AWSURL!]\n    not: AWSURLFilter\n    notIn: [AWSURL!]\n    startsWith: String\n}\n\ninput AWSURLNullableFilter {\n    contains: String\n    endsWith: String\n    equals: AWSURL\n    in: [AWSURL!]\n    not: AWSURLFilter\n    notIn: [AWSURL!]\n    startsWith: String\n    isNull: Boolean\n}\n\ninput AWSURLListFilter {\n    equals: [AWSURL!]\n    has: AWSURL\n    hasEvery: [AWSURL!]\n    hasSome: [AWSURL!]\n    isEmpty: Boolean\n}\n\ninput StringFilter {\n    contains: String\n    endsWith: String\n    equals: String\n    in: [String!]\n    not: StringFilter\n    notIn: [String!]\n    startsWith: String\n    mode: String\n}\n\ninput StringNullableFilter {\n    contains: String\n    endsWith: String\n    equals: String\n    in: [String!]\n    not: StringFilter\n    notIn: [String!]\n    startsWith: String\n    mode: String\n    isNull: Boolean\n}\n\ninput StringListFilter {\n    equals: [String!]\n    has: String\n    hasEvery: [String!]\n    hasSome: [String!]\n    isEmpty: Boolean\n}\n\ninput BooleanFilter {\n    equals: Boolean\n    not: BooleanFilter\n}\n\ninput BooleanNullableFilter {\n    equals: Boolean\n    not: BooleanFilter\n    isNull: Boolean\n}\n\ninput BooleanListFilter {\n    equals: [Boolean!]\n    has: Boolean\n    hasEvery: [Boolean!]\n    hasSome: [Boolean!]\n}\n\ninput StatusEnumFilter {\n    equals: Status\n    in: [Status!]\n    not: StatusEnumFilter\n    notIn: [Status!]\n}\n\ninput StatusEnumListFilter {\n    equals: [Status!]\n    has: Status\n    hasEvery: [Status!]\n    hasSome: [Status!]\n    isEmpty: Boolean\n}\n\ninput UserFilter {\n    some: UserWhereInputWithoutNullables\n    every: UserWhereInputWithoutNullables\n    none: UserWhereInputWithoutNullables\n}\n\ninput UserWhereInputWithoutNullables {\n    OR: [UserWhereInput!]\n    NOT: [UserWhereInput!]\n    AND: [UserWhereInput!]\n    id: IntFilter\n    email: AWSEmailFilter\n    posts: PostFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput UserWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [UserWhereInput!]\n    NOT: [UserWhereInput!]\n    AND: [UserWhereInput!]\n    id: IntFilter\n    email: AWSEmailFilter\n    posts: PostFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput UserScalarWhereInput {\n    OR: [UserScalarWhereInput!]\n    NOT: [UserScalarWhereInput!]\n    AND: [UserScalarWhereInput!]\n    id: IntFilter\n    email: AWSEmailFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput UserWhereUniqueInput {\n    id: Int\n    email: AWSEmail\n}\n\ninput UserExtendedWhereUniqueInput {\n    OR: [UserWhereInput!]\n    NOT: [UserWhereInput!]\n    AND: [UserWhereInput!]\n    id: Int\n    email: AWSEmail\n    posts: PostFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput UserOrderByInput {\n    id: OrderByArg\n    email: OrderByArg\n    posts: PostOrderByInput\n    createdAt: OrderByArg\n}\n\ninput UserPostsCreateNestedInput {\n    connect: [PostWhereUniqueInput!]\n    create: [PostCreateWithoutUserInput!]\n    connectOrCreate: [PostConnectOrCreateWithoutUserInput!]\n}\n\ninput UserPostsUpdateNestedInput {\n    connect: [PostWhereUniqueInput!]\n    disconnect: [PostExtendedWhereUniqueInput!]\n    set: [PostWhereUniqueInput!]\n    create: [PostCreateWithoutUserInput!]\n    connectOrCreate: [PostConnectOrCreateWithoutUserInput!]\n    update: [PostUpdateWithWhereUniqueWithoutUserInput!]\n    upsert: [PostUpsertWithWhereUniqueWithoutUserInput!]\n    updateMany: [PostUpdateManyInput!]\n}\n\ninput UserCreateInput {\n    id: Int\n    email: AWSEmail!\n    password: String!\n    posts: UserPostsCreateNestedInput\n    createdAt: AWSDateTime\n}\n\ninput UserCreateWithoutPostInput {\n    id: Int\n    email: AWSEmail!\n    password: String!\n    createdAt: AWSDateTime\n}\n\ninput UserConnectOrCreateWithoutPostInput {\n    where: UserWhereUniqueInput!\n    create: UserCreateWithoutPostInput!\n}\n\ninput UserCreateManyInput {\n    id: Int\n    email: AWSEmail!\n    password: String!\n    createdAt: AWSDateTime\n}\n\ninput UserUpdateInput {\n    id: Int\n    email: AWSEmail\n    password: String\n    posts: UserPostsUpdateNestedInput\n    createdAt: AWSDateTime\n}\n\ninput UserUpdateWithoutPostInput {\n    id: Int\n    email: AWSEmail\n    password: String\n    createdAt: AWSDateTime\n}\n\ninput UserUpdateWithWhereUniqueWithoutPostInput {\n    data: UserUpdateWithoutPostInput!\n    where: UserExtendedWhereUniqueInput!\n}\n\ninput UserUpdateManyInput {\n    where: UserScalarWhereInput!\n    data: UserUpdateInput!\n}\n\ninput UserUpsertWithoutPostInput {\n    create: UserCreateWithoutPostInput!\n    update: UserUpdateWithoutPostInput!\n}\n\ninput UserUpsertWithWhereUniqueWithoutPostInput {\n    where: UserExtendedWhereUniqueInput!\n    create: UserCreateWithoutPostInput!\n    update: UserUpdateWithoutPostInput!\n}\n\ninput PostFilter {\n    some: PostWhereInputWithoutNullables\n    every: PostWhereInputWithoutNullables\n    none: PostWhereInputWithoutNullables\n}\n\ninput PostWhereInputWithoutNullables {\n    OR: [PostWhereInput!]\n    NOT: [PostWhereInput!]\n    AND: [PostWhereInput!]\n    id: IntFilter\n    title: StringFilter\n    source: AWSURLNullableFilter\n    author: UserWhereInput\n    authorId: IntNullableFilter\n    views: IntNullableFilter\n    status: StatusEnumFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput PostWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [PostWhereInput!]\n    NOT: [PostWhereInput!]\n    AND: [PostWhereInput!]\n    id: IntFilter\n    title: StringFilter\n    source: AWSURLNullableFilter\n    author: UserWhereInput\n    authorId: IntNullableFilter\n    views: IntNullableFilter\n    status: StatusEnumFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput PostScalarWhereInput {\n    OR: [PostScalarWhereInput!]\n    NOT: [PostScalarWhereInput!]\n    AND: [PostScalarWhereInput!]\n    id: IntFilter\n    title: StringFilter\n    source: AWSURLNullableFilter\n    authorId: IntNullableFilter\n    views: IntNullableFilter\n    status: StatusEnumFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput PostWhereUniqueInput {\n    id: Int\n}\n\ninput PostExtendedWhereUniqueInput {\n    OR: [PostWhereInput!]\n    NOT: [PostWhereInput!]\n    AND: [PostWhereInput!]\n    id: Int\n    title: StringFilter\n    source: AWSURLNullableFilter\n    author: UserWhereInput\n    authorId: IntNullableFilter\n    views: IntNullableFilter\n    status: StatusEnumFilter\n    createdAt: AWSDateTimeNullableFilter\n}\n\ninput PostOrderByInput {\n    id: OrderByArg\n    title: OrderByArg\n    source: OrderByArg\n    author: UserOrderByInput\n    authorId: OrderByArg\n    views: OrderByArg\n    status: OrderByArg\n    createdAt: OrderByArg\n}\n\ninput PostAuthorCreateNestedInput {\n    connect: UserWhereUniqueInput\n    create: UserCreateWithoutPostInput\n    connectOrCreate: UserConnectOrCreateWithoutPostInput\n}\n\ninput PostAuthorUpdateNestedInput {\n    connect: UserWhereUniqueInput\n    disconnect: Boolean\n    create: UserCreateWithoutPostInput\n    connectOrCreate: UserConnectOrCreateWithoutPostInput\n    update: UserUpdateWithoutPostInput\n    upsert: UserUpsertWithoutPostInput\n    delete: Boolean\n}\n\ninput PostCreateInput {\n    id: Int\n    title: String!\n    source: AWSURL\n    author: PostAuthorCreateNestedInput\n    views: Int = 1\n    status: Status = DRAFT\n    createdAt: AWSDateTime\n}\n\ninput PostCreateWithoutUserInput {\n    id: Int\n    title: String!\n    source: AWSURL\n    views: Int = 1\n    status: Status = DRAFT\n    createdAt: AWSDateTime\n}\n\ninput PostConnectOrCreateWithoutUserInput {\n    where: PostWhereUniqueInput!\n    create: PostCreateWithoutUserInput!\n}\n\ninput PostCreateManyInput {\n    id: Int\n    title: String!\n    source: AWSURL\n    views: Int = 1\n    status: Status = DRAFT\n    createdAt: AWSDateTime\n}\n\ninput PostUpdateInput {\n    id: Int\n    title: String\n    source: AWSURL\n    author: PostAuthorUpdateNestedInput\n    views: Int\n    status: Status\n    createdAt: AWSDateTime\n}\n\ninput PostUpdateWithoutUserInput {\n    id: Int\n    title: String\n    source: AWSURL\n    views: Int\n    status: Status\n    createdAt: AWSDateTime\n}\n\ninput PostUpdateWithWhereUniqueWithoutUserInput {\n    data: PostUpdateWithoutUserInput!\n    where: PostExtendedWhereUniqueInput!\n}\n\ninput PostOperationInput {\n    views: IntOperation\n}\n\ninput PostUpdateManyInput {\n    where: PostScalarWhereInput!\n    data: PostUpdateInput!\n}\n\ninput PostUpsertWithoutUserInput {\n    create: PostCreateWithoutUserInput!\n    update: PostUpdateWithoutUserInput!\n}\n\ninput PostUpsertWithWhereUniqueWithoutUserInput {\n    where: PostExtendedWhereUniqueInput!\n    create: PostCreateWithoutUserInput!\n    update: PostUpdateWithoutUserInput!\n}\n\ninput LevelRankFieldsInput {\n    level: Int!\n    rank: Int!\n}\n\ninput BadgeFilter {\n    some: BadgeWhereInputWithoutNullables\n    every: BadgeWhereInputWithoutNullables\n    none: BadgeWhereInputWithoutNullables\n}\n\ninput BadgeWhereInputWithoutNullables {\n    OR: [BadgeWhereInput!]\n    NOT: [BadgeWhereInput!]\n    AND: [BadgeWhereInput!]\n    level: IntFilter\n    rank: IntFilter\n}\n\ninput BadgeWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [BadgeWhereInput!]\n    NOT: [BadgeWhereInput!]\n    AND: [BadgeWhereInput!]\n    level: IntFilter\n    rank: IntFilter\n}\n\ninput BadgeScalarWhereInput {\n    OR: [BadgeScalarWhereInput!]\n    NOT: [BadgeScalarWhereInput!]\n    AND: [BadgeScalarWhereInput!]\n    level: IntFilter\n    rank: IntFilter\n}\n\ninput BadgeWhereUniqueInput {\n    level_rank: LevelRankFieldsInput\n}\n\ninput BadgeExtendedWhereUniqueInput {\n    OR: [BadgeWhereInput!]\n    NOT: [BadgeWhereInput!]\n    AND: [BadgeWhereInput!]\n    level_rank: LevelRankFieldsInput\n    level: IntFilter\n    rank: IntFilter\n}\n\ninput BadgeOrderByInput {\n    level: OrderByArg\n    rank: OrderByArg\n}\n\ntype Query {\n    # Retrieve a single User record by unique identifier.\n    getUser(where: UserExtendedWhereUniqueInput!): User\n\n    # Retrieve a list of Users records.\n    listUsers(\n        where: UserWhereInput\n        orderBy: [UserOrderByInput!]\n        skip: Int\n        take: Int\n    ): [User!]\n\n    # Count the number of Users records.\n    countUsers(\n        where: UserWhereInput\n        orderBy: [UserOrderByInput!]\n        skip: Int\n        take: Int\n    ): Int!\n\n    # Retrieve a single Post record by unique identifier.\n    getPost(where: PostExtendedWhereUniqueInput!): Post\n\n    # Retrieve a list of Posts records.\n    listPosts(\n        where: PostWhereInput\n        orderBy: [PostOrderByInput!]\n        skip: Int\n        take: Int\n    ): [Post!]\n\n    # Count the number of Posts records.\n    countPosts(\n        where: PostWhereInput\n        orderBy: [PostOrderByInput!]\n        skip: Int\n        take: Int\n    ): Int!\n}\n\ntype Mutation {\n    # Create a new User record.\n    createUser(data: UserCreateInput!): User!\n\n    # Create multiple new Users records.\n    createManyUsers(\n        data: [UserCreateManyInput!]\n        skipDuplicates: Boolean\n    ): BatchPayload!\n\n    # Update a single existing User record.\n    updateUser(\n        where: UserExtendedWhereUniqueInput!\n        data: UserUpdateInput\n    ): User!\n\n    # Update multiple existing Users records.\n    updateManyUsers(\n        where: UserWhereInput!\n        data: UserUpdateInput\n    ): BatchPayload!\n\n    # Create a new User record if it does not exist, or updates it if it does.\n    upsertUser(\n        create: UserCreateInput!\n        update: UserUpdateInput!\n        where: UserExtendedWhereUniqueInput!\n    ): User!\n\n    # Delete a single existing User record.\n    deleteUser(where: UserExtendedWhereUniqueInput!): User!\n\n    # Delete multiple existing Users records.\n    deleteManyUsers(where: UserWhereInput!): BatchPayload!\n\n    # Create a new Post record.\n    createPost(data: PostCreateInput!): Post!\n\n    # Create multiple new Posts records.\n    createManyPosts(\n        data: [PostCreateManyInput!]\n        skipDuplicates: Boolean\n    ): BatchPayload!\n\n    # Update a single existing Post record.\n    updatePost(\n        where: PostExtendedWhereUniqueInput!\n        data: PostUpdateInput\n        operation: PostOperationInput\n    ): Post!\n\n    # Update multiple existing Posts records.\n    updateManyPosts(\n        where: PostWhereInput!\n        data: PostUpdateInput\n        operation: PostOperationInput\n    ): BatchPayload!\n\n    # Create a new Post record if it does not exist, or updates it if it does.\n    upsertPost(\n        create: PostCreateInput!\n        update: PostUpdateInput!\n        where: PostExtendedWhereUniqueInput!\n    ): Post!\n}\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/adapter.d.ts",
    "content": "import type { Action, ActionsAlias, AppSyncEvent, Authorization, Context, GraphQLType, Identity, Model, Options, PrismaArgs, QueryParams } from './types';\n/**\n * #### Parse AppSync direct resolver `event` and returns Query Params.\n *\n * @param  {AppSyncEvent} appsyncEvent - AppSync event received in Lambda.\n * @param  {Required<PrismaAppSyncOptionsType>} options - PrismaAppSync Client options.\n * @param  {any|null} customResolvers? - Custom Resolvers.\n * @returns `{ type, operation, context, fields, paths, args, prismaArgs, authorization, identity }` - QueryParams\n */\nexport declare function parseEvent(appsyncEvent: AppSyncEvent, options: Options, customResolvers?: any | null): Promise<QueryParams>;\n/**\n * #### Convert `is: <enum>NULL` and `isNot: <enum>NULL` to `is: null` and `isNot: null`\n *\n * @param {any} data\n * @returns any\n */\nexport declare function addNullables(data: any): Promise<any>;\n/**\n * #### Returns authorization and identity.\n *\n * @param {any} options\n * @param {AppSyncEvent} options.appsyncEvent - AppSync event received in Lambda.\n * @returns `{ authorization, identity }`\n *\n * https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-identity\n */\nexport declare function getAuthIdentity({ appsyncEvent }: {\n    appsyncEvent: AppSyncEvent;\n}): {\n    identity: Identity;\n    authorization: Authorization;\n};\n/**\n * #### Returns context (`action`, `alias` and `model`).\n *\n * @param  {any} options\n * @param  {any|null} options.customResolvers\n * @param  {string} options.operation\n * @param  {Options} options.options\n * @returns Context\n */\nexport declare function getContext({ customResolvers, operation, options, }: {\n    customResolvers?: any | null;\n    operation: string;\n    options: Options;\n}): Context;\n/**\n * #### Returns operation (`getPost`, `listUsers`, ..).\n *\n * @param  {any} options\n * @param  {string} options.fieldName\n * @returns Operation\n */\nexport declare function getOperation({ fieldName }: {\n    fieldName: string;\n}): string;\n/**\n * #### Returns action (`get`, `list`, `create`, ...).\n *\n * @param  {any} options\n * @param  {string} options.operation\n * @returns Action\n */\nexport declare function getAction({ operation }: {\n    operation: string;\n}): Action;\n/**\n * #### Returns action alias (`access`, `create`, `modify`, `subscribe`).\n *\n * @param  {any} options\n * @param  {Action} options.action\n * @returns ActionsAlias\n */\nexport declare function getActionAlias({ action }: {\n    action: Action;\n}): ActionsAlias;\n/**\n * #### Returns model (`Post`, `User`, ...).\n *\n * @param  {any} options\n * @param  {string} options.operation\n * @param  {Action} options.action\n * @param  {Options} options.options\n * @returns Model\n */\nexport declare function getModel({ operation, action, options }: {\n    operation: string;\n    action: Action;\n    options: Options;\n}): Model;\n/**\n * #### Returns fields (`title`, `author`, ...).\n *\n * @param  {any} options\n * @param  {string[]} options._selectionSetList\n * @returns string[]\n */\nexport declare function getFields({ _selectionSetList }: {\n    _selectionSetList: string[];\n}): string[];\n/**\n * #### Returns GraphQL type (`Query`, `Mutation` or `Subscription`).\n *\n * @param {any} options\n * @param {string} options._parentTypeName\n * @returns GraphQLType\n */\nexport declare function getType({ _parentTypeName }: {\n    _parentTypeName: string;\n}): GraphQLType;\n/**\n * #### Returns Prisma args (`where`, `data`, `orderBy`, ...).\n *\n * @param {any} options\n * @param {Action} options.action\n * @param {Options['defaultPagination']} options.defaultPagination\n * @param {any} options._arguments\n * @param {any} options._selectionSetList\n * @returns PrismaArgs\n */\nexport declare function getPrismaArgs({ action, defaultPagination, _arguments, _selectionSetList, }: {\n    action: Action;\n    defaultPagination: Options['defaultPagination'];\n    _arguments: any;\n    _selectionSetList: any;\n}): PrismaArgs;\n/**\n * #### Returns req and res paths (`updatePost/title`, `getPost/date`, ..).\n *\n * @param {any} options\n * @param {string} options.operation\n * @param {Context} options.context\n * @param {PrismaArgs} options.prismaArgs\n * @returns string[]\n */\nexport declare function getPaths({ operation, context, prismaArgs, }: {\n    operation: string;\n    context: Context;\n    prismaArgs: PrismaArgs;\n}): string[];\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/consts.d.ts",
    "content": "export declare enum Actions {\n    get = \"get\",\n    list = \"list\",\n    count = \"count\",\n    createMany = \"createMany\",\n    updateMany = \"updateMany\",\n    deleteMany = \"deleteMany\",\n    create = \"create\",\n    update = \"update\",\n    upsert = \"upsert\",\n    delete = \"delete\",\n    onCreatedMany = \"onCreatedMany\",\n    onUpdatedMany = \"onUpdatedMany\",\n    onDeletedMany = \"onDeletedMany\",\n    onMutatedMany = \"onMutatedMany\",\n    onCreated = \"onCreated\",\n    onUpdated = \"onUpdated\",\n    onUpserted = \"onUpserted\",\n    onDeleted = \"onDeleted\",\n    onMutated = \"onMutated\"\n}\nexport declare enum ActionsAliases {\n    access = \"access\",\n    batchAccess = \"batchAccess\",\n    create = \"create\",\n    batchCreate = \"batchCreate\",\n    delete = \"delete\",\n    batchDelete = \"batchDelete\",\n    modify = \"modify\",\n    batchModify = \"batchModify\",\n    subscribe = \"subscribe\",\n    batchSubscribe = \"batchSubscribe\"\n}\n/**\n * ### Authorizations\n *\n * - `API_KEY`: Via hard-coded API key passed into `x-api-key` header.\n * - `AWS_IAM`: Via IAM identity and associated IAM policy rules.\n * - `AMAZON_COGNITO_USER_POOLS`: Via Amazon Cognito user token.\n * - `AWS_LAMBDA`: Via an AWS Lambda function.\n * - `OPENID_CONNECT`: Via Open ID connect such as Auth0.\n *\n * https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html\n */\nexport declare enum Authorizations {\n    API_KEY = \"API_KEY\",\n    AWS_IAM = \"AWS_IAM\",\n    AMAZON_COGNITO_USER_POOLS = \"AMAZON_COGNITO_USER_POOLS\",\n    AWS_LAMBDA = \"AWS_LAMBDA\",\n    OPENID_CONNECT = \"OPENID_CONNECT\"\n}\nexport declare const Prisma_QueryOptions: string[];\nexport declare const Prisma_NestedQueries: string[];\nexport declare const Prisma_FilterConditionsAndOperatos: string[];\nexport declare const Prisma_FilterRelationFilters: string[];\nexport declare const Prisma_ScalarListMethods: string[];\nexport declare const Prisma_ScalarListFilters: string[];\nexport declare const Prisma_CompositeTypeMethods: string[];\nexport declare const Prisma_CompositeTypeFilters: string[];\nexport declare const Prisma_AtomicNumberOperations: string[];\nexport declare const Prisma_JSONFilters: string[];\nexport declare const Prisma_ReservedKeysForPaths: string[];\nexport declare const Prisma_ReservedKeys: string[];\nexport declare const ActionsAliasesList: {\n    readonly access: readonly [Actions.get, Actions.list, Actions.count];\n    readonly batchAccess: readonly [Actions.list, Actions.count];\n    readonly create: readonly [Actions.create, Actions.createMany];\n    readonly batchCreate: readonly [Actions.createMany];\n    readonly modify: readonly [Actions.upsert, Actions.update, Actions.updateMany, Actions.delete, Actions.deleteMany];\n    readonly batchModify: readonly [Actions.updateMany, Actions.deleteMany];\n    readonly delete: readonly [Actions.delete, Actions.deleteMany];\n    readonly batchDelete: readonly [Actions.deleteMany];\n    readonly subscribe: readonly [Actions.onCreatedMany, Actions.onUpdatedMany, Actions.onDeletedMany, Actions.onMutatedMany, Actions.onCreated, Actions.onUpdated, Actions.onUpserted, Actions.onDeleted, Actions.onMutated];\n    readonly batchSubscribe: readonly [Actions.onCreatedMany, Actions.onUpdatedMany, Actions.onDeletedMany, Actions.onMutatedMany];\n};\nexport declare const ActionsList: string[];\nexport declare const BatchActionsList: string[];\nexport declare const DebugTestingKey = \"__prismaAppsync\";\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/core.d.ts",
    "content": "import type { Options, PrismaAppSyncOptionsType, ResolveParams } from './types';\nimport { Prisma, PrismaClient } from './types';\n/**\n * ##  Prisma-AppSync Client ʲˢ\n *\n * Type-safe Prisma AppSync client for TypeScript & Node.js\n * @example\n * ```\n * const prismaAppSync = new PrismaAppSync()\n *\n * // lambda handler (AppSync Direct Lambda Resolver)\n * export const resolver = async (event: any, context: any) => {\n *     return await prismaAppSync.resolve({ event })\n * }\n * ```\n *\n *\n * Read more in our [docs](https://prisma-appsync.vercel.app).\n */\nexport declare class PrismaAppSync {\n    options: Options;\n    prismaClient: PrismaClient<Prisma.PrismaClientOptions, 'query' | 'info' | 'warn' | 'error'>;\n    /**\n   * ### Client Constructor\n   *\n   * Instantiate Prisma-AppSync Client.\n   * @example\n   * ```\n   * const prismaAppSync = new PrismaAppSync()\n   * ```\n   *\n   * @param {PrismaAppSyncOptionsType} options\n   * @param {string} options.connectionString? - Prisma connection string (database connection URL).\n   * @param {boolean} options.sanitize? - Enable sanitize inputs (parse xss + encode html).\n   * @param {'INFO' | 'WARN' | 'ERROR'} options.logLevel? - Server logs level (visible in CloudWatch).\n   * @param {number|false} options.defaultPagination? - Default pagination for list Query (items per page).\n   * @param {number} options.maxDepth? - Maximum allowed GraphQL query depth.\n   * @param {number} options.maxReqPerUserMinute? - Maximum allowed requests per user, per minute.\n   *\n   * @default\n   * ```\n   * {\n   *   connectionString: process.env.DATABASE_URL,\n   *   sanitize: true,\n   *   logLevel: 'INFO',\n   *   defaultPagination: 50,\n   *   maxDepth: 4,\n   *   maxReqPerUserMinute: 200\n   * }\n   * ```\n   *\n   *\n   * Read more in our [docs](https://prisma-appsync.vercel.app).\n   */\n    constructor(options?: PrismaAppSyncOptionsType);\n    /**\n   * ###  Resolver\n   *\n   * Resolve the API request, based on the AppSync `event` received by the Direct Lambda Resolver.\n   * @example\n   * ```\n   * await prismaAppSync.resolve({ event })\n   *\n   * // custom resolvers\n   * await prismaAppSync.resolve<'notify'|'listPosts'>(\n   *     event,\n   *     resolvers: {\n   *         // extend CRUD API with a custom `notify` query\n   *         notify: async ({ args }) => { return { message: args.message } },\n   *\n   *         // disable one of the generated CRUD API query\n   *         listPosts: false,\n   *     }\n   * })\n   * ```\n   *\n   * @param {ResolveParams} resolveParams\n   * @param {any} resolveParams.event - AppSync event received by the Direct Lambda Resolver.\n   * @param {any} resolveParams.resolvers? - Custom resolvers (to extend the CRUD API).\n   * @param {function} resolveParams.shield? - Shield configuration (to protect your API).\n   * @param {function} resolveParams.hooks? - Hooks (to trigger functions based on events).\n   * @returns Promise<result>\n   *\n   *\n   * Read more in our [docs](https://prisma-appsync.vercel.app).\n   */\n    resolve<CustomResolvers = void>(resolveParams: ResolveParams<\"countComments\" | \"countLikes\" | \"countPosts\" | \"countProfiles\" | \"countUsers\" | \"createComment\" | \"createLike\" | \"createManyComments\" | \"createManyLikes\" | \"createManyPosts\" | \"createManyProfiles\" | \"createManyUsers\" | \"createPost\" | \"createProfile\" | \"createUser\" | \"deleteComment\" | \"deleteLike\" | \"deleteManyComments\" | \"deleteManyLikes\" | \"deleteManyPosts\" | \"deleteManyProfiles\" | \"deleteManyUsers\" | \"deletePost\" | \"deleteProfile\" | \"deleteUser\" | \"getComment\" | \"getLike\" | \"getPost\" | \"getProfile\" | \"getUser\" | \"listComments\" | \"listLikes\" | \"listPosts\" | \"listProfiles\" | \"listUsers\" | \"onCreatedComment\" | \"onCreatedLike\" | \"onCreatedManyComments\" | \"onCreatedManyLikes\" | \"onCreatedManyPosts\" | \"onCreatedManyProfiles\" | \"onCreatedManyUsers\" | \"onCreatedPost\" | \"onCreatedProfile\" | \"onCreatedUser\" | \"onDeletedComment\" | \"onDeletedLike\" | \"onDeletedManyComments\" | \"onDeletedManyLikes\" | \"onDeletedManyPosts\" | \"onDeletedManyProfiles\" | \"onDeletedManyUsers\" | \"onDeletedPost\" | \"onDeletedProfile\" | \"onDeletedUser\" | \"onMutatedComment\" | \"onMutatedLike\" | \"onMutatedManyComments\" | \"onMutatedManyLikes\" | \"onMutatedManyPosts\" | \"onMutatedManyProfiles\" | \"onMutatedManyUsers\" | \"onMutatedPost\" | \"onMutatedProfile\" | \"onMutatedUser\" | \"onUpdatedComment\" | \"onUpdatedLike\" | \"onUpdatedManyComments\" | \"onUpdatedManyLikes\" | \"onUpdatedManyPosts\" | \"onUpdatedManyProfiles\" | \"onUpdatedManyUsers\" | \"onUpdatedPost\" | \"onUpdatedProfile\" | \"onUpdatedUser\" | \"onUpsertedComment\" | \"onUpsertedLike\" | \"onUpsertedPost\" | \"onUpsertedProfile\" | \"onUpsertedUser\" | \"updateComment\" | \"updateLike\" | \"updateManyComments\" | \"updateManyLikes\" | \"updateManyPosts\" | \"updateManyProfiles\" | \"updateManyUsers\" | \"updatePost\" | \"updateProfile\" | \"updateUser\" | \"upsertComment\" | \"upsertLike\" | \"upsertPost\" | \"upsertProfile\" | \"upsertUser\", Extract<CustomResolvers, string>>): Promise<any>;\n}\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/guard.d.ts",
    "content": "import type { Context, PrismaClient, QueryParams, Shield, ShieldAuthorization } from './types';\n/**\n * #### Sanitize data (parse xss + encode html).\n *\n * @param {any} data\n * @returns any\n */\nexport declare function sanitize(data: any): Promise<any>;\n/**\n * #### Clarify data (decode html).\n *\n * @param {any} data\n * @returns any\n */\nexport declare function clarify(data: any): Promise<any>;\n/**\n * #### Returns an authorization object from a Shield configuration passed as input.\n *\n * @param {Shield} options.shield\n * @param {string[]} options.paths\n * @param {Context} options.context\n * @returns ShieldAuthorization\n */\nexport declare function getShieldAuthorization({ shield, paths, context, }: {\n    shield: Shield;\n    paths: string[];\n    context: Context;\n}): Promise<ShieldAuthorization>;\n/**\n * #### Returns GraphQL query depth for any given Query.\n *\n * @param {any} options\n * @param {string[]} options.paths\n * @param {Context} options.context\n * @param {any} options.fieldsMapping\n * @returns number\n */\nexport declare function getDepth({ paths, context, fieldsMapping }: {\n    paths: string[];\n    context: Context;\n    fieldsMapping: any;\n}): number;\n/**\n * #### Execute hooks that apply to a given Query.\n *\n * @param {any} options\n * @param {'before' | 'after'} options.when\n * @param {any} options.hooks\n * @param {PrismaClient} options.prismaClient\n * @param {QueryParams} options.QueryParams\n * @param {any | any[]} options.result\n * @returns Promise<void | any>\n */\nexport declare function runHooks({ when, hooks, prismaClient, QueryParams, result, }: {\n    when: 'before' | 'after';\n    hooks: any;\n    prismaClient: PrismaClient;\n    QueryParams: QueryParams;\n    result?: any | any[];\n}): Promise<void | any>;\nexport declare function preventDOS({ callerUuid, maxReqPerMinute, }: {\n    callerUuid: string;\n    maxReqPerMinute: number;\n}): Promise<{\n    limitExceeded: boolean;\n    count: number;\n}>;\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/index.d.ts",
    "content": "import { clone, decode, dotate, encode, filterXSS, isEmpty, isMatchingGlob, isUndefined, lowerFirst, merge, replaceAll, walk } from './utils';\nexport { PrismaAppSync } from './core';\nexport { CustomError, log } from './inspector';\nexport { queryBuilder } from './resolver';\nexport { QueryParams, QueryParamsCustom, BeforeHookParams, AfterHookParams, Authorization, AppSyncEvent, Identity, API_KEY, AWS_IAM, AMAZON_COGNITO_USER_POOLS, AWS_LAMBDA, OPENID_CONNECT, AppSyncResolverHandler, AppSyncResolverEvent, AppSyncIdentity, } from './types';\nexport { Authorizations } from './consts';\ndeclare const _: {\n    merge: typeof merge;\n    clone: typeof clone;\n    decode: typeof decode;\n    encode: typeof encode;\n    dotate: typeof dotate;\n    isMatchingGlob: typeof isMatchingGlob;\n    filterXSS: typeof filterXSS;\n    isEmpty: typeof isEmpty;\n    isUndefined: typeof isUndefined;\n    lowerFirst: typeof lowerFirst;\n    isObject: (val: any) => val is object;\n    walk: typeof walk;\n    replaceAll: typeof replaceAll;\n};\nexport { _ };\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/index.js",
    "content": "\"use strict\";var Ea=Object.create;var De=Object.defineProperty;var xa=Object.getOwnPropertyDescriptor;var va=Object.getOwnPropertyNames;var Ra=Object.getPrototypeOf,wa=Object.prototype.hasOwnProperty;var n=(e,t)=>De(e,\"name\",{value:t,configurable:!0});var L=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),ti=(e,t)=>{for(var r in t)De(e,r,{get:t[r],enumerable:!0})},ri=(e,t,r,i)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let s of va(t))!wa.call(e,s)&&s!==r&&De(e,s,{get:()=>t[s],enumerable:!(i=xa(t,s))||i.enumerable});return e};var Ie=(e,t,r)=>(r=e!=null?Ea(Ra(e)):{},ri(t||!e||!e.__esModule?De(r,\"default\",{value:e,enumerable:!0}):r,e)),Sa=e=>ri(De({},\"__esModule\",{value:!0}),e);var ht=L(ie=>{\"use strict\";ie.isInteger=e=>typeof e==\"number\"?Number.isInteger(e):typeof e==\"string\"&&e.trim()!==\"\"?Number.isInteger(Number(e)):!1;ie.find=(e,t)=>e.nodes.find(r=>r.type===t);ie.exceedsLimit=(e,t,r=1,i)=>i===!1||!ie.isInteger(e)||!ie.isInteger(t)?!1:(Number(t)-Number(e))/Number(r)>=i;ie.escapeNode=(e,t=0,r)=>{let i=e.nodes[t];i&&(r&&i.type===r||i.type===\"open\"||i.type===\"close\")&&i.escaped!==!0&&(i.value=\"\\\\\"+i.value,i.escaped=!0)};ie.encloseBrace=e=>e.type!==\"brace\"||e.commas>>0+e.ranges>>0?!1:(e.invalid=!0,!0);ie.isInvalidBrace=e=>e.type!==\"brace\"?!1:e.invalid===!0||e.dollar?!0:!(e.commas>>0+e.ranges>>0)||e.open!==!0||e.close!==!0?(e.invalid=!0,!0):!1;ie.isOpenOrClose=e=>e.type===\"open\"||e.type===\"close\"?!0:e.open===!0||e.close===!0;ie.reduce=e=>e.reduce((t,r)=>(r.type===\"text\"&&t.push(r.value),r.type===\"range\"&&(r.type=\"text\"),t),[]);ie.flatten=(...e)=>{let t=[],r=n(i=>{for(let s=0;s<i.length;s++){let a=i[s];Array.isArray(a)?r(a,t):a!==void 0&&t.push(a)}return t},\"flat\");return r(e),t}});var gt=L((lh,ji)=>{\"use strict\";var Vi=ht();ji.exports=(e,t={})=>{let r=n((i,s={})=>{let a=t.escapeInvalid&&Vi.isInvalidBrace(s),o=i.invalid===!0&&t.escapeInvalid===!0,l=\"\";if(i.value)return(a||o)&&Vi.isOpenOrClose(i)?\"\\\\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let c of i.nodes)l+=r(c);return l},\"stringify\");return r(e)}});var Ki=L((uh,Qi)=>{\"use strict\";/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */Qi.exports=function(e){return typeof e==\"number\"?e-e===0:typeof e==\"string\"&&e.trim()!==\"\"?Number.isFinite?Number.isFinite(+e):isFinite(+e):!1}});var is=L((ph,rs)=>{\"use strict\";/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */var Wi=Ki(),Ae=n((e,t,r)=>{if(Wi(e)===!1)throw new TypeError(\"toRegexRange: expected the first argument to be a number\");if(t===void 0||e===t)return String(e);if(Wi(t)===!1)throw new TypeError(\"toRegexRange: expected the second argument to be a number.\");let i={relaxZeros:!0,...r};typeof i.strictZeros==\"boolean\"&&(i.relaxZeros=i.strictZeros===!1);let s=String(i.relaxZeros),a=String(i.shorthand),o=String(i.capture),l=String(i.wrap),c=e+\":\"+t+\"=\"+s+a+o+l;if(Ae.cache.hasOwnProperty(c))return Ae.cache[c].result;let u=Math.min(e,t),p=Math.max(e,t);if(Math.abs(u-p)===1){let y=e+\"|\"+t;return i.capture?`(${y})`:i.wrap===!1?y:`(?:${y})`}let d=ts(e)||ts(t),f={min:e,max:t,a:u,b:p},E=[],b=[];if(d&&(f.isPadded=d,f.maxLen=String(f.max).length),u<0){let y=p<0?Math.abs(p):1;b=Yi(y,Math.abs(u),f,i),u=f.a=0}return p>=0&&(E=Yi(u,p,f,i)),f.negatives=b,f.positives=E,f.result=el(b,E,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&E.length+b.length>1&&(f.result=`(?:${f.result})`),Ae.cache[c]=f,f.result},\"toRegexRange\");function el(e,t,r){let i=br(e,t,\"-\",!1,r)||[],s=br(t,e,\"\",!1,r)||[],a=br(e,t,\"-?\",!0,r)||[];return i.concat(a).concat(s).join(\"|\")}n(el,\"collatePatterns\");function tl(e,t){let r=1,i=1,s=Zi(e,r),a=new Set([t]);for(;e<=s&&s<=t;)a.add(s),r+=1,s=Zi(e,r);for(s=Ji(t+1,i)-1;e<s&&s<=t;)a.add(s),i+=1,s=Ji(t+1,i)-1;return a=[...a],a.sort(sl),a}n(tl,\"splitToRanges\");function rl(e,t,r){if(e===t)return{pattern:e,count:[],digits:0};let i=il(e,t),s=i.length,a=\"\",o=0;for(let l=0;l<s;l++){let[c,u]=i[l];c===u?a+=c:c!==\"0\"||u!==\"9\"?a+=nl(c,u,r):o++}return o&&(a+=r.shorthand===!0?\"\\\\d\":\"[0-9]\"),{pattern:a,count:[o],digits:s}}n(rl,\"rangeToPattern\");function Yi(e,t,r,i){let s=tl(e,t),a=[],o=e,l;for(let c=0;c<s.length;c++){let u=s[c],p=rl(String(o),String(u),i),d=\"\";if(!r.isPadded&&l&&l.pattern===p.pattern){l.count.length>1&&l.count.pop(),l.count.push(p.count[0]),l.string=l.pattern+es(l.count),o=u+1;continue}r.isPadded&&(d=al(u,r,i)),p.string=d+p.pattern+es(p.count),a.push(p),o=u+1,l=p}return a}n(Yi,\"splitToPatterns\");function br(e,t,r,i,s){let a=[];for(let o of e){let{string:l}=o;!i&&!Xi(t,\"string\",l)&&a.push(r+l),i&&Xi(t,\"string\",l)&&a.push(r+l)}return a}n(br,\"filterPatterns\");function il(e,t){let r=[];for(let i=0;i<e.length;i++)r.push([e[i],t[i]]);return r}n(il,\"zip\");function sl(e,t){return e>t?1:t>e?-1:0}n(sl,\"compare\");function Xi(e,t,r){return e.some(i=>i[t]===r)}n(Xi,\"contains\");function Zi(e,t){return Number(String(e).slice(0,-t)+\"9\".repeat(t))}n(Zi,\"countNines\");function Ji(e,t){return e-e%Math.pow(10,t)}n(Ji,\"countZeros\");function es(e){let[t=0,r=\"\"]=e;return r||t>1?`{${t+(r?\",\"+r:\"\")}}`:\"\"}n(es,\"toQuantifier\");function nl(e,t,r){return`[${e}${t-e===1?\"\":\"-\"}${t}]`}n(nl,\"toCharacterClass\");function ts(e){return/^-?(0+)\\d/.test(e)}n(ts,\"hasPadding\");function al(e,t,r){if(!t.isPadded)return e;let i=Math.abs(t.maxLen-String(e).length),s=r.relaxZeros!==!1;switch(i){case 0:return\"\";case 1:return s?\"0?\":\"0\";case 2:return s?\"0{0,2}\":\"00\";default:return s?`0{0,${i}}`:`0{${i}}`}}n(al,\"padZeros\");Ae.cache={};Ae.clearCache=()=>Ae.cache={};rs.exports=Ae});var xr=L((dh,ps)=>{\"use strict\";/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */var ol=require(\"util\"),as=is(),ss=n(e=>e!==null&&typeof e==\"object\"&&!Array.isArray(e),\"isObject\"),ll=n(e=>t=>e===!0?Number(t):String(t),\"transform\"),Ar=n(e=>typeof e==\"number\"||typeof e==\"string\"&&e!==\"\",\"isValidValue\"),$e=n(e=>Number.isInteger(+e),\"isNumber\"),Er=n(e=>{let t=`${e}`,r=-1;if(t[0]===\"-\"&&(t=t.slice(1)),t===\"0\")return!1;for(;t[++r]===\"0\";);return r>0},\"zeros\"),cl=n((e,t,r)=>typeof e==\"string\"||typeof t==\"string\"?!0:r.stringify===!0,\"stringify\"),ul=n((e,t,r)=>{if(t>0){let i=e[0]===\"-\"?\"-\":\"\";i&&(e=e.slice(1)),e=i+e.padStart(i?t-1:t,\"0\")}return r===!1?String(e):e},\"pad\"),ns=n((e,t)=>{let r=e[0]===\"-\"?\"-\":\"\";for(r&&(e=e.slice(1),t--);e.length<t;)e=\"0\"+e;return r?\"-\"+e:e},\"toMaxLen\"),pl=n((e,t)=>{e.negatives.sort((o,l)=>o<l?-1:o>l?1:0),e.positives.sort((o,l)=>o<l?-1:o>l?1:0);let r=t.capture?\"\":\"?:\",i=\"\",s=\"\",a;return e.positives.length&&(i=e.positives.join(\"|\")),e.negatives.length&&(s=`-(${r}${e.negatives.join(\"|\")})`),i&&s?a=`${i}|${s}`:a=i||s,t.wrap?`(${r}${a})`:a},\"toSequence\"),os=n((e,t,r,i)=>{if(r)return as(e,t,{wrap:!1,...i});let s=String.fromCharCode(e);if(e===t)return s;let a=String.fromCharCode(t);return`[${s}-${a}]`},\"toRange\"),ls=n((e,t,r)=>{if(Array.isArray(e)){let i=r.wrap===!0,s=r.capture?\"\":\"?:\";return i?`(${s}${e.join(\"|\")})`:e.join(\"|\")}return as(e,t,r)},\"toRegex\"),cs=n((...e)=>new RangeError(\"Invalid range arguments: \"+ol.inspect(...e)),\"rangeError\"),us=n((e,t,r)=>{if(r.strictRanges===!0)throw cs([e,t]);return[]},\"invalidRange\"),fl=n((e,t)=>{if(t.strictRanges===!0)throw new TypeError(`Expected step \"${e}\" to be a number`);return[]},\"invalidStep\"),dl=n((e,t,r=1,i={})=>{let s=Number(e),a=Number(t);if(!Number.isInteger(s)||!Number.isInteger(a)){if(i.strictRanges===!0)throw cs([e,t]);return[]}s===0&&(s=0),a===0&&(a=0);let o=s>a,l=String(e),c=String(t),u=String(r);r=Math.max(Math.abs(r),1);let p=Er(l)||Er(c)||Er(u),d=p?Math.max(l.length,c.length,u.length):0,f=p===!1&&cl(e,t,i)===!1,E=i.transform||ll(f);if(i.toRegex&&r===1)return os(ns(e,d),ns(t,d),!0,i);let b={negatives:[],positives:[]},y=n(T=>b[T<0?\"negatives\":\"positives\"].push(Math.abs(T)),\"push\"),x=[],R=0;for(;o?s>=a:s<=a;)i.toRegex===!0&&r>1?y(s):x.push(ul(E(s,R),d,f)),s=o?s-r:s+r,R++;return i.toRegex===!0?r>1?pl(b,i):ls(x,null,{wrap:!1,...i}):x},\"fillNumbers\"),hl=n((e,t,r=1,i={})=>{if(!$e(e)&&e.length>1||!$e(t)&&t.length>1)return us(e,t,i);let s=i.transform||(f=>String.fromCharCode(f)),a=`${e}`.charCodeAt(0),o=`${t}`.charCodeAt(0),l=a>o,c=Math.min(a,o),u=Math.max(a,o);if(i.toRegex&&r===1)return os(c,u,!1,i);let p=[],d=0;for(;l?a>=o:a<=o;)p.push(s(a,d)),a=l?a-r:a+r,d++;return i.toRegex===!0?ls(p,null,{wrap:!1,options:i}):p},\"fillLetters\"),mt=n((e,t,r,i={})=>{if(t==null&&Ar(e))return[e];if(!Ar(e)||!Ar(t))return us(e,t,i);if(typeof r==\"function\")return mt(e,t,1,{transform:r});if(ss(r))return mt(e,t,0,r);let s={...i};return s.capture===!0&&(s.wrap=!0),r=r||s.step||1,$e(r)?$e(e)&&$e(t)?dl(e,t,r,s):hl(e,t,Math.max(Math.abs(r),1),s):r!=null&&!ss(r)?fl(r,s):mt(e,t,1,r)},\"fill\");ps.exports=mt});var hs=L((gh,ds)=>{\"use strict\";var gl=xr(),fs=ht(),ml=n((e,t={})=>{let r=n((i,s={})=>{let a=fs.isInvalidBrace(s),o=i.invalid===!0&&t.escapeInvalid===!0,l=a===!0||o===!0,c=t.escapeInvalid===!0?\"\\\\\":\"\",u=\"\";if(i.isOpen===!0||i.isClose===!0)return c+i.value;if(i.type===\"open\")return l?c+i.value:\"(\";if(i.type===\"close\")return l?c+i.value:\")\";if(i.type===\"comma\")return i.prev.type===\"comma\"?\"\":l?i.value:\"|\";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let p=fs.reduce(i.nodes),d=gl(...p,{...t,wrap:!1,toRegex:!0});if(d.length!==0)return p.length>1&&d.length>1?`(${d})`:d}if(i.nodes)for(let p of i.nodes)u+=r(p,i);return u},\"walk\");return r(e)},\"compile\");ds.exports=ml});var ys=L((yh,ms)=>{\"use strict\";var yl=xr(),gs=gt(),Se=ht(),Ee=n((e=\"\",t=\"\",r=!1)=>{let i=[];if(e=[].concat(e),t=[].concat(t),!t.length)return e;if(!e.length)return r?Se.flatten(t).map(s=>`{${s}}`):t;for(let s of e)if(Array.isArray(s))for(let a of s)i.push(Ee(a,t,r));else for(let a of t)r===!0&&typeof a==\"string\"&&(a=`{${a}}`),i.push(Array.isArray(a)?Ee(s,a,r):s+a);return Se.flatten(i)},\"append\"),bl=n((e,t={})=>{let r=t.rangeLimit===void 0?1e3:t.rangeLimit,i=n((s,a={})=>{s.queue=[];let o=a,l=a.queue;for(;o.type!==\"brace\"&&o.type!==\"root\"&&o.parent;)o=o.parent,l=o.queue;if(s.invalid||s.dollar){l.push(Ee(l.pop(),gs(s,t)));return}if(s.type===\"brace\"&&s.invalid!==!0&&s.nodes.length===2){l.push(Ee(l.pop(),[\"{}\"]));return}if(s.nodes&&s.ranges>0){let d=Se.reduce(s.nodes);if(Se.exceedsLimit(...d,t.step,r))throw new RangeError(\"expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.\");let f=yl(...d,t);f.length===0&&(f=gs(s,t)),l.push(Ee(l.pop(),f)),s.nodes=[];return}let c=Se.encloseBrace(s),u=s.queue,p=s;for(;p.type!==\"brace\"&&p.type!==\"root\"&&p.parent;)p=p.parent,u=p.queue;for(let d=0;d<s.nodes.length;d++){let f=s.nodes[d];if(f.type===\"comma\"&&s.type===\"brace\"){d===1&&u.push(\"\"),u.push(\"\");continue}if(f.type===\"close\"){l.push(Ee(l.pop(),u,c));continue}if(f.value&&f.type!==\"open\"){u.push(Ee(u.pop(),f.value));continue}f.nodes&&i(f,s)}return u},\"walk\");return Se.flatten(i(e))},\"expand\");ms.exports=bl});var As=L((Ah,bs)=>{\"use strict\";bs.exports={MAX_LENGTH:1024*64,CHAR_0:\"0\",CHAR_9:\"9\",CHAR_UPPERCASE_A:\"A\",CHAR_LOWERCASE_A:\"a\",CHAR_UPPERCASE_Z:\"Z\",CHAR_LOWERCASE_Z:\"z\",CHAR_LEFT_PARENTHESES:\"(\",CHAR_RIGHT_PARENTHESES:\")\",CHAR_ASTERISK:\"*\",CHAR_AMPERSAND:\"&\",CHAR_AT:\"@\",CHAR_BACKSLASH:\"\\\\\",CHAR_BACKTICK:\"`\",CHAR_CARRIAGE_RETURN:\"\\r\",CHAR_CIRCUMFLEX_ACCENT:\"^\",CHAR_COLON:\":\",CHAR_COMMA:\",\",CHAR_DOLLAR:\"$\",CHAR_DOT:\".\",CHAR_DOUBLE_QUOTE:'\"',CHAR_EQUAL:\"=\",CHAR_EXCLAMATION_MARK:\"!\",CHAR_FORM_FEED:\"\\f\",CHAR_FORWARD_SLASH:\"/\",CHAR_HASH:\"#\",CHAR_HYPHEN_MINUS:\"-\",CHAR_LEFT_ANGLE_BRACKET:\"<\",CHAR_LEFT_CURLY_BRACE:\"{\",CHAR_LEFT_SQUARE_BRACKET:\"[\",CHAR_LINE_FEED:`\n`,CHAR_NO_BREAK_SPACE:\"\\xA0\",CHAR_PERCENT:\"%\",CHAR_PLUS:\"+\",CHAR_QUESTION_MARK:\"?\",CHAR_RIGHT_ANGLE_BRACKET:\">\",CHAR_RIGHT_CURLY_BRACE:\"}\",CHAR_RIGHT_SQUARE_BRACKET:\"]\",CHAR_SEMICOLON:\";\",CHAR_SINGLE_QUOTE:\"'\",CHAR_SPACE:\" \",CHAR_TAB:\"\t\",CHAR_UNDERSCORE:\"_\",CHAR_VERTICAL_LINE:\"|\",CHAR_ZERO_WIDTH_NOBREAK_SPACE:\"\\uFEFF\"}});var ws=L((Eh,Rs)=>{\"use strict\";var Al=gt(),{MAX_LENGTH:Es,CHAR_BACKSLASH:vr,CHAR_BACKTICK:El,CHAR_COMMA:xl,CHAR_DOT:vl,CHAR_LEFT_PARENTHESES:Rl,CHAR_RIGHT_PARENTHESES:wl,CHAR_LEFT_CURLY_BRACE:Sl,CHAR_RIGHT_CURLY_BRACE:Tl,CHAR_LEFT_SQUARE_BRACKET:xs,CHAR_RIGHT_SQUARE_BRACKET:vs,CHAR_DOUBLE_QUOTE:Cl,CHAR_SINGLE_QUOTE:_l,CHAR_NO_BREAK_SPACE:Ol,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Pl}=As(),Ll=n((e,t={})=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");let r=t||{},i=typeof r.maxLength==\"number\"?Math.min(Es,r.maxLength):Es;if(e.length>i)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${i})`);let s={type:\"root\",input:e,nodes:[]},a=[s],o=s,l=s,c=0,u=e.length,p=0,d=0,f,E={},b=n(()=>e[p++],\"advance\"),y=n(x=>{if(x.type===\"text\"&&l.type===\"dot\"&&(l.type=\"text\"),l&&l.type===\"text\"&&x.type===\"text\"){l.value+=x.value;return}return o.nodes.push(x),x.parent=o,x.prev=l,l=x,x},\"push\");for(y({type:\"bos\"});p<u;)if(o=a[a.length-1],f=b(),!(f===Pl||f===Ol)){if(f===vr){y({type:\"text\",value:(t.keepEscaping?f:\"\")+b()});continue}if(f===vs){y({type:\"text\",value:\"\\\\\"+f});continue}if(f===xs){c++;let x=!0,R;for(;p<u&&(R=b());){if(f+=R,R===xs){c++;continue}if(R===vr){f+=b();continue}if(R===vs&&(c--,c===0))break}y({type:\"text\",value:f});continue}if(f===Rl){o=y({type:\"paren\",nodes:[]}),a.push(o),y({type:\"text\",value:f});continue}if(f===wl){if(o.type!==\"paren\"){y({type:\"text\",value:f});continue}o=a.pop(),y({type:\"text\",value:f}),o=a[a.length-1];continue}if(f===Cl||f===_l||f===El){let x=f,R;for(t.keepQuotes!==!0&&(f=\"\");p<u&&(R=b());){if(R===vr){f+=R+b();continue}if(R===x){t.keepQuotes===!0&&(f+=R);break}f+=R}y({type:\"text\",value:f});continue}if(f===Sl){d++;let R={type:\"brace\",open:!0,close:!1,dollar:l.value&&l.value.slice(-1)===\"$\"||o.dollar===!0,depth:d,commas:0,ranges:0,nodes:[]};o=y(R),a.push(o),y({type:\"open\",value:f});continue}if(f===Tl){if(o.type!==\"brace\"){y({type:\"text\",value:f});continue}let x=\"close\";o=a.pop(),o.close=!0,y({type:x,value:f}),d--,o=a[a.length-1];continue}if(f===xl&&d>0){if(o.ranges>0){o.ranges=0;let x=o.nodes.shift();o.nodes=[x,{type:\"text\",value:Al(o)}]}y({type:\"comma\",value:f}),o.commas++;continue}if(f===vl&&d>0&&o.commas===0){let x=o.nodes;if(d===0||x.length===0){y({type:\"text\",value:f});continue}if(l.type===\"dot\"){if(o.range=[],l.value+=f,l.type=\"range\",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,l.type=\"text\";continue}o.ranges++,o.args=[];continue}if(l.type===\"range\"){x.pop();let R=x[x.length-1];R.value+=l.value+f,l=R,o.ranges--;continue}y({type:\"dot\",value:f});continue}y({type:\"text\",value:f})}do if(o=a.pop(),o.type!==\"root\"){o.nodes.forEach(T=>{T.nodes||(T.type===\"open\"&&(T.isOpen=!0),T.type===\"close\"&&(T.isClose=!0),T.nodes||(T.type=\"text\"),T.invalid=!0)});let x=a[a.length-1],R=x.nodes.indexOf(o);x.nodes.splice(R,1,...o.nodes)}while(a.length>0);return y({type:\"eos\"}),s},\"parse\");Rs.exports=Ll});var Cs=L((vh,Ts)=>{\"use strict\";var Ss=gt(),Nl=hs(),ql=ys(),kl=ws(),Z=n((e,t={})=>{let r=[];if(Array.isArray(e))for(let i of e){let s=Z.create(i,t);Array.isArray(s)?r.push(...s):r.push(s)}else r=[].concat(Z.create(e,t));return t&&t.expand===!0&&t.nodupes===!0&&(r=[...new Set(r)]),r},\"braces\");Z.parse=(e,t={})=>kl(e,t);Z.stringify=(e,t={})=>Ss(typeof e==\"string\"?Z.parse(e,t):e,t);Z.compile=(e,t={})=>(typeof e==\"string\"&&(e=Z.parse(e,t)),Nl(e,t));Z.expand=(e,t={})=>{typeof e==\"string\"&&(e=Z.parse(e,t));let r=ql(e,t);return t.noempty===!0&&(r=r.filter(Boolean)),t.nodupes===!0&&(r=[...new Set(r)]),r};Z.create=(e,t={})=>e===\"\"||e.length<3?[e]:t.expand!==!0?Z.compile(e,t):Z.expand(e,t);Ts.exports=Z});var Be=L((wh,Ns)=>{\"use strict\";var Dl=require(\"path\"),ce=\"\\\\\\\\/\",_s=`[^${ce}]`,he=\"\\\\.\",Il=\"\\\\+\",Hl=\"\\\\?\",yt=\"\\\\/\",Ml=\"(?=.)\",Os=\"[^/]\",Rr=`(?:${yt}|$)`,Ps=`(?:^|${yt})`,wr=`${he}{1,2}${Rr}`,Ul=`(?!${he})`,Fl=`(?!${Ps}${wr})`,$l=`(?!${he}{0,1}${Rr})`,Bl=`(?!${wr})`,zl=`[^.${yt}]`,Gl=`${Os}*?`,Ls={DOT_LITERAL:he,PLUS_LITERAL:Il,QMARK_LITERAL:Hl,SLASH_LITERAL:yt,ONE_CHAR:Ml,QMARK:Os,END_ANCHOR:Rr,DOTS_SLASH:wr,NO_DOT:Ul,NO_DOTS:Fl,NO_DOT_SLASH:$l,NO_DOTS_SLASH:Bl,QMARK_NO_DOT:zl,STAR:Gl,START_ANCHOR:Ps},Vl={...Ls,SLASH_LITERAL:`[${ce}]`,QMARK:_s,STAR:`${_s}*?`,DOTS_SLASH:`${he}{1,2}(?:[${ce}]|$)`,NO_DOT:`(?!${he})`,NO_DOTS:`(?!(?:^|[${ce}])${he}{1,2}(?:[${ce}]|$))`,NO_DOT_SLASH:`(?!${he}{0,1}(?:[${ce}]|$))`,NO_DOTS_SLASH:`(?!${he}{1,2}(?:[${ce}]|$))`,QMARK_NO_DOT:`[^.${ce}]`,START_ANCHOR:`(?:^|[${ce}])`,END_ANCHOR:`(?:[${ce}]|$)`},jl={alnum:\"a-zA-Z0-9\",alpha:\"a-zA-Z\",ascii:\"\\\\x00-\\\\x7F\",blank:\" \\\\t\",cntrl:\"\\\\x00-\\\\x1F\\\\x7F\",digit:\"0-9\",graph:\"\\\\x21-\\\\x7E\",lower:\"a-z\",print:\"\\\\x20-\\\\x7E \",punct:\"\\\\-!\\\"#$%&'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~\",space:\" \\\\t\\\\r\\\\n\\\\v\\\\f\",upper:\"A-Z\",word:\"A-Za-z0-9_\",xdigit:\"A-Fa-f0-9\"};Ns.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:jl,REGEX_BACKSLASH:/\\\\(?![*+?^${}(|)[\\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\\].,$*+?^{}()|\\\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\\\?)((\\W)(\\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,REPLACEMENTS:{\"***\":\"*\",\"**/**\":\"**\",\"**/**/**\":\"**\"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:Dl.sep,extglobChars(e){return{\"!\":{type:\"negate\",open:\"(?:(?!(?:\",close:`))${e.STAR})`},\"?\":{type:\"qmark\",open:\"(?:\",close:\")?\"},\"+\":{type:\"plus\",open:\"(?:\",close:\")+\"},\"*\":{type:\"star\",open:\"(?:\",close:\")*\"},\"@\":{type:\"at\",open:\"(?:\",close:\")\"}}},globChars(e){return e===!0?Vl:Ls}}});var ze=L(Y=>{\"use strict\";var Ql=require(\"path\"),Kl=process.platform===\"win32\",{REGEX_BACKSLASH:Wl,REGEX_REMOVE_BACKSLASH:Yl,REGEX_SPECIAL_CHARS:Xl,REGEX_SPECIAL_CHARS_GLOBAL:Zl}=Be();Y.isObject=e=>e!==null&&typeof e==\"object\"&&!Array.isArray(e);Y.hasRegexChars=e=>Xl.test(e);Y.isRegexChar=e=>e.length===1&&Y.hasRegexChars(e);Y.escapeRegex=e=>e.replace(Zl,\"\\\\$1\");Y.toPosixSlashes=e=>e.replace(Wl,\"/\");Y.removeBackslashes=e=>e.replace(Yl,t=>t===\"\\\\\"?\"\":t);Y.supportsLookbehinds=()=>{let e=process.version.slice(1).split(\".\").map(Number);return e.length===3&&e[0]>=9||e[0]===8&&e[1]>=10};Y.isWindows=e=>e&&typeof e.windows==\"boolean\"?e.windows:Kl===!0||Ql.sep===\"\\\\\";Y.escapeLast=(e,t,r)=>{let i=e.lastIndexOf(t,r);return i===-1?e:e[i-1]===\"\\\\\"?Y.escapeLast(e,t,i-1):`${e.slice(0,i)}\\\\${e.slice(i)}`};Y.removePrefix=(e,t={})=>{let r=e;return r.startsWith(\"./\")&&(r=r.slice(2),t.prefix=\"./\"),r};Y.wrapOutput=(e,t={},r={})=>{let i=r.contains?\"\":\"^\",s=r.contains?\"\":\"$\",a=`${i}(?:${e})${s}`;return t.negated===!0&&(a=`(?:^(?!${a}).*$)`),a}});var Fs=L((Th,Us)=>{\"use strict\";var qs=ze(),{CHAR_ASTERISK:Sr,CHAR_AT:Jl,CHAR_BACKWARD_SLASH:Ge,CHAR_COMMA:ec,CHAR_DOT:Tr,CHAR_EXCLAMATION_MARK:Cr,CHAR_FORWARD_SLASH:Ms,CHAR_LEFT_CURLY_BRACE:_r,CHAR_LEFT_PARENTHESES:Or,CHAR_LEFT_SQUARE_BRACKET:tc,CHAR_PLUS:rc,CHAR_QUESTION_MARK:ks,CHAR_RIGHT_CURLY_BRACE:ic,CHAR_RIGHT_PARENTHESES:Ds,CHAR_RIGHT_SQUARE_BRACKET:sc}=Be(),Is=n(e=>e===Ms||e===Ge,\"isPathSeparator\"),Hs=n(e=>{e.isPrefix!==!0&&(e.depth=e.isGlobstar?1/0:1)},\"depth\"),nc=n((e,t)=>{let r=t||{},i=e.length-1,s=r.parts===!0||r.scanToEnd===!0,a=[],o=[],l=[],c=e,u=-1,p=0,d=0,f=!1,E=!1,b=!1,y=!1,x=!1,R=!1,T=!1,w=!1,q=!1,k=!1,V=0,D,S,_={value:\"\",depth:0,isGlob:!1},I=n(()=>u>=i,\"eos\"),m=n(()=>c.charCodeAt(u+1),\"peek\"),U=n(()=>(D=S,c.charCodeAt(++u)),\"advance\");for(;u<i;){S=U();let Q;if(S===Ge){T=_.backslashes=!0,S=U(),S===_r&&(R=!0);continue}if(R===!0||S===_r){for(V++;I()!==!0&&(S=U());){if(S===Ge){T=_.backslashes=!0,U();continue}if(S===_r){V++;continue}if(R!==!0&&S===Tr&&(S=U())===Tr){if(f=_.isBrace=!0,b=_.isGlob=!0,k=!0,s===!0)continue;break}if(R!==!0&&S===ec){if(f=_.isBrace=!0,b=_.isGlob=!0,k=!0,s===!0)continue;break}if(S===ic&&(V--,V===0)){R=!1,f=_.isBrace=!0,k=!0;break}}if(s===!0)continue;break}if(S===Ms){if(a.push(u),o.push(_),_={value:\"\",depth:0,isGlob:!1},k===!0)continue;if(D===Tr&&u===p+1){p+=2;continue}d=u+1;continue}if(r.noext!==!0&&(S===rc||S===Jl||S===Sr||S===ks||S===Cr)===!0&&m()===Or){if(b=_.isGlob=!0,y=_.isExtglob=!0,k=!0,S===Cr&&u===p&&(q=!0),s===!0){for(;I()!==!0&&(S=U());){if(S===Ge){T=_.backslashes=!0,S=U();continue}if(S===Ds){b=_.isGlob=!0,k=!0;break}}continue}break}if(S===Sr){if(D===Sr&&(x=_.isGlobstar=!0),b=_.isGlob=!0,k=!0,s===!0)continue;break}if(S===ks){if(b=_.isGlob=!0,k=!0,s===!0)continue;break}if(S===tc){for(;I()!==!0&&(Q=U());){if(Q===Ge){T=_.backslashes=!0,U();continue}if(Q===sc){E=_.isBracket=!0,b=_.isGlob=!0,k=!0;break}}if(s===!0)continue;break}if(r.nonegate!==!0&&S===Cr&&u===p){w=_.negated=!0,p++;continue}if(r.noparen!==!0&&S===Or){if(b=_.isGlob=!0,s===!0){for(;I()!==!0&&(S=U());){if(S===Or){T=_.backslashes=!0,S=U();continue}if(S===Ds){k=!0;break}}continue}break}if(b===!0){if(k=!0,s===!0)continue;break}}r.noext===!0&&(y=!1,b=!1);let H=c,ge=\"\",h=\"\";p>0&&(ge=c.slice(0,p),c=c.slice(p),d-=p),H&&b===!0&&d>0?(H=c.slice(0,d),h=c.slice(d)):b===!0?(H=\"\",h=c):H=c,H&&H!==\"\"&&H!==\"/\"&&H!==c&&Is(H.charCodeAt(H.length-1))&&(H=H.slice(0,-1)),r.unescape===!0&&(h&&(h=qs.removeBackslashes(h)),H&&T===!0&&(H=qs.removeBackslashes(H)));let g={prefix:ge,input:e,start:p,base:H,glob:h,isBrace:f,isBracket:E,isGlob:b,isExtglob:y,isGlobstar:x,negated:w,negatedExtglob:q};if(r.tokens===!0&&(g.maxDepth=0,Is(S)||o.push(_),g.tokens=o),r.parts===!0||r.tokens===!0){let Q;for(let P=0;P<a.length;P++){let ae=Q?Q+1:p,oe=a[P],X=e.slice(ae,oe);r.tokens&&(P===0&&p!==0?(o[P].isPrefix=!0,o[P].value=ge):o[P].value=X,Hs(o[P]),g.maxDepth+=o[P].depth),(P!==0||X!==\"\")&&l.push(X),Q=oe}if(Q&&Q+1<e.length){let P=e.slice(Q+1);l.push(P),r.tokens&&(o[o.length-1].value=P,Hs(o[o.length-1]),g.maxDepth+=o[o.length-1].depth)}g.slashes=a,g.parts=l}return g},\"scan\");Us.exports=nc});var zs=L((_h,Bs)=>{\"use strict\";var bt=Be(),J=ze(),{MAX_LENGTH:At,POSIX_REGEX_SOURCE:ac,REGEX_NON_SPECIAL_CHARS:oc,REGEX_SPECIAL_CHARS_BACKREF:lc,REPLACEMENTS:$s}=bt,cc=n((e,t)=>{if(typeof t.expandRange==\"function\")return t.expandRange(...e,t);e.sort();let r=`[${e.join(\"-\")}]`;try{new RegExp(r)}catch{return e.map(s=>J.escapeRegex(s)).join(\"..\")}return r},\"expandRange\"),Te=n((e,t)=>`Missing ${e}: \"${t}\" - use \"\\\\\\\\${t}\" to match literal characters`,\"syntaxError\"),Pr=n((e,t)=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");e=$s[e]||e;let r={...t},i=typeof r.maxLength==\"number\"?Math.min(At,r.maxLength):At,s=e.length;if(s>i)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${i}`);let a={type:\"bos\",value:\"\",output:r.prepend||\"\"},o=[a],l=r.capture?\"\":\"?:\",c=J.isWindows(t),u=bt.globChars(c),p=bt.extglobChars(u),{DOT_LITERAL:d,PLUS_LITERAL:f,SLASH_LITERAL:E,ONE_CHAR:b,DOTS_SLASH:y,NO_DOT:x,NO_DOT_SLASH:R,NO_DOTS_SLASH:T,QMARK:w,QMARK_NO_DOT:q,STAR:k,START_ANCHOR:V}=u,D=n(v=>`(${l}(?:(?!${V}${v.dot?y:d}).)*?)`,\"globstar\"),S=r.dot?\"\":x,_=r.dot?w:q,I=r.bash===!0?D(r):k;r.capture&&(I=`(${I})`),typeof r.noext==\"boolean\"&&(r.noextglob=r.noext);let m={input:e,index:-1,start:0,dot:r.dot===!0,consumed:\"\",output:\"\",prefix:\"\",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};e=J.removePrefix(e,m),s=e.length;let U=[],H=[],ge=[],h=a,g,Q=n(()=>m.index===s-1,\"eos\"),P=m.peek=(v=1)=>e[m.index+v],ae=m.advance=()=>e[++m.index]||\"\",oe=n(()=>e.slice(m.index+1),\"remaining\"),X=n((v=\"\",M=0)=>{m.consumed+=v,m.index+=M},\"consume\"),tt=n(v=>{m.output+=v.output!=null?v.output:v.value,X(v.value)},\"append\"),ba=n(()=>{let v=1;for(;P()===\"!\"&&(P(2)!==\"(\"||P(3)===\"?\");)ae(),m.start++,v++;return v%2===0?!1:(m.negated=!0,m.start++,!0)},\"negate\"),rt=n(v=>{m[v]++,ge.push(v)},\"increment\"),be=n(v=>{m[v]--,ge.pop()},\"decrement\"),O=n(v=>{if(h.type===\"globstar\"){let M=m.braces>0&&(v.type===\"comma\"||v.type===\"brace\"),A=v.extglob===!0||U.length&&(v.type===\"pipe\"||v.type===\"paren\");v.type!==\"slash\"&&v.type!==\"paren\"&&!M&&!A&&(m.output=m.output.slice(0,-h.output.length),h.type=\"star\",h.value=\"*\",h.output=I,m.output+=h.output)}if(U.length&&v.type!==\"paren\"&&(U[U.length-1].inner+=v.value),(v.value||v.output)&&tt(v),h&&h.type===\"text\"&&v.type===\"text\"){h.value+=v.value,h.output=(h.output||\"\")+v.value;return}v.prev=h,o.push(v),h=v},\"push\"),it=n((v,M)=>{let A={...p[M],conditions:1,inner:\"\"};A.prev=h,A.parens=m.parens,A.output=m.output;let C=(r.capture?\"(\":\"\")+A.open;rt(\"parens\"),O({type:v,value:M,output:m.output?\"\":b}),O({type:\"paren\",extglob:!0,value:ae(),output:C}),U.push(A)},\"extglobOpen\"),Aa=n(v=>{let M=v.close+(r.capture?\")\":\"\"),A;if(v.type===\"negate\"){let C=I;if(v.inner&&v.inner.length>1&&v.inner.includes(\"/\")&&(C=D(r)),(C!==I||Q()||/^\\)+$/.test(oe()))&&(M=v.close=`)$))${C}`),v.inner.includes(\"*\")&&(A=oe())&&/^\\.[^\\\\/.]+$/.test(A)){let $=Pr(A,{...t,fastpaths:!1}).output;M=v.close=`)${$})${C})`}v.prev.type===\"bos\"&&(m.negatedExtglob=!0)}O({type:\"paren\",extglob:!0,value:g,output:M}),be(\"parens\")},\"extglobClose\");if(r.fastpaths!==!1&&!/(^[*!]|[/()[\\]{}\"])/.test(e)){let v=!1,M=e.replace(lc,(A,C,$,K,j,Vt)=>K===\"\\\\\"?(v=!0,A):K===\"?\"?C?C+K+(j?w.repeat(j.length):\"\"):Vt===0?_+(j?w.repeat(j.length):\"\"):w.repeat($.length):K===\".\"?d.repeat($.length):K===\"*\"?C?C+K+(j?I:\"\"):I:C?A:`\\\\${A}`);return v===!0&&(r.unescape===!0?M=M.replace(/\\\\/g,\"\"):M=M.replace(/\\\\+/g,A=>A.length%2===0?\"\\\\\\\\\":A?\"\\\\\":\"\")),M===e&&r.contains===!0?(m.output=e,m):(m.output=J.wrapOutput(M,m,t),m)}for(;!Q();){if(g=ae(),g===\"\\0\")continue;if(g===\"\\\\\"){let A=P();if(A===\"/\"&&r.bash!==!0||A===\".\"||A===\";\")continue;if(!A){g+=\"\\\\\",O({type:\"text\",value:g});continue}let C=/^\\\\+/.exec(oe()),$=0;if(C&&C[0].length>2&&($=C[0].length,m.index+=$,$%2!==0&&(g+=\"\\\\\")),r.unescape===!0?g=ae():g+=ae(),m.brackets===0){O({type:\"text\",value:g});continue}}if(m.brackets>0&&(g!==\"]\"||h.value===\"[\"||h.value===\"[^\")){if(r.posix!==!1&&g===\":\"){let A=h.value.slice(1);if(A.includes(\"[\")&&(h.posix=!0,A.includes(\":\"))){let C=h.value.lastIndexOf(\"[\"),$=h.value.slice(0,C),K=h.value.slice(C+2),j=ac[K];if(j){h.value=$+j,m.backtrack=!0,ae(),!a.output&&o.indexOf(h)===1&&(a.output=b);continue}}}(g===\"[\"&&P()!==\":\"||g===\"-\"&&P()===\"]\")&&(g=`\\\\${g}`),g===\"]\"&&(h.value===\"[\"||h.value===\"[^\")&&(g=`\\\\${g}`),r.posix===!0&&g===\"!\"&&h.value===\"[\"&&(g=\"^\"),h.value+=g,tt({value:g});continue}if(m.quotes===1&&g!=='\"'){g=J.escapeRegex(g),h.value+=g,tt({value:g});continue}if(g==='\"'){m.quotes=m.quotes===1?0:1,r.keepQuotes===!0&&O({type:\"text\",value:g});continue}if(g===\"(\"){rt(\"parens\"),O({type:\"paren\",value:g});continue}if(g===\")\"){if(m.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Te(\"opening\",\"(\"));let A=U[U.length-1];if(A&&m.parens===A.parens+1){Aa(U.pop());continue}O({type:\"paren\",value:g,output:m.parens?\")\":\"\\\\)\"}),be(\"parens\");continue}if(g===\"[\"){if(r.nobracket===!0||!oe().includes(\"]\")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\"]\"));g=`\\\\${g}`}else rt(\"brackets\");O({type:\"bracket\",value:g});continue}if(g===\"]\"){if(r.nobracket===!0||h&&h.type===\"bracket\"&&h.value.length===1){O({type:\"text\",value:g,output:`\\\\${g}`});continue}if(m.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"opening\",\"[\"));O({type:\"text\",value:g,output:`\\\\${g}`});continue}be(\"brackets\");let A=h.value.slice(1);if(h.posix!==!0&&A[0]===\"^\"&&!A.includes(\"/\")&&(g=`/${g}`),h.value+=g,tt({value:g}),r.literalBrackets===!1||J.hasRegexChars(A))continue;let C=J.escapeRegex(h.value);if(m.output=m.output.slice(0,-h.value.length),r.literalBrackets===!0){m.output+=C,h.value=C;continue}h.value=`(${l}${C}|${h.value})`,m.output+=h.value;continue}if(g===\"{\"&&r.nobrace!==!0){rt(\"braces\");let A={type:\"brace\",value:g,output:\"(\",outputIndex:m.output.length,tokensIndex:m.tokens.length};H.push(A),O(A);continue}if(g===\"}\"){let A=H[H.length-1];if(r.nobrace===!0||!A){O({type:\"text\",value:g,output:g});continue}let C=\")\";if(A.dots===!0){let $=o.slice(),K=[];for(let j=$.length-1;j>=0&&(o.pop(),$[j].type!==\"brace\");j--)$[j].type!==\"dots\"&&K.unshift($[j].value);C=cc(K,r),m.backtrack=!0}if(A.comma!==!0&&A.dots!==!0){let $=m.output.slice(0,A.outputIndex),K=m.tokens.slice(A.tokensIndex);A.value=A.output=\"\\\\{\",g=C=\"\\\\}\",m.output=$;for(let j of K)m.output+=j.output||j.value}O({type:\"brace\",value:g,output:C}),be(\"braces\"),H.pop();continue}if(g===\"|\"){U.length>0&&U[U.length-1].conditions++,O({type:\"text\",value:g});continue}if(g===\",\"){let A=g,C=H[H.length-1];C&&ge[ge.length-1]===\"braces\"&&(C.comma=!0,A=\"|\"),O({type:\"comma\",value:g,output:A});continue}if(g===\"/\"){if(h.type===\"dot\"&&m.index===m.start+1){m.start=m.index+1,m.consumed=\"\",m.output=\"\",o.pop(),h=a;continue}O({type:\"slash\",value:g,output:E});continue}if(g===\".\"){if(m.braces>0&&h.type===\"dot\"){h.value===\".\"&&(h.output=d);let A=H[H.length-1];h.type=\"dots\",h.output+=g,h.value+=g,A.dots=!0;continue}if(m.braces+m.parens===0&&h.type!==\"bos\"&&h.type!==\"slash\"){O({type:\"text\",value:g,output:d});continue}O({type:\"dot\",value:g,output:d});continue}if(g===\"?\"){if(!(h&&h.value===\"(\")&&r.noextglob!==!0&&P()===\"(\"&&P(2)!==\"?\"){it(\"qmark\",g);continue}if(h&&h.type===\"paren\"){let C=P(),$=g;if(C===\"<\"&&!J.supportsLookbehinds())throw new Error(\"Node.js v10 or higher is required for regex lookbehinds\");(h.value===\"(\"&&!/[!=<:]/.test(C)||C===\"<\"&&!/<([!=]|\\w+>)/.test(oe()))&&($=`\\\\${g}`),O({type:\"text\",value:g,output:$});continue}if(r.dot!==!0&&(h.type===\"slash\"||h.type===\"bos\")){O({type:\"qmark\",value:g,output:q});continue}O({type:\"qmark\",value:g,output:w});continue}if(g===\"!\"){if(r.noextglob!==!0&&P()===\"(\"&&(P(2)!==\"?\"||!/[!=<:]/.test(P(3)))){it(\"negate\",g);continue}if(r.nonegate!==!0&&m.index===0){ba();continue}}if(g===\"+\"){if(r.noextglob!==!0&&P()===\"(\"&&P(2)!==\"?\"){it(\"plus\",g);continue}if(h&&h.value===\"(\"||r.regex===!1){O({type:\"plus\",value:g,output:f});continue}if(h&&(h.type===\"bracket\"||h.type===\"paren\"||h.type===\"brace\")||m.parens>0){O({type:\"plus\",value:g});continue}O({type:\"plus\",value:f});continue}if(g===\"@\"){if(r.noextglob!==!0&&P()===\"(\"&&P(2)!==\"?\"){O({type:\"at\",extglob:!0,value:g,output:\"\"});continue}O({type:\"text\",value:g});continue}if(g!==\"*\"){(g===\"$\"||g===\"^\")&&(g=`\\\\${g}`);let A=oc.exec(oe());A&&(g+=A[0],m.index+=A[0].length),O({type:\"text\",value:g});continue}if(h&&(h.type===\"globstar\"||h.star===!0)){h.type=\"star\",h.star=!0,h.value+=g,h.output=I,m.backtrack=!0,m.globstar=!0,X(g);continue}let v=oe();if(r.noextglob!==!0&&/^\\([^?]/.test(v)){it(\"star\",g);continue}if(h.type===\"star\"){if(r.noglobstar===!0){X(g);continue}let A=h.prev,C=A.prev,$=A.type===\"slash\"||A.type===\"bos\",K=C&&(C.type===\"star\"||C.type===\"globstar\");if(r.bash===!0&&(!$||v[0]&&v[0]!==\"/\")){O({type:\"star\",value:g,output:\"\"});continue}let j=m.braces>0&&(A.type===\"comma\"||A.type===\"brace\"),Vt=U.length&&(A.type===\"pipe\"||A.type===\"paren\");if(!$&&A.type!==\"paren\"&&!j&&!Vt){O({type:\"star\",value:g,output:\"\"});continue}for(;v.slice(0,3)===\"/**\";){let st=e[m.index+4];if(st&&st!==\"/\")break;v=v.slice(3),X(\"/**\",3)}if(A.type===\"bos\"&&Q()){h.type=\"globstar\",h.value+=g,h.output=D(r),m.output=h.output,m.globstar=!0,X(g);continue}if(A.type===\"slash\"&&A.prev.type!==\"bos\"&&!K&&Q()){m.output=m.output.slice(0,-(A.output+h.output).length),A.output=`(?:${A.output}`,h.type=\"globstar\",h.output=D(r)+(r.strictSlashes?\")\":\"|$)\"),h.value+=g,m.globstar=!0,m.output+=A.output+h.output,X(g);continue}if(A.type===\"slash\"&&A.prev.type!==\"bos\"&&v[0]===\"/\"){let st=v[1]!==void 0?\"|$\":\"\";m.output=m.output.slice(0,-(A.output+h.output).length),A.output=`(?:${A.output}`,h.type=\"globstar\",h.output=`${D(r)}${E}|${E}${st})`,h.value+=g,m.output+=A.output+h.output,m.globstar=!0,X(g+ae()),O({type:\"slash\",value:\"/\",output:\"\"});continue}if(A.type===\"bos\"&&v[0]===\"/\"){h.type=\"globstar\",h.value+=g,h.output=`(?:^|${E}|${D(r)}${E})`,m.output=h.output,m.globstar=!0,X(g+ae()),O({type:\"slash\",value:\"/\",output:\"\"});continue}m.output=m.output.slice(0,-h.output.length),h.type=\"globstar\",h.output=D(r),h.value+=g,m.output+=h.output,m.globstar=!0,X(g);continue}let M={type:\"star\",value:g,output:I};if(r.bash===!0){M.output=\".*?\",(h.type===\"bos\"||h.type===\"slash\")&&(M.output=S+M.output),O(M);continue}if(h&&(h.type===\"bracket\"||h.type===\"paren\")&&r.regex===!0){M.output=g,O(M);continue}(m.index===m.start||h.type===\"slash\"||h.type===\"dot\")&&(h.type===\"dot\"?(m.output+=R,h.output+=R):r.dot===!0?(m.output+=T,h.output+=T):(m.output+=S,h.output+=S),P()!==\"*\"&&(m.output+=b,h.output+=b)),O(M)}for(;m.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\"]\"));m.output=J.escapeLast(m.output,\"[\"),be(\"brackets\")}for(;m.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\")\"));m.output=J.escapeLast(m.output,\"(\"),be(\"parens\")}for(;m.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Te(\"closing\",\"}\"));m.output=J.escapeLast(m.output,\"{\"),be(\"braces\")}if(r.strictSlashes!==!0&&(h.type===\"star\"||h.type===\"bracket\")&&O({type:\"maybe_slash\",value:\"\",output:`${E}?`}),m.backtrack===!0){m.output=\"\";for(let v of m.tokens)m.output+=v.output!=null?v.output:v.value,v.suffix&&(m.output+=v.suffix)}return m},\"parse\");Pr.fastpaths=(e,t)=>{let r={...t},i=typeof r.maxLength==\"number\"?Math.min(At,r.maxLength):At,s=e.length;if(s>i)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${i}`);e=$s[e]||e;let a=J.isWindows(t),{DOT_LITERAL:o,SLASH_LITERAL:l,ONE_CHAR:c,DOTS_SLASH:u,NO_DOT:p,NO_DOTS:d,NO_DOTS_SLASH:f,STAR:E,START_ANCHOR:b}=bt.globChars(a),y=r.dot?d:p,x=r.dot?f:p,R=r.capture?\"\":\"?:\",T={negated:!1,prefix:\"\"},w=r.bash===!0?\".*?\":E;r.capture&&(w=`(${w})`);let q=n(S=>S.noglobstar===!0?w:`(${R}(?:(?!${b}${S.dot?u:o}).)*?)`,\"globstar\"),k=n(S=>{switch(S){case\"*\":return`${y}${c}${w}`;case\".*\":return`${o}${c}${w}`;case\"*.*\":return`${y}${w}${o}${c}${w}`;case\"*/*\":return`${y}${w}${l}${c}${x}${w}`;case\"**\":return y+q(r);case\"**/*\":return`(?:${y}${q(r)}${l})?${x}${c}${w}`;case\"**/*.*\":return`(?:${y}${q(r)}${l})?${x}${w}${o}${c}${w}`;case\"**/.*\":return`(?:${y}${q(r)}${l})?${o}${c}${w}`;default:{let _=/^(.*?)\\.(\\w+)$/.exec(S);if(!_)return;let I=k(_[1]);return I?I+o+_[2]:void 0}}},\"create\"),V=J.removePrefix(e,T),D=k(V);return D&&r.strictSlashes!==!0&&(D+=`${l}?`),D};Bs.exports=Pr});var Vs=L((Ph,Gs)=>{\"use strict\";var uc=require(\"path\"),pc=Fs(),Lr=zs(),Nr=ze(),fc=Be(),dc=n(e=>e&&typeof e==\"object\"&&!Array.isArray(e),\"isObject\"),z=n((e,t,r=!1)=>{if(Array.isArray(e)){let p=e.map(f=>z(f,t,r));return n(f=>{for(let E of p){let b=E(f);if(b)return b}return!1},\"arrayMatcher\")}let i=dc(e)&&e.tokens&&e.input;if(e===\"\"||typeof e!=\"string\"&&!i)throw new TypeError(\"Expected pattern to be a non-empty string\");let s=t||{},a=Nr.isWindows(t),o=i?z.compileRe(e,t):z.makeRe(e,t,!1,!0),l=o.state;delete o.state;let c=n(()=>!1,\"isIgnored\");if(s.ignore){let p={...t,ignore:null,onMatch:null,onResult:null};c=z(s.ignore,p,r)}let u=n((p,d=!1)=>{let{isMatch:f,match:E,output:b}=z.test(p,o,t,{glob:e,posix:a}),y={glob:e,state:l,regex:o,posix:a,input:p,output:b,match:E,isMatch:f};return typeof s.onResult==\"function\"&&s.onResult(y),f===!1?(y.isMatch=!1,d?y:!1):c(p)?(typeof s.onIgnore==\"function\"&&s.onIgnore(y),y.isMatch=!1,d?y:!1):(typeof s.onMatch==\"function\"&&s.onMatch(y),d?y:!0)},\"matcher\");return r&&(u.state=l),u},\"picomatch\");z.test=(e,t,r,{glob:i,posix:s}={})=>{if(typeof e!=\"string\")throw new TypeError(\"Expected input to be a string\");if(e===\"\")return{isMatch:!1,output:\"\"};let a=r||{},o=a.format||(s?Nr.toPosixSlashes:null),l=e===i,c=l&&o?o(e):e;return l===!1&&(c=o?o(e):e,l=c===i),(l===!1||a.capture===!0)&&(a.matchBase===!0||a.basename===!0?l=z.matchBase(e,t,r,s):l=t.exec(c)),{isMatch:!!l,match:l,output:c}};z.matchBase=(e,t,r,i=Nr.isWindows(r))=>(t instanceof RegExp?t:z.makeRe(t,r)).test(uc.basename(e));z.isMatch=(e,t,r)=>z(t,r)(e);z.parse=(e,t)=>Array.isArray(e)?e.map(r=>z.parse(r,t)):Lr(e,{...t,fastpaths:!1});z.scan=(e,t)=>pc(e,t);z.compileRe=(e,t,r=!1,i=!1)=>{if(r===!0)return e.output;let s=t||{},a=s.contains?\"\":\"^\",o=s.contains?\"\":\"$\",l=`${a}(?:${e.output})${o}`;e&&e.negated===!0&&(l=`^(?!${l}).*$`);let c=z.toRegex(l,t);return i===!0&&(c.state=e),c};z.makeRe=(e,t={},r=!1,i=!1)=>{if(!e||typeof e!=\"string\")throw new TypeError(\"Expected a non-empty string\");let s={negated:!1,fastpaths:!0};return t.fastpaths!==!1&&(e[0]===\".\"||e[0]===\"*\")&&(s.output=Lr.fastpaths(e,t)),s.output||(s=Lr(e,t)),z.compileRe(s,t,r,i)};z.toRegex=(e,t)=>{try{let r=t||{};return new RegExp(e,r.flags||(r.nocase?\"i\":\"\"))}catch(r){if(t&&t.debug===!0)throw r;return/$^/}};z.constants=fc;Gs.exports=z});var Qs=L((Nh,js)=>{\"use strict\";js.exports=Vs()});var Zs=L((qh,Xs)=>{\"use strict\";var Ws=require(\"util\"),Ys=Cs(),ue=Qs(),qr=ze(),Ks=n(e=>e===\"\"||e===\"./\",\"isEmptyString\"),F=n((e,t,r)=>{t=[].concat(t),e=[].concat(e);let i=new Set,s=new Set,a=new Set,o=0,l=n(p=>{a.add(p.output),r&&r.onResult&&r.onResult(p)},\"onResult\");for(let p=0;p<t.length;p++){let d=ue(String(t[p]),{...r,onResult:l},!0),f=d.state.negated||d.state.negatedExtglob;f&&o++;for(let E of e){let b=d(E,!0);(f?!b.isMatch:b.isMatch)&&(f?i.add(b.output):(i.delete(b.output),s.add(b.output)))}}let u=(o===t.length?[...a]:[...s]).filter(p=>!i.has(p));if(r&&u.length===0){if(r.failglob===!0)throw new Error(`No matches found for \"${t.join(\", \")}\"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?t.map(p=>p.replace(/\\\\/g,\"\")):t}return u},\"micromatch\");F.match=F;F.matcher=(e,t)=>ue(e,t);F.isMatch=(e,t,r)=>ue(t,r)(e);F.any=F.isMatch;F.not=(e,t,r={})=>{t=[].concat(t).map(String);let i=new Set,s=[],a=n(l=>{r.onResult&&r.onResult(l),s.push(l.output)},\"onResult\"),o=new Set(F(e,t,{...r,onResult:a}));for(let l of s)o.has(l)||i.add(l);return[...i]};F.contains=(e,t,r)=>{if(typeof e!=\"string\")throw new TypeError(`Expected a string: \"${Ws.inspect(e)}\"`);if(Array.isArray(t))return t.some(i=>F.contains(e,i,r));if(typeof t==\"string\"){if(Ks(e)||Ks(t))return!1;if(e.includes(t)||e.startsWith(\"./\")&&e.slice(2).includes(t))return!0}return F.isMatch(e,t,{...r,contains:!0})};F.matchKeys=(e,t,r)=>{if(!qr.isObject(e))throw new TypeError(\"Expected the first argument to be an object\");let i=F(Object.keys(e),t,r),s={};for(let a of i)s[a]=e[a];return s};F.some=(e,t,r)=>{let i=[].concat(e);for(let s of[].concat(t)){let a=ue(String(s),r);if(i.some(o=>a(o)))return!0}return!1};F.every=(e,t,r)=>{let i=[].concat(e);for(let s of[].concat(t)){let a=ue(String(s),r);if(!i.every(o=>a(o)))return!1}return!0};F.all=(e,t,r)=>{if(typeof e!=\"string\")throw new TypeError(`Expected a string: \"${Ws.inspect(e)}\"`);return[].concat(t).every(i=>ue(i,r)(e))};F.capture=(e,t,r)=>{let i=qr.isWindows(r),a=ue.makeRe(String(e),{...r,capture:!0}).exec(i?qr.toPosixSlashes(t):t);if(a)return a.slice(1).map(o=>o===void 0?\"\":o)};F.makeRe=(...e)=>ue.makeRe(...e);F.scan=(...e)=>ue.scan(...e);F.parse=(e,t)=>{let r=[];for(let i of[].concat(e||[]))for(let s of Ys(String(i),t))r.push(ue.parse(s,t));return r};F.braces=(e,t)=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");return t&&t.nobrace===!0||!/\\{.*\\}/.test(e)?[e]:Ys(e,t)};F.braceExpand=(e,t)=>{if(typeof e!=\"string\")throw new TypeError(\"Expected a string\");return F.braces(e,{...t,expand:!0})};Xs.exports=F});var rn=L((Dh,tn)=>{\"use strict\";var hc=n(function(t){return gc(t)&&!mc(t)},\"isMergeableObject\");function gc(e){return!!e&&typeof e==\"object\"}n(gc,\"isNonNullObject\");function mc(e){var t=Object.prototype.toString.call(e);return t===\"[object RegExp]\"||t===\"[object Date]\"||Ac(e)}n(mc,\"isSpecial\");var yc=typeof Symbol==\"function\"&&Symbol.for,bc=yc?Symbol.for(\"react.element\"):60103;function Ac(e){return e.$$typeof===bc}n(Ac,\"isReactElement\");function Ec(e){return Array.isArray(e)?[]:{}}n(Ec,\"emptyTarget\");function Ve(e,t){return t.clone!==!1&&t.isMergeableObject(e)?Ce(Ec(e),e,t):e}n(Ve,\"cloneUnlessOtherwiseSpecified\");function xc(e,t,r){return e.concat(t).map(function(i){return Ve(i,r)})}n(xc,\"defaultArrayMerge\");function vc(e,t){if(!t.customMerge)return Ce;var r=t.customMerge(e);return typeof r==\"function\"?r:Ce}n(vc,\"getMergeFunction\");function Rc(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[]}n(Rc,\"getEnumerableOwnPropertySymbols\");function Js(e){return Object.keys(e).concat(Rc(e))}n(Js,\"getKeys\");function en(e,t){try{return t in e}catch{return!1}}n(en,\"propertyIsOnObject\");function wc(e,t){return en(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))}n(wc,\"propertyIsUnsafe\");function Sc(e,t,r){var i={};return r.isMergeableObject(e)&&Js(e).forEach(function(s){i[s]=Ve(e[s],r)}),Js(t).forEach(function(s){wc(e,s)||(en(e,s)&&r.isMergeableObject(t[s])?i[s]=vc(s,r)(e[s],t[s],r):i[s]=Ve(t[s],r))}),i}n(Sc,\"mergeObject\");function Ce(e,t,r){r=r||{},r.arrayMerge=r.arrayMerge||xc,r.isMergeableObject=r.isMergeableObject||hc,r.cloneUnlessOtherwiseSpecified=Ve;var i=Array.isArray(t),s=Array.isArray(e),a=i===s;return a?i?r.arrayMerge(e,t,r):Sc(e,t,r):Ve(t,r)}n(Ce,\"deepmerge\");Ce.all=n(function(t,r){if(!Array.isArray(t))throw new Error(\"first argument should be an array\");return t.reduce(function(i,s){return Ce(i,s,r)},{})},\"deepmergeAll\");var Tc=Ce;tn.exports=Tc});var sn=L(Et=>{\"use strict\";Object.defineProperty(Et,\"__esModule\",{value:!0});Et.bodyRegExps={xml:/&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&notin;|&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&centerdot;|&copysr;|&divideontimes;|&gtcc;|&gtcir;|&gtdot;|&gtlPar;|&gtquest;|&gtrapprox;|&gtrarr;|&gtrdot;|&gtreqless;|&gtreqqless;|&gtrless;|&gtrsim;|&ltcc;|&ltcir;|&ltdot;|&lthree;|&ltimes;|&ltlarr;|&ltquest;|&ltrPar;|&ltri;|&ltrie;|&ltrif;|&notin;|&notinE;|&notindot;|&notinva;|&notinvb;|&notinvc;|&notni;|&notniva;|&notnivb;|&notnivc;|&parallel;|&timesb;|&timesbar;|&timesd;|&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);?/g};Et.namedReferences={xml:{entities:{\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&apos;\":\"'\",\"&amp;\":\"&\"},characters:{\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"&\":\"&amp;\"}},html4:{entities:{\"&apos;\":\"'\",\"&nbsp\":\"\\xA0\",\"&nbsp;\":\"\\xA0\",\"&iexcl\":\"\\xA1\",\"&iexcl;\":\"\\xA1\",\"&cent\":\"\\xA2\",\"&cent;\":\"\\xA2\",\"&pound\":\"\\xA3\",\"&pound;\":\"\\xA3\",\"&curren\":\"\\xA4\",\"&curren;\":\"\\xA4\",\"&yen\":\"\\xA5\",\"&yen;\":\"\\xA5\",\"&brvbar\":\"\\xA6\",\"&brvbar;\":\"\\xA6\",\"&sect\":\"\\xA7\",\"&sect;\":\"\\xA7\",\"&uml\":\"\\xA8\",\"&uml;\":\"\\xA8\",\"&copy\":\"\\xA9\",\"&copy;\":\"\\xA9\",\"&ordf\":\"\\xAA\",\"&ordf;\":\"\\xAA\",\"&laquo\":\"\\xAB\",\"&laquo;\":\"\\xAB\",\"&not\":\"\\xAC\",\"&not;\":\"\\xAC\",\"&shy\":\"\\xAD\",\"&shy;\":\"\\xAD\",\"&reg\":\"\\xAE\",\"&reg;\":\"\\xAE\",\"&macr\":\"\\xAF\",\"&macr;\":\"\\xAF\",\"&deg\":\"\\xB0\",\"&deg;\":\"\\xB0\",\"&plusmn\":\"\\xB1\",\"&plusmn;\":\"\\xB1\",\"&sup2\":\"\\xB2\",\"&sup2;\":\"\\xB2\",\"&sup3\":\"\\xB3\",\"&sup3;\":\"\\xB3\",\"&acute\":\"\\xB4\",\"&acute;\":\"\\xB4\",\"&micro\":\"\\xB5\",\"&micro;\":\"\\xB5\",\"&para\":\"\\xB6\",\"&para;\":\"\\xB6\",\"&middot\":\"\\xB7\",\"&middot;\":\"\\xB7\",\"&cedil\":\"\\xB8\",\"&cedil;\":\"\\xB8\",\"&sup1\":\"\\xB9\",\"&sup1;\":\"\\xB9\",\"&ordm\":\"\\xBA\",\"&ordm;\":\"\\xBA\",\"&raquo\":\"\\xBB\",\"&raquo;\":\"\\xBB\",\"&frac14\":\"\\xBC\",\"&frac14;\":\"\\xBC\",\"&frac12\":\"\\xBD\",\"&frac12;\":\"\\xBD\",\"&frac34\":\"\\xBE\",\"&frac34;\":\"\\xBE\",\"&iquest\":\"\\xBF\",\"&iquest;\":\"\\xBF\",\"&Agrave\":\"\\xC0\",\"&Agrave;\":\"\\xC0\",\"&Aacute\":\"\\xC1\",\"&Aacute;\":\"\\xC1\",\"&Acirc\":\"\\xC2\",\"&Acirc;\":\"\\xC2\",\"&Atilde\":\"\\xC3\",\"&Atilde;\":\"\\xC3\",\"&Auml\":\"\\xC4\",\"&Auml;\":\"\\xC4\",\"&Aring\":\"\\xC5\",\"&Aring;\":\"\\xC5\",\"&AElig\":\"\\xC6\",\"&AElig;\":\"\\xC6\",\"&Ccedil\":\"\\xC7\",\"&Ccedil;\":\"\\xC7\",\"&Egrave\":\"\\xC8\",\"&Egrave;\":\"\\xC8\",\"&Eacute\":\"\\xC9\",\"&Eacute;\":\"\\xC9\",\"&Ecirc\":\"\\xCA\",\"&Ecirc;\":\"\\xCA\",\"&Euml\":\"\\xCB\",\"&Euml;\":\"\\xCB\",\"&Igrave\":\"\\xCC\",\"&Igrave;\":\"\\xCC\",\"&Iacute\":\"\\xCD\",\"&Iacute;\":\"\\xCD\",\"&Icirc\":\"\\xCE\",\"&Icirc;\":\"\\xCE\",\"&Iuml\":\"\\xCF\",\"&Iuml;\":\"\\xCF\",\"&ETH\":\"\\xD0\",\"&ETH;\":\"\\xD0\",\"&Ntilde\":\"\\xD1\",\"&Ntilde;\":\"\\xD1\",\"&Ograve\":\"\\xD2\",\"&Ograve;\":\"\\xD2\",\"&Oacute\":\"\\xD3\",\"&Oacute;\":\"\\xD3\",\"&Ocirc\":\"\\xD4\",\"&Ocirc;\":\"\\xD4\",\"&Otilde\":\"\\xD5\",\"&Otilde;\":\"\\xD5\",\"&Ouml\":\"\\xD6\",\"&Ouml;\":\"\\xD6\",\"&times\":\"\\xD7\",\"&times;\":\"\\xD7\",\"&Oslash\":\"\\xD8\",\"&Oslash;\":\"\\xD8\",\"&Ugrave\":\"\\xD9\",\"&Ugrave;\":\"\\xD9\",\"&Uacute\":\"\\xDA\",\"&Uacute;\":\"\\xDA\",\"&Ucirc\":\"\\xDB\",\"&Ucirc;\":\"\\xDB\",\"&Uuml\":\"\\xDC\",\"&Uuml;\":\"\\xDC\",\"&Yacute\":\"\\xDD\",\"&Yacute;\":\"\\xDD\",\"&THORN\":\"\\xDE\",\"&THORN;\":\"\\xDE\",\"&szlig\":\"\\xDF\",\"&szlig;\":\"\\xDF\",\"&agrave\":\"\\xE0\",\"&agrave;\":\"\\xE0\",\"&aacute\":\"\\xE1\",\"&aacute;\":\"\\xE1\",\"&acirc\":\"\\xE2\",\"&acirc;\":\"\\xE2\",\"&atilde\":\"\\xE3\",\"&atilde;\":\"\\xE3\",\"&auml\":\"\\xE4\",\"&auml;\":\"\\xE4\",\"&aring\":\"\\xE5\",\"&aring;\":\"\\xE5\",\"&aelig\":\"\\xE6\",\"&aelig;\":\"\\xE6\",\"&ccedil\":\"\\xE7\",\"&ccedil;\":\"\\xE7\",\"&egrave\":\"\\xE8\",\"&egrave;\":\"\\xE8\",\"&eacute\":\"\\xE9\",\"&eacute;\":\"\\xE9\",\"&ecirc\":\"\\xEA\",\"&ecirc;\":\"\\xEA\",\"&euml\":\"\\xEB\",\"&euml;\":\"\\xEB\",\"&igrave\":\"\\xEC\",\"&igrave;\":\"\\xEC\",\"&iacute\":\"\\xED\",\"&iacute;\":\"\\xED\",\"&icirc\":\"\\xEE\",\"&icirc;\":\"\\xEE\",\"&iuml\":\"\\xEF\",\"&iuml;\":\"\\xEF\",\"&eth\":\"\\xF0\",\"&eth;\":\"\\xF0\",\"&ntilde\":\"\\xF1\",\"&ntilde;\":\"\\xF1\",\"&ograve\":\"\\xF2\",\"&ograve;\":\"\\xF2\",\"&oacute\":\"\\xF3\",\"&oacute;\":\"\\xF3\",\"&ocirc\":\"\\xF4\",\"&ocirc;\":\"\\xF4\",\"&otilde\":\"\\xF5\",\"&otilde;\":\"\\xF5\",\"&ouml\":\"\\xF6\",\"&ouml;\":\"\\xF6\",\"&divide\":\"\\xF7\",\"&divide;\":\"\\xF7\",\"&oslash\":\"\\xF8\",\"&oslash;\":\"\\xF8\",\"&ugrave\":\"\\xF9\",\"&ugrave;\":\"\\xF9\",\"&uacute\":\"\\xFA\",\"&uacute;\":\"\\xFA\",\"&ucirc\":\"\\xFB\",\"&ucirc;\":\"\\xFB\",\"&uuml\":\"\\xFC\",\"&uuml;\":\"\\xFC\",\"&yacute\":\"\\xFD\",\"&yacute;\":\"\\xFD\",\"&thorn\":\"\\xFE\",\"&thorn;\":\"\\xFE\",\"&yuml\":\"\\xFF\",\"&yuml;\":\"\\xFF\",\"&quot\":'\"',\"&quot;\":'\"',\"&amp\":\"&\",\"&amp;\":\"&\",\"&lt\":\"<\",\"&lt;\":\"<\",\"&gt\":\">\",\"&gt;\":\">\",\"&OElig;\":\"\\u0152\",\"&oelig;\":\"\\u0153\",\"&Scaron;\":\"\\u0160\",\"&scaron;\":\"\\u0161\",\"&Yuml;\":\"\\u0178\",\"&circ;\":\"\\u02C6\",\"&tilde;\":\"\\u02DC\",\"&ensp;\":\"\\u2002\",\"&emsp;\":\"\\u2003\",\"&thinsp;\":\"\\u2009\",\"&zwnj;\":\"\\u200C\",\"&zwj;\":\"\\u200D\",\"&lrm;\":\"\\u200E\",\"&rlm;\":\"\\u200F\",\"&ndash;\":\"\\u2013\",\"&mdash;\":\"\\u2014\",\"&lsquo;\":\"\\u2018\",\"&rsquo;\":\"\\u2019\",\"&sbquo;\":\"\\u201A\",\"&ldquo;\":\"\\u201C\",\"&rdquo;\":\"\\u201D\",\"&bdquo;\":\"\\u201E\",\"&dagger;\":\"\\u2020\",\"&Dagger;\":\"\\u2021\",\"&permil;\":\"\\u2030\",\"&lsaquo;\":\"\\u2039\",\"&rsaquo;\":\"\\u203A\",\"&euro;\":\"\\u20AC\",\"&fnof;\":\"\\u0192\",\"&Alpha;\":\"\\u0391\",\"&Beta;\":\"\\u0392\",\"&Gamma;\":\"\\u0393\",\"&Delta;\":\"\\u0394\",\"&Epsilon;\":\"\\u0395\",\"&Zeta;\":\"\\u0396\",\"&Eta;\":\"\\u0397\",\"&Theta;\":\"\\u0398\",\"&Iota;\":\"\\u0399\",\"&Kappa;\":\"\\u039A\",\"&Lambda;\":\"\\u039B\",\"&Mu;\":\"\\u039C\",\"&Nu;\":\"\\u039D\",\"&Xi;\":\"\\u039E\",\"&Omicron;\":\"\\u039F\",\"&Pi;\":\"\\u03A0\",\"&Rho;\":\"\\u03A1\",\"&Sigma;\":\"\\u03A3\",\"&Tau;\":\"\\u03A4\",\"&Upsilon;\":\"\\u03A5\",\"&Phi;\":\"\\u03A6\",\"&Chi;\":\"\\u03A7\",\"&Psi;\":\"\\u03A8\",\"&Omega;\":\"\\u03A9\",\"&alpha;\":\"\\u03B1\",\"&beta;\":\"\\u03B2\",\"&gamma;\":\"\\u03B3\",\"&delta;\":\"\\u03B4\",\"&epsilon;\":\"\\u03B5\",\"&zeta;\":\"\\u03B6\",\"&eta;\":\"\\u03B7\",\"&theta;\":\"\\u03B8\",\"&iota;\":\"\\u03B9\",\"&kappa;\":\"\\u03BA\",\"&lambda;\":\"\\u03BB\",\"&mu;\":\"\\u03BC\",\"&nu;\":\"\\u03BD\",\"&xi;\":\"\\u03BE\",\"&omicron;\":\"\\u03BF\",\"&pi;\":\"\\u03C0\",\"&rho;\":\"\\u03C1\",\"&sigmaf;\":\"\\u03C2\",\"&sigma;\":\"\\u03C3\",\"&tau;\":\"\\u03C4\",\"&upsilon;\":\"\\u03C5\",\"&phi;\":\"\\u03C6\",\"&chi;\":\"\\u03C7\",\"&psi;\":\"\\u03C8\",\"&omega;\":\"\\u03C9\",\"&thetasym;\":\"\\u03D1\",\"&upsih;\":\"\\u03D2\",\"&piv;\":\"\\u03D6\",\"&bull;\":\"\\u2022\",\"&hellip;\":\"\\u2026\",\"&prime;\":\"\\u2032\",\"&Prime;\":\"\\u2033\",\"&oline;\":\"\\u203E\",\"&frasl;\":\"\\u2044\",\"&weierp;\":\"\\u2118\",\"&image;\":\"\\u2111\",\"&real;\":\"\\u211C\",\"&trade;\":\"\\u2122\",\"&alefsym;\":\"\\u2135\",\"&larr;\":\"\\u2190\",\"&uarr;\":\"\\u2191\",\"&rarr;\":\"\\u2192\",\"&darr;\":\"\\u2193\",\"&harr;\":\"\\u2194\",\"&crarr;\":\"\\u21B5\",\"&lArr;\":\"\\u21D0\",\"&uArr;\":\"\\u21D1\",\"&rArr;\":\"\\u21D2\",\"&dArr;\":\"\\u21D3\",\"&hArr;\":\"\\u21D4\",\"&forall;\":\"\\u2200\",\"&part;\":\"\\u2202\",\"&exist;\":\"\\u2203\",\"&empty;\":\"\\u2205\",\"&nabla;\":\"\\u2207\",\"&isin;\":\"\\u2208\",\"&notin;\":\"\\u2209\",\"&ni;\":\"\\u220B\",\"&prod;\":\"\\u220F\",\"&sum;\":\"\\u2211\",\"&minus;\":\"\\u2212\",\"&lowast;\":\"\\u2217\",\"&radic;\":\"\\u221A\",\"&prop;\":\"\\u221D\",\"&infin;\":\"\\u221E\",\"&ang;\":\"\\u2220\",\"&and;\":\"\\u2227\",\"&or;\":\"\\u2228\",\"&cap;\":\"\\u2229\",\"&cup;\":\"\\u222A\",\"&int;\":\"\\u222B\",\"&there4;\":\"\\u2234\",\"&sim;\":\"\\u223C\",\"&cong;\":\"\\u2245\",\"&asymp;\":\"\\u2248\",\"&ne;\":\"\\u2260\",\"&equiv;\":\"\\u2261\",\"&le;\":\"\\u2264\",\"&ge;\":\"\\u2265\",\"&sub;\":\"\\u2282\",\"&sup;\":\"\\u2283\",\"&nsub;\":\"\\u2284\",\"&sube;\":\"\\u2286\",\"&supe;\":\"\\u2287\",\"&oplus;\":\"\\u2295\",\"&otimes;\":\"\\u2297\",\"&perp;\":\"\\u22A5\",\"&sdot;\":\"\\u22C5\",\"&lceil;\":\"\\u2308\",\"&rceil;\":\"\\u2309\",\"&lfloor;\":\"\\u230A\",\"&rfloor;\":\"\\u230B\",\"&lang;\":\"\\u2329\",\"&rang;\":\"\\u232A\",\"&loz;\":\"\\u25CA\",\"&spades;\":\"\\u2660\",\"&clubs;\":\"\\u2663\",\"&hearts;\":\"\\u2665\",\"&diams;\":\"\\u2666\"},characters:{\"'\":\"&apos;\",\"\\xA0\":\"&nbsp;\",\"\\xA1\":\"&iexcl;\",\"\\xA2\":\"&cent;\",\"\\xA3\":\"&pound;\",\"\\xA4\":\"&curren;\",\"\\xA5\":\"&yen;\",\"\\xA6\":\"&brvbar;\",\"\\xA7\":\"&sect;\",\"\\xA8\":\"&uml;\",\"\\xA9\":\"&copy;\",\\u00AA:\"&ordf;\",\"\\xAB\":\"&laquo;\",\"\\xAC\":\"&not;\",\"\\xAD\":\"&shy;\",\"\\xAE\":\"&reg;\",\"\\xAF\":\"&macr;\",\"\\xB0\":\"&deg;\",\"\\xB1\":\"&plusmn;\",\"\\xB2\":\"&sup2;\",\"\\xB3\":\"&sup3;\",\"\\xB4\":\"&acute;\",\\u00B5:\"&micro;\",\"\\xB6\":\"&para;\",\"\\xB7\":\"&middot;\",\"\\xB8\":\"&cedil;\",\"\\xB9\":\"&sup1;\",\\u00BA:\"&ordm;\",\"\\xBB\":\"&raquo;\",\"\\xBC\":\"&frac14;\",\"\\xBD\":\"&frac12;\",\"\\xBE\":\"&frac34;\",\"\\xBF\":\"&iquest;\",\\u00C0:\"&Agrave;\",\\u00C1:\"&Aacute;\",\\u00C2:\"&Acirc;\",\\u00C3:\"&Atilde;\",\\u00C4:\"&Auml;\",\\u00C5:\"&Aring;\",\\u00C6:\"&AElig;\",\\u00C7:\"&Ccedil;\",\\u00C8:\"&Egrave;\",\\u00C9:\"&Eacute;\",\\u00CA:\"&Ecirc;\",\\u00CB:\"&Euml;\",\\u00CC:\"&Igrave;\",\\u00CD:\"&Iacute;\",\\u00CE:\"&Icirc;\",\\u00CF:\"&Iuml;\",\\u00D0:\"&ETH;\",\\u00D1:\"&Ntilde;\",\\u00D2:\"&Ograve;\",\\u00D3:\"&Oacute;\",\\u00D4:\"&Ocirc;\",\\u00D5:\"&Otilde;\",\\u00D6:\"&Ouml;\",\"\\xD7\":\"&times;\",\\u00D8:\"&Oslash;\",\\u00D9:\"&Ugrave;\",\\u00DA:\"&Uacute;\",\\u00DB:\"&Ucirc;\",\\u00DC:\"&Uuml;\",\\u00DD:\"&Yacute;\",\\u00DE:\"&THORN;\",\\u00DF:\"&szlig;\",\\u00E0:\"&agrave;\",\\u00E1:\"&aacute;\",\\u00E2:\"&acirc;\",\\u00E3:\"&atilde;\",\\u00E4:\"&auml;\",\\u00E5:\"&aring;\",\\u00E6:\"&aelig;\",\\u00E7:\"&ccedil;\",\\u00E8:\"&egrave;\",\\u00E9:\"&eacute;\",\\u00EA:\"&ecirc;\",\\u00EB:\"&euml;\",\\u00EC:\"&igrave;\",\\u00ED:\"&iacute;\",\\u00EE:\"&icirc;\",\\u00EF:\"&iuml;\",\\u00F0:\"&eth;\",\\u00F1:\"&ntilde;\",\\u00F2:\"&ograve;\",\\u00F3:\"&oacute;\",\\u00F4:\"&ocirc;\",\\u00F5:\"&otilde;\",\\u00F6:\"&ouml;\",\"\\xF7\":\"&divide;\",\\u00F8:\"&oslash;\",\\u00F9:\"&ugrave;\",\\u00FA:\"&uacute;\",\\u00FB:\"&ucirc;\",\\u00FC:\"&uuml;\",\\u00FD:\"&yacute;\",\\u00FE:\"&thorn;\",\\u00FF:\"&yuml;\",'\"':\"&quot;\",\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\\u0152:\"&OElig;\",\\u0153:\"&oelig;\",\\u0160:\"&Scaron;\",\\u0161:\"&scaron;\",\\u0178:\"&Yuml;\",\"\\u02C6\":\"&circ;\",\"\\u02DC\":\"&tilde;\",\"\\u2002\":\"&ensp;\",\"\\u2003\":\"&emsp;\",\"\\u2009\":\"&thinsp;\",\"\\u200C\":\"&zwnj;\",\"\\u200D\":\"&zwj;\",\"\\u200E\":\"&lrm;\",\"\\u200F\":\"&rlm;\",\"\\u2013\":\"&ndash;\",\"\\u2014\":\"&mdash;\",\"\\u2018\":\"&lsquo;\",\"\\u2019\":\"&rsquo;\",\"\\u201A\":\"&sbquo;\",\"\\u201C\":\"&ldquo;\",\"\\u201D\":\"&rdquo;\",\"\\u201E\":\"&bdquo;\",\"\\u2020\":\"&dagger;\",\"\\u2021\":\"&Dagger;\",\"\\u2030\":\"&permil;\",\"\\u2039\":\"&lsaquo;\",\"\\u203A\":\"&rsaquo;\",\"\\u20AC\":\"&euro;\",\\u0192:\"&fnof;\",\\u0391:\"&Alpha;\",\\u0392:\"&Beta;\",\\u0393:\"&Gamma;\",\\u0394:\"&Delta;\",\\u0395:\"&Epsilon;\",\\u0396:\"&Zeta;\",\\u0397:\"&Eta;\",\\u0398:\"&Theta;\",\\u0399:\"&Iota;\",\\u039A:\"&Kappa;\",\\u039B:\"&Lambda;\",\\u039C:\"&Mu;\",\\u039D:\"&Nu;\",\\u039E:\"&Xi;\",\\u039F:\"&Omicron;\",\\u03A0:\"&Pi;\",\\u03A1:\"&Rho;\",\\u03A3:\"&Sigma;\",\\u03A4:\"&Tau;\",\\u03A5:\"&Upsilon;\",\\u03A6:\"&Phi;\",\\u03A7:\"&Chi;\",\\u03A8:\"&Psi;\",\\u03A9:\"&Omega;\",\\u03B1:\"&alpha;\",\\u03B2:\"&beta;\",\\u03B3:\"&gamma;\",\\u03B4:\"&delta;\",\\u03B5:\"&epsilon;\",\\u03B6:\"&zeta;\",\\u03B7:\"&eta;\",\\u03B8:\"&theta;\",\\u03B9:\"&iota;\",\\u03BA:\"&kappa;\",\\u03BB:\"&lambda;\",\\u03BC:\"&mu;\",\\u03BD:\"&nu;\",\\u03BE:\"&xi;\",\\u03BF:\"&omicron;\",\\u03C0:\"&pi;\",\\u03C1:\"&rho;\",\\u03C2:\"&sigmaf;\",\\u03C3:\"&sigma;\",\\u03C4:\"&tau;\",\\u03C5:\"&upsilon;\",\\u03C6:\"&phi;\",\\u03C7:\"&chi;\",\\u03C8:\"&psi;\",\\u03C9:\"&omega;\",\\u03D1:\"&thetasym;\",\\u03D2:\"&upsih;\",\\u03D6:\"&piv;\",\"\\u2022\":\"&bull;\",\"\\u2026\":\"&hellip;\",\"\\u2032\":\"&prime;\",\"\\u2033\":\"&Prime;\",\"\\u203E\":\"&oline;\",\"\\u2044\":\"&frasl;\",\"\\u2118\":\"&weierp;\",\\u2111:\"&image;\",\\u211C:\"&real;\",\"\\u2122\":\"&trade;\",\\u2135:\"&alefsym;\",\"\\u2190\":\"&larr;\",\"\\u2191\":\"&uarr;\",\"\\u2192\":\"&rarr;\",\"\\u2193\":\"&darr;\",\"\\u2194\":\"&harr;\",\"\\u21B5\":\"&crarr;\",\"\\u21D0\":\"&lArr;\",\"\\u21D1\":\"&uArr;\",\"\\u21D2\":\"&rArr;\",\"\\u21D3\":\"&dArr;\",\"\\u21D4\":\"&hArr;\",\"\\u2200\":\"&forall;\",\"\\u2202\":\"&part;\",\"\\u2203\":\"&exist;\",\"\\u2205\":\"&empty;\",\"\\u2207\":\"&nabla;\",\"\\u2208\":\"&isin;\",\"\\u2209\":\"&notin;\",\"\\u220B\":\"&ni;\",\"\\u220F\":\"&prod;\",\"\\u2211\":\"&sum;\",\"\\u2212\":\"&minus;\",\"\\u2217\":\"&lowast;\",\"\\u221A\":\"&radic;\",\"\\u221D\":\"&prop;\",\"\\u221E\":\"&infin;\",\"\\u2220\":\"&ang;\",\"\\u2227\":\"&and;\",\"\\u2228\":\"&or;\",\"\\u2229\":\"&cap;\",\"\\u222A\":\"&cup;\",\"\\u222B\":\"&int;\",\"\\u2234\":\"&there4;\",\"\\u223C\":\"&sim;\",\"\\u2245\":\"&cong;\",\"\\u2248\":\"&asymp;\",\"\\u2260\":\"&ne;\",\"\\u2261\":\"&equiv;\",\"\\u2264\":\"&le;\",\"\\u2265\":\"&ge;\",\"\\u2282\":\"&sub;\",\"\\u2283\":\"&sup;\",\"\\u2284\":\"&nsub;\",\"\\u2286\":\"&sube;\",\"\\u2287\":\"&supe;\",\"\\u2295\":\"&oplus;\",\"\\u2297\":\"&otimes;\",\"\\u22A5\":\"&perp;\",\"\\u22C5\":\"&sdot;\",\"\\u2308\":\"&lceil;\",\"\\u2309\":\"&rceil;\",\"\\u230A\":\"&lfloor;\",\"\\u230B\":\"&rfloor;\",\"\\u2329\":\"&lang;\",\"\\u232A\":\"&rang;\",\"\\u25CA\":\"&loz;\",\"\\u2660\":\"&spades;\",\"\\u2663\":\"&clubs;\",\"\\u2665\":\"&hearts;\",\"\\u2666\":\"&diams;\"}},html5:{entities:{\"&AElig\":\"\\xC6\",\"&AElig;\":\"\\xC6\",\"&AMP\":\"&\",\"&AMP;\":\"&\",\"&Aacute\":\"\\xC1\",\"&Aacute;\":\"\\xC1\",\"&Abreve;\":\"\\u0102\",\"&Acirc\":\"\\xC2\",\"&Acirc;\":\"\\xC2\",\"&Acy;\":\"\\u0410\",\"&Afr;\":\"\\u{1D504}\",\"&Agrave\":\"\\xC0\",\"&Agrave;\":\"\\xC0\",\"&Alpha;\":\"\\u0391\",\"&Amacr;\":\"\\u0100\",\"&And;\":\"\\u2A53\",\"&Aogon;\":\"\\u0104\",\"&Aopf;\":\"\\u{1D538}\",\"&ApplyFunction;\":\"\\u2061\",\"&Aring\":\"\\xC5\",\"&Aring;\":\"\\xC5\",\"&Ascr;\":\"\\u{1D49C}\",\"&Assign;\":\"\\u2254\",\"&Atilde\":\"\\xC3\",\"&Atilde;\":\"\\xC3\",\"&Auml\":\"\\xC4\",\"&Auml;\":\"\\xC4\",\"&Backslash;\":\"\\u2216\",\"&Barv;\":\"\\u2AE7\",\"&Barwed;\":\"\\u2306\",\"&Bcy;\":\"\\u0411\",\"&Because;\":\"\\u2235\",\"&Bernoullis;\":\"\\u212C\",\"&Beta;\":\"\\u0392\",\"&Bfr;\":\"\\u{1D505}\",\"&Bopf;\":\"\\u{1D539}\",\"&Breve;\":\"\\u02D8\",\"&Bscr;\":\"\\u212C\",\"&Bumpeq;\":\"\\u224E\",\"&CHcy;\":\"\\u0427\",\"&COPY\":\"\\xA9\",\"&COPY;\":\"\\xA9\",\"&Cacute;\":\"\\u0106\",\"&Cap;\":\"\\u22D2\",\"&CapitalDifferentialD;\":\"\\u2145\",\"&Cayleys;\":\"\\u212D\",\"&Ccaron;\":\"\\u010C\",\"&Ccedil\":\"\\xC7\",\"&Ccedil;\":\"\\xC7\",\"&Ccirc;\":\"\\u0108\",\"&Cconint;\":\"\\u2230\",\"&Cdot;\":\"\\u010A\",\"&Cedilla;\":\"\\xB8\",\"&CenterDot;\":\"\\xB7\",\"&Cfr;\":\"\\u212D\",\"&Chi;\":\"\\u03A7\",\"&CircleDot;\":\"\\u2299\",\"&CircleMinus;\":\"\\u2296\",\"&CirclePlus;\":\"\\u2295\",\"&CircleTimes;\":\"\\u2297\",\"&ClockwiseContourIntegral;\":\"\\u2232\",\"&CloseCurlyDoubleQuote;\":\"\\u201D\",\"&CloseCurlyQuote;\":\"\\u2019\",\"&Colon;\":\"\\u2237\",\"&Colone;\":\"\\u2A74\",\"&Congruent;\":\"\\u2261\",\"&Conint;\":\"\\u222F\",\"&ContourIntegral;\":\"\\u222E\",\"&Copf;\":\"\\u2102\",\"&Coproduct;\":\"\\u2210\",\"&CounterClockwiseContourIntegral;\":\"\\u2233\",\"&Cross;\":\"\\u2A2F\",\"&Cscr;\":\"\\u{1D49E}\",\"&Cup;\":\"\\u22D3\",\"&CupCap;\":\"\\u224D\",\"&DD;\":\"\\u2145\",\"&DDotrahd;\":\"\\u2911\",\"&DJcy;\":\"\\u0402\",\"&DScy;\":\"\\u0405\",\"&DZcy;\":\"\\u040F\",\"&Dagger;\":\"\\u2021\",\"&Darr;\":\"\\u21A1\",\"&Dashv;\":\"\\u2AE4\",\"&Dcaron;\":\"\\u010E\",\"&Dcy;\":\"\\u0414\",\"&Del;\":\"\\u2207\",\"&Delta;\":\"\\u0394\",\"&Dfr;\":\"\\u{1D507}\",\"&DiacriticalAcute;\":\"\\xB4\",\"&DiacriticalDot;\":\"\\u02D9\",\"&DiacriticalDoubleAcute;\":\"\\u02DD\",\"&DiacriticalGrave;\":\"`\",\"&DiacriticalTilde;\":\"\\u02DC\",\"&Diamond;\":\"\\u22C4\",\"&DifferentialD;\":\"\\u2146\",\"&Dopf;\":\"\\u{1D53B}\",\"&Dot;\":\"\\xA8\",\"&DotDot;\":\"\\u20DC\",\"&DotEqual;\":\"\\u2250\",\"&DoubleContourIntegral;\":\"\\u222F\",\"&DoubleDot;\":\"\\xA8\",\"&DoubleDownArrow;\":\"\\u21D3\",\"&DoubleLeftArrow;\":\"\\u21D0\",\"&DoubleLeftRightArrow;\":\"\\u21D4\",\"&DoubleLeftTee;\":\"\\u2AE4\",\"&DoubleLongLeftArrow;\":\"\\u27F8\",\"&DoubleLongLeftRightArrow;\":\"\\u27FA\",\"&DoubleLongRightArrow;\":\"\\u27F9\",\"&DoubleRightArrow;\":\"\\u21D2\",\"&DoubleRightTee;\":\"\\u22A8\",\"&DoubleUpArrow;\":\"\\u21D1\",\"&DoubleUpDownArrow;\":\"\\u21D5\",\"&DoubleVerticalBar;\":\"\\u2225\",\"&DownArrow;\":\"\\u2193\",\"&DownArrowBar;\":\"\\u2913\",\"&DownArrowUpArrow;\":\"\\u21F5\",\"&DownBreve;\":\"\\u0311\",\"&DownLeftRightVector;\":\"\\u2950\",\"&DownLeftTeeVector;\":\"\\u295E\",\"&DownLeftVector;\":\"\\u21BD\",\"&DownLeftVectorBar;\":\"\\u2956\",\"&DownRightTeeVector;\":\"\\u295F\",\"&DownRightVector;\":\"\\u21C1\",\"&DownRightVectorBar;\":\"\\u2957\",\"&DownTee;\":\"\\u22A4\",\"&DownTeeArrow;\":\"\\u21A7\",\"&Downarrow;\":\"\\u21D3\",\"&Dscr;\":\"\\u{1D49F}\",\"&Dstrok;\":\"\\u0110\",\"&ENG;\":\"\\u014A\",\"&ETH\":\"\\xD0\",\"&ETH;\":\"\\xD0\",\"&Eacute\":\"\\xC9\",\"&Eacute;\":\"\\xC9\",\"&Ecaron;\":\"\\u011A\",\"&Ecirc\":\"\\xCA\",\"&Ecirc;\":\"\\xCA\",\"&Ecy;\":\"\\u042D\",\"&Edot;\":\"\\u0116\",\"&Efr;\":\"\\u{1D508}\",\"&Egrave\":\"\\xC8\",\"&Egrave;\":\"\\xC8\",\"&Element;\":\"\\u2208\",\"&Emacr;\":\"\\u0112\",\"&EmptySmallSquare;\":\"\\u25FB\",\"&EmptyVerySmallSquare;\":\"\\u25AB\",\"&Eogon;\":\"\\u0118\",\"&Eopf;\":\"\\u{1D53C}\",\"&Epsilon;\":\"\\u0395\",\"&Equal;\":\"\\u2A75\",\"&EqualTilde;\":\"\\u2242\",\"&Equilibrium;\":\"\\u21CC\",\"&Escr;\":\"\\u2130\",\"&Esim;\":\"\\u2A73\",\"&Eta;\":\"\\u0397\",\"&Euml\":\"\\xCB\",\"&Euml;\":\"\\xCB\",\"&Exists;\":\"\\u2203\",\"&ExponentialE;\":\"\\u2147\",\"&Fcy;\":\"\\u0424\",\"&Ffr;\":\"\\u{1D509}\",\"&FilledSmallSquare;\":\"\\u25FC\",\"&FilledVerySmallSquare;\":\"\\u25AA\",\"&Fopf;\":\"\\u{1D53D}\",\"&ForAll;\":\"\\u2200\",\"&Fouriertrf;\":\"\\u2131\",\"&Fscr;\":\"\\u2131\",\"&GJcy;\":\"\\u0403\",\"&GT\":\">\",\"&GT;\":\">\",\"&Gamma;\":\"\\u0393\",\"&Gammad;\":\"\\u03DC\",\"&Gbreve;\":\"\\u011E\",\"&Gcedil;\":\"\\u0122\",\"&Gcirc;\":\"\\u011C\",\"&Gcy;\":\"\\u0413\",\"&Gdot;\":\"\\u0120\",\"&Gfr;\":\"\\u{1D50A}\",\"&Gg;\":\"\\u22D9\",\"&Gopf;\":\"\\u{1D53E}\",\"&GreaterEqual;\":\"\\u2265\",\"&GreaterEqualLess;\":\"\\u22DB\",\"&GreaterFullEqual;\":\"\\u2267\",\"&GreaterGreater;\":\"\\u2AA2\",\"&GreaterLess;\":\"\\u2277\",\"&GreaterSlantEqual;\":\"\\u2A7E\",\"&GreaterTilde;\":\"\\u2273\",\"&Gscr;\":\"\\u{1D4A2}\",\"&Gt;\":\"\\u226B\",\"&HARDcy;\":\"\\u042A\",\"&Hacek;\":\"\\u02C7\",\"&Hat;\":\"^\",\"&Hcirc;\":\"\\u0124\",\"&Hfr;\":\"\\u210C\",\"&HilbertSpace;\":\"\\u210B\",\"&Hopf;\":\"\\u210D\",\"&HorizontalLine;\":\"\\u2500\",\"&Hscr;\":\"\\u210B\",\"&Hstrok;\":\"\\u0126\",\"&HumpDownHump;\":\"\\u224E\",\"&HumpEqual;\":\"\\u224F\",\"&IEcy;\":\"\\u0415\",\"&IJlig;\":\"\\u0132\",\"&IOcy;\":\"\\u0401\",\"&Iacute\":\"\\xCD\",\"&Iacute;\":\"\\xCD\",\"&Icirc\":\"\\xCE\",\"&Icirc;\":\"\\xCE\",\"&Icy;\":\"\\u0418\",\"&Idot;\":\"\\u0130\",\"&Ifr;\":\"\\u2111\",\"&Igrave\":\"\\xCC\",\"&Igrave;\":\"\\xCC\",\"&Im;\":\"\\u2111\",\"&Imacr;\":\"\\u012A\",\"&ImaginaryI;\":\"\\u2148\",\"&Implies;\":\"\\u21D2\",\"&Int;\":\"\\u222C\",\"&Integral;\":\"\\u222B\",\"&Intersection;\":\"\\u22C2\",\"&InvisibleComma;\":\"\\u2063\",\"&InvisibleTimes;\":\"\\u2062\",\"&Iogon;\":\"\\u012E\",\"&Iopf;\":\"\\u{1D540}\",\"&Iota;\":\"\\u0399\",\"&Iscr;\":\"\\u2110\",\"&Itilde;\":\"\\u0128\",\"&Iukcy;\":\"\\u0406\",\"&Iuml\":\"\\xCF\",\"&Iuml;\":\"\\xCF\",\"&Jcirc;\":\"\\u0134\",\"&Jcy;\":\"\\u0419\",\"&Jfr;\":\"\\u{1D50D}\",\"&Jopf;\":\"\\u{1D541}\",\"&Jscr;\":\"\\u{1D4A5}\",\"&Jsercy;\":\"\\u0408\",\"&Jukcy;\":\"\\u0404\",\"&KHcy;\":\"\\u0425\",\"&KJcy;\":\"\\u040C\",\"&Kappa;\":\"\\u039A\",\"&Kcedil;\":\"\\u0136\",\"&Kcy;\":\"\\u041A\",\"&Kfr;\":\"\\u{1D50E}\",\"&Kopf;\":\"\\u{1D542}\",\"&Kscr;\":\"\\u{1D4A6}\",\"&LJcy;\":\"\\u0409\",\"&LT\":\"<\",\"&LT;\":\"<\",\"&Lacute;\":\"\\u0139\",\"&Lambda;\":\"\\u039B\",\"&Lang;\":\"\\u27EA\",\"&Laplacetrf;\":\"\\u2112\",\"&Larr;\":\"\\u219E\",\"&Lcaron;\":\"\\u013D\",\"&Lcedil;\":\"\\u013B\",\"&Lcy;\":\"\\u041B\",\"&LeftAngleBracket;\":\"\\u27E8\",\"&LeftArrow;\":\"\\u2190\",\"&LeftArrowBar;\":\"\\u21E4\",\"&LeftArrowRightArrow;\":\"\\u21C6\",\"&LeftCeiling;\":\"\\u2308\",\"&LeftDoubleBracket;\":\"\\u27E6\",\"&LeftDownTeeVector;\":\"\\u2961\",\"&LeftDownVector;\":\"\\u21C3\",\"&LeftDownVectorBar;\":\"\\u2959\",\"&LeftFloor;\":\"\\u230A\",\"&LeftRightArrow;\":\"\\u2194\",\"&LeftRightVector;\":\"\\u294E\",\"&LeftTee;\":\"\\u22A3\",\"&LeftTeeArrow;\":\"\\u21A4\",\"&LeftTeeVector;\":\"\\u295A\",\"&LeftTriangle;\":\"\\u22B2\",\"&LeftTriangleBar;\":\"\\u29CF\",\"&LeftTriangleEqual;\":\"\\u22B4\",\"&LeftUpDownVector;\":\"\\u2951\",\"&LeftUpTeeVector;\":\"\\u2960\",\"&LeftUpVector;\":\"\\u21BF\",\"&LeftUpVectorBar;\":\"\\u2958\",\"&LeftVector;\":\"\\u21BC\",\"&LeftVectorBar;\":\"\\u2952\",\"&Leftarrow;\":\"\\u21D0\",\"&Leftrightarrow;\":\"\\u21D4\",\"&LessEqualGreater;\":\"\\u22DA\",\"&LessFullEqual;\":\"\\u2266\",\"&LessGreater;\":\"\\u2276\",\"&LessLess;\":\"\\u2AA1\",\"&LessSlantEqual;\":\"\\u2A7D\",\"&LessTilde;\":\"\\u2272\",\"&Lfr;\":\"\\u{1D50F}\",\"&Ll;\":\"\\u22D8\",\"&Lleftarrow;\":\"\\u21DA\",\"&Lmidot;\":\"\\u013F\",\"&LongLeftArrow;\":\"\\u27F5\",\"&LongLeftRightArrow;\":\"\\u27F7\",\"&LongRightArrow;\":\"\\u27F6\",\"&Longleftarrow;\":\"\\u27F8\",\"&Longleftrightarrow;\":\"\\u27FA\",\"&Longrightarrow;\":\"\\u27F9\",\"&Lopf;\":\"\\u{1D543}\",\"&LowerLeftArrow;\":\"\\u2199\",\"&LowerRightArrow;\":\"\\u2198\",\"&Lscr;\":\"\\u2112\",\"&Lsh;\":\"\\u21B0\",\"&Lstrok;\":\"\\u0141\",\"&Lt;\":\"\\u226A\",\"&Map;\":\"\\u2905\",\"&Mcy;\":\"\\u041C\",\"&MediumSpace;\":\"\\u205F\",\"&Mellintrf;\":\"\\u2133\",\"&Mfr;\":\"\\u{1D510}\",\"&MinusPlus;\":\"\\u2213\",\"&Mopf;\":\"\\u{1D544}\",\"&Mscr;\":\"\\u2133\",\"&Mu;\":\"\\u039C\",\"&NJcy;\":\"\\u040A\",\"&Nacute;\":\"\\u0143\",\"&Ncaron;\":\"\\u0147\",\"&Ncedil;\":\"\\u0145\",\"&Ncy;\":\"\\u041D\",\"&NegativeMediumSpace;\":\"\\u200B\",\"&NegativeThickSpace;\":\"\\u200B\",\"&NegativeThinSpace;\":\"\\u200B\",\"&NegativeVeryThinSpace;\":\"\\u200B\",\"&NestedGreaterGreater;\":\"\\u226B\",\"&NestedLessLess;\":\"\\u226A\",\"&NewLine;\":`\n`,\"&Nfr;\":\"\\u{1D511}\",\"&NoBreak;\":\"\\u2060\",\"&NonBreakingSpace;\":\"\\xA0\",\"&Nopf;\":\"\\u2115\",\"&Not;\":\"\\u2AEC\",\"&NotCongruent;\":\"\\u2262\",\"&NotCupCap;\":\"\\u226D\",\"&NotDoubleVerticalBar;\":\"\\u2226\",\"&NotElement;\":\"\\u2209\",\"&NotEqual;\":\"\\u2260\",\"&NotEqualTilde;\":\"\\u2242\\u0338\",\"&NotExists;\":\"\\u2204\",\"&NotGreater;\":\"\\u226F\",\"&NotGreaterEqual;\":\"\\u2271\",\"&NotGreaterFullEqual;\":\"\\u2267\\u0338\",\"&NotGreaterGreater;\":\"\\u226B\\u0338\",\"&NotGreaterLess;\":\"\\u2279\",\"&NotGreaterSlantEqual;\":\"\\u2A7E\\u0338\",\"&NotGreaterTilde;\":\"\\u2275\",\"&NotHumpDownHump;\":\"\\u224E\\u0338\",\"&NotHumpEqual;\":\"\\u224F\\u0338\",\"&NotLeftTriangle;\":\"\\u22EA\",\"&NotLeftTriangleBar;\":\"\\u29CF\\u0338\",\"&NotLeftTriangleEqual;\":\"\\u22EC\",\"&NotLess;\":\"\\u226E\",\"&NotLessEqual;\":\"\\u2270\",\"&NotLessGreater;\":\"\\u2278\",\"&NotLessLess;\":\"\\u226A\\u0338\",\"&NotLessSlantEqual;\":\"\\u2A7D\\u0338\",\"&NotLessTilde;\":\"\\u2274\",\"&NotNestedGreaterGreater;\":\"\\u2AA2\\u0338\",\"&NotNestedLessLess;\":\"\\u2AA1\\u0338\",\"&NotPrecedes;\":\"\\u2280\",\"&NotPrecedesEqual;\":\"\\u2AAF\\u0338\",\"&NotPrecedesSlantEqual;\":\"\\u22E0\",\"&NotReverseElement;\":\"\\u220C\",\"&NotRightTriangle;\":\"\\u22EB\",\"&NotRightTriangleBar;\":\"\\u29D0\\u0338\",\"&NotRightTriangleEqual;\":\"\\u22ED\",\"&NotSquareSubset;\":\"\\u228F\\u0338\",\"&NotSquareSubsetEqual;\":\"\\u22E2\",\"&NotSquareSuperset;\":\"\\u2290\\u0338\",\"&NotSquareSupersetEqual;\":\"\\u22E3\",\"&NotSubset;\":\"\\u2282\\u20D2\",\"&NotSubsetEqual;\":\"\\u2288\",\"&NotSucceeds;\":\"\\u2281\",\"&NotSucceedsEqual;\":\"\\u2AB0\\u0338\",\"&NotSucceedsSlantEqual;\":\"\\u22E1\",\"&NotSucceedsTilde;\":\"\\u227F\\u0338\",\"&NotSuperset;\":\"\\u2283\\u20D2\",\"&NotSupersetEqual;\":\"\\u2289\",\"&NotTilde;\":\"\\u2241\",\"&NotTildeEqual;\":\"\\u2244\",\"&NotTildeFullEqual;\":\"\\u2247\",\"&NotTildeTilde;\":\"\\u2249\",\"&NotVerticalBar;\":\"\\u2224\",\"&Nscr;\":\"\\u{1D4A9}\",\"&Ntilde\":\"\\xD1\",\"&Ntilde;\":\"\\xD1\",\"&Nu;\":\"\\u039D\",\"&OElig;\":\"\\u0152\",\"&Oacute\":\"\\xD3\",\"&Oacute;\":\"\\xD3\",\"&Ocirc\":\"\\xD4\",\"&Ocirc;\":\"\\xD4\",\"&Ocy;\":\"\\u041E\",\"&Odblac;\":\"\\u0150\",\"&Ofr;\":\"\\u{1D512}\",\"&Ograve\":\"\\xD2\",\"&Ograve;\":\"\\xD2\",\"&Omacr;\":\"\\u014C\",\"&Omega;\":\"\\u03A9\",\"&Omicron;\":\"\\u039F\",\"&Oopf;\":\"\\u{1D546}\",\"&OpenCurlyDoubleQuote;\":\"\\u201C\",\"&OpenCurlyQuote;\":\"\\u2018\",\"&Or;\":\"\\u2A54\",\"&Oscr;\":\"\\u{1D4AA}\",\"&Oslash\":\"\\xD8\",\"&Oslash;\":\"\\xD8\",\"&Otilde\":\"\\xD5\",\"&Otilde;\":\"\\xD5\",\"&Otimes;\":\"\\u2A37\",\"&Ouml\":\"\\xD6\",\"&Ouml;\":\"\\xD6\",\"&OverBar;\":\"\\u203E\",\"&OverBrace;\":\"\\u23DE\",\"&OverBracket;\":\"\\u23B4\",\"&OverParenthesis;\":\"\\u23DC\",\"&PartialD;\":\"\\u2202\",\"&Pcy;\":\"\\u041F\",\"&Pfr;\":\"\\u{1D513}\",\"&Phi;\":\"\\u03A6\",\"&Pi;\":\"\\u03A0\",\"&PlusMinus;\":\"\\xB1\",\"&Poincareplane;\":\"\\u210C\",\"&Popf;\":\"\\u2119\",\"&Pr;\":\"\\u2ABB\",\"&Precedes;\":\"\\u227A\",\"&PrecedesEqual;\":\"\\u2AAF\",\"&PrecedesSlantEqual;\":\"\\u227C\",\"&PrecedesTilde;\":\"\\u227E\",\"&Prime;\":\"\\u2033\",\"&Product;\":\"\\u220F\",\"&Proportion;\":\"\\u2237\",\"&Proportional;\":\"\\u221D\",\"&Pscr;\":\"\\u{1D4AB}\",\"&Psi;\":\"\\u03A8\",\"&QUOT\":'\"',\"&QUOT;\":'\"',\"&Qfr;\":\"\\u{1D514}\",\"&Qopf;\":\"\\u211A\",\"&Qscr;\":\"\\u{1D4AC}\",\"&RBarr;\":\"\\u2910\",\"&REG\":\"\\xAE\",\"&REG;\":\"\\xAE\",\"&Racute;\":\"\\u0154\",\"&Rang;\":\"\\u27EB\",\"&Rarr;\":\"\\u21A0\",\"&Rarrtl;\":\"\\u2916\",\"&Rcaron;\":\"\\u0158\",\"&Rcedil;\":\"\\u0156\",\"&Rcy;\":\"\\u0420\",\"&Re;\":\"\\u211C\",\"&ReverseElement;\":\"\\u220B\",\"&ReverseEquilibrium;\":\"\\u21CB\",\"&ReverseUpEquilibrium;\":\"\\u296F\",\"&Rfr;\":\"\\u211C\",\"&Rho;\":\"\\u03A1\",\"&RightAngleBracket;\":\"\\u27E9\",\"&RightArrow;\":\"\\u2192\",\"&RightArrowBar;\":\"\\u21E5\",\"&RightArrowLeftArrow;\":\"\\u21C4\",\"&RightCeiling;\":\"\\u2309\",\"&RightDoubleBracket;\":\"\\u27E7\",\"&RightDownTeeVector;\":\"\\u295D\",\"&RightDownVector;\":\"\\u21C2\",\"&RightDownVectorBar;\":\"\\u2955\",\"&RightFloor;\":\"\\u230B\",\"&RightTee;\":\"\\u22A2\",\"&RightTeeArrow;\":\"\\u21A6\",\"&RightTeeVector;\":\"\\u295B\",\"&RightTriangle;\":\"\\u22B3\",\"&RightTriangleBar;\":\"\\u29D0\",\"&RightTriangleEqual;\":\"\\u22B5\",\"&RightUpDownVector;\":\"\\u294F\",\"&RightUpTeeVector;\":\"\\u295C\",\"&RightUpVector;\":\"\\u21BE\",\"&RightUpVectorBar;\":\"\\u2954\",\"&RightVector;\":\"\\u21C0\",\"&RightVectorBar;\":\"\\u2953\",\"&Rightarrow;\":\"\\u21D2\",\"&Ropf;\":\"\\u211D\",\"&RoundImplies;\":\"\\u2970\",\"&Rrightarrow;\":\"\\u21DB\",\"&Rscr;\":\"\\u211B\",\"&Rsh;\":\"\\u21B1\",\"&RuleDelayed;\":\"\\u29F4\",\"&SHCHcy;\":\"\\u0429\",\"&SHcy;\":\"\\u0428\",\"&SOFTcy;\":\"\\u042C\",\"&Sacute;\":\"\\u015A\",\"&Sc;\":\"\\u2ABC\",\"&Scaron;\":\"\\u0160\",\"&Scedil;\":\"\\u015E\",\"&Scirc;\":\"\\u015C\",\"&Scy;\":\"\\u0421\",\"&Sfr;\":\"\\u{1D516}\",\"&ShortDownArrow;\":\"\\u2193\",\"&ShortLeftArrow;\":\"\\u2190\",\"&ShortRightArrow;\":\"\\u2192\",\"&ShortUpArrow;\":\"\\u2191\",\"&Sigma;\":\"\\u03A3\",\"&SmallCircle;\":\"\\u2218\",\"&Sopf;\":\"\\u{1D54A}\",\"&Sqrt;\":\"\\u221A\",\"&Square;\":\"\\u25A1\",\"&SquareIntersection;\":\"\\u2293\",\"&SquareSubset;\":\"\\u228F\",\"&SquareSubsetEqual;\":\"\\u2291\",\"&SquareSuperset;\":\"\\u2290\",\"&SquareSupersetEqual;\":\"\\u2292\",\"&SquareUnion;\":\"\\u2294\",\"&Sscr;\":\"\\u{1D4AE}\",\"&Star;\":\"\\u22C6\",\"&Sub;\":\"\\u22D0\",\"&Subset;\":\"\\u22D0\",\"&SubsetEqual;\":\"\\u2286\",\"&Succeeds;\":\"\\u227B\",\"&SucceedsEqual;\":\"\\u2AB0\",\"&SucceedsSlantEqual;\":\"\\u227D\",\"&SucceedsTilde;\":\"\\u227F\",\"&SuchThat;\":\"\\u220B\",\"&Sum;\":\"\\u2211\",\"&Sup;\":\"\\u22D1\",\"&Superset;\":\"\\u2283\",\"&SupersetEqual;\":\"\\u2287\",\"&Supset;\":\"\\u22D1\",\"&THORN\":\"\\xDE\",\"&THORN;\":\"\\xDE\",\"&TRADE;\":\"\\u2122\",\"&TSHcy;\":\"\\u040B\",\"&TScy;\":\"\\u0426\",\"&Tab;\":\"\t\",\"&Tau;\":\"\\u03A4\",\"&Tcaron;\":\"\\u0164\",\"&Tcedil;\":\"\\u0162\",\"&Tcy;\":\"\\u0422\",\"&Tfr;\":\"\\u{1D517}\",\"&Therefore;\":\"\\u2234\",\"&Theta;\":\"\\u0398\",\"&ThickSpace;\":\"\\u205F\\u200A\",\"&ThinSpace;\":\"\\u2009\",\"&Tilde;\":\"\\u223C\",\"&TildeEqual;\":\"\\u2243\",\"&TildeFullEqual;\":\"\\u2245\",\"&TildeTilde;\":\"\\u2248\",\"&Topf;\":\"\\u{1D54B}\",\"&TripleDot;\":\"\\u20DB\",\"&Tscr;\":\"\\u{1D4AF}\",\"&Tstrok;\":\"\\u0166\",\"&Uacute\":\"\\xDA\",\"&Uacute;\":\"\\xDA\",\"&Uarr;\":\"\\u219F\",\"&Uarrocir;\":\"\\u2949\",\"&Ubrcy;\":\"\\u040E\",\"&Ubreve;\":\"\\u016C\",\"&Ucirc\":\"\\xDB\",\"&Ucirc;\":\"\\xDB\",\"&Ucy;\":\"\\u0423\",\"&Udblac;\":\"\\u0170\",\"&Ufr;\":\"\\u{1D518}\",\"&Ugrave\":\"\\xD9\",\"&Ugrave;\":\"\\xD9\",\"&Umacr;\":\"\\u016A\",\"&UnderBar;\":\"_\",\"&UnderBrace;\":\"\\u23DF\",\"&UnderBracket;\":\"\\u23B5\",\"&UnderParenthesis;\":\"\\u23DD\",\"&Union;\":\"\\u22C3\",\"&UnionPlus;\":\"\\u228E\",\"&Uogon;\":\"\\u0172\",\"&Uopf;\":\"\\u{1D54C}\",\"&UpArrow;\":\"\\u2191\",\"&UpArrowBar;\":\"\\u2912\",\"&UpArrowDownArrow;\":\"\\u21C5\",\"&UpDownArrow;\":\"\\u2195\",\"&UpEquilibrium;\":\"\\u296E\",\"&UpTee;\":\"\\u22A5\",\"&UpTeeArrow;\":\"\\u21A5\",\"&Uparrow;\":\"\\u21D1\",\"&Updownarrow;\":\"\\u21D5\",\"&UpperLeftArrow;\":\"\\u2196\",\"&UpperRightArrow;\":\"\\u2197\",\"&Upsi;\":\"\\u03D2\",\"&Upsilon;\":\"\\u03A5\",\"&Uring;\":\"\\u016E\",\"&Uscr;\":\"\\u{1D4B0}\",\"&Utilde;\":\"\\u0168\",\"&Uuml\":\"\\xDC\",\"&Uuml;\":\"\\xDC\",\"&VDash;\":\"\\u22AB\",\"&Vbar;\":\"\\u2AEB\",\"&Vcy;\":\"\\u0412\",\"&Vdash;\":\"\\u22A9\",\"&Vdashl;\":\"\\u2AE6\",\"&Vee;\":\"\\u22C1\",\"&Verbar;\":\"\\u2016\",\"&Vert;\":\"\\u2016\",\"&VerticalBar;\":\"\\u2223\",\"&VerticalLine;\":\"|\",\"&VerticalSeparator;\":\"\\u2758\",\"&VerticalTilde;\":\"\\u2240\",\"&VeryThinSpace;\":\"\\u200A\",\"&Vfr;\":\"\\u{1D519}\",\"&Vopf;\":\"\\u{1D54D}\",\"&Vscr;\":\"\\u{1D4B1}\",\"&Vvdash;\":\"\\u22AA\",\"&Wcirc;\":\"\\u0174\",\"&Wedge;\":\"\\u22C0\",\"&Wfr;\":\"\\u{1D51A}\",\"&Wopf;\":\"\\u{1D54E}\",\"&Wscr;\":\"\\u{1D4B2}\",\"&Xfr;\":\"\\u{1D51B}\",\"&Xi;\":\"\\u039E\",\"&Xopf;\":\"\\u{1D54F}\",\"&Xscr;\":\"\\u{1D4B3}\",\"&YAcy;\":\"\\u042F\",\"&YIcy;\":\"\\u0407\",\"&YUcy;\":\"\\u042E\",\"&Yacute\":\"\\xDD\",\"&Yacute;\":\"\\xDD\",\"&Ycirc;\":\"\\u0176\",\"&Ycy;\":\"\\u042B\",\"&Yfr;\":\"\\u{1D51C}\",\"&Yopf;\":\"\\u{1D550}\",\"&Yscr;\":\"\\u{1D4B4}\",\"&Yuml;\":\"\\u0178\",\"&ZHcy;\":\"\\u0416\",\"&Zacute;\":\"\\u0179\",\"&Zcaron;\":\"\\u017D\",\"&Zcy;\":\"\\u0417\",\"&Zdot;\":\"\\u017B\",\"&ZeroWidthSpace;\":\"\\u200B\",\"&Zeta;\":\"\\u0396\",\"&Zfr;\":\"\\u2128\",\"&Zopf;\":\"\\u2124\",\"&Zscr;\":\"\\u{1D4B5}\",\"&aacute\":\"\\xE1\",\"&aacute;\":\"\\xE1\",\"&abreve;\":\"\\u0103\",\"&ac;\":\"\\u223E\",\"&acE;\":\"\\u223E\\u0333\",\"&acd;\":\"\\u223F\",\"&acirc\":\"\\xE2\",\"&acirc;\":\"\\xE2\",\"&acute\":\"\\xB4\",\"&acute;\":\"\\xB4\",\"&acy;\":\"\\u0430\",\"&aelig\":\"\\xE6\",\"&aelig;\":\"\\xE6\",\"&af;\":\"\\u2061\",\"&afr;\":\"\\u{1D51E}\",\"&agrave\":\"\\xE0\",\"&agrave;\":\"\\xE0\",\"&alefsym;\":\"\\u2135\",\"&aleph;\":\"\\u2135\",\"&alpha;\":\"\\u03B1\",\"&amacr;\":\"\\u0101\",\"&amalg;\":\"\\u2A3F\",\"&amp\":\"&\",\"&amp;\":\"&\",\"&and;\":\"\\u2227\",\"&andand;\":\"\\u2A55\",\"&andd;\":\"\\u2A5C\",\"&andslope;\":\"\\u2A58\",\"&andv;\":\"\\u2A5A\",\"&ang;\":\"\\u2220\",\"&ange;\":\"\\u29A4\",\"&angle;\":\"\\u2220\",\"&angmsd;\":\"\\u2221\",\"&angmsdaa;\":\"\\u29A8\",\"&angmsdab;\":\"\\u29A9\",\"&angmsdac;\":\"\\u29AA\",\"&angmsdad;\":\"\\u29AB\",\"&angmsdae;\":\"\\u29AC\",\"&angmsdaf;\":\"\\u29AD\",\"&angmsdag;\":\"\\u29AE\",\"&angmsdah;\":\"\\u29AF\",\"&angrt;\":\"\\u221F\",\"&angrtvb;\":\"\\u22BE\",\"&angrtvbd;\":\"\\u299D\",\"&angsph;\":\"\\u2222\",\"&angst;\":\"\\xC5\",\"&angzarr;\":\"\\u237C\",\"&aogon;\":\"\\u0105\",\"&aopf;\":\"\\u{1D552}\",\"&ap;\":\"\\u2248\",\"&apE;\":\"\\u2A70\",\"&apacir;\":\"\\u2A6F\",\"&ape;\":\"\\u224A\",\"&apid;\":\"\\u224B\",\"&apos;\":\"'\",\"&approx;\":\"\\u2248\",\"&approxeq;\":\"\\u224A\",\"&aring\":\"\\xE5\",\"&aring;\":\"\\xE5\",\"&ascr;\":\"\\u{1D4B6}\",\"&ast;\":\"*\",\"&asymp;\":\"\\u2248\",\"&asympeq;\":\"\\u224D\",\"&atilde\":\"\\xE3\",\"&atilde;\":\"\\xE3\",\"&auml\":\"\\xE4\",\"&auml;\":\"\\xE4\",\"&awconint;\":\"\\u2233\",\"&awint;\":\"\\u2A11\",\"&bNot;\":\"\\u2AED\",\"&backcong;\":\"\\u224C\",\"&backepsilon;\":\"\\u03F6\",\"&backprime;\":\"\\u2035\",\"&backsim;\":\"\\u223D\",\"&backsimeq;\":\"\\u22CD\",\"&barvee;\":\"\\u22BD\",\"&barwed;\":\"\\u2305\",\"&barwedge;\":\"\\u2305\",\"&bbrk;\":\"\\u23B5\",\"&bbrktbrk;\":\"\\u23B6\",\"&bcong;\":\"\\u224C\",\"&bcy;\":\"\\u0431\",\"&bdquo;\":\"\\u201E\",\"&becaus;\":\"\\u2235\",\"&because;\":\"\\u2235\",\"&bemptyv;\":\"\\u29B0\",\"&bepsi;\":\"\\u03F6\",\"&bernou;\":\"\\u212C\",\"&beta;\":\"\\u03B2\",\"&beth;\":\"\\u2136\",\"&between;\":\"\\u226C\",\"&bfr;\":\"\\u{1D51F}\",\"&bigcap;\":\"\\u22C2\",\"&bigcirc;\":\"\\u25EF\",\"&bigcup;\":\"\\u22C3\",\"&bigodot;\":\"\\u2A00\",\"&bigoplus;\":\"\\u2A01\",\"&bigotimes;\":\"\\u2A02\",\"&bigsqcup;\":\"\\u2A06\",\"&bigstar;\":\"\\u2605\",\"&bigtriangledown;\":\"\\u25BD\",\"&bigtriangleup;\":\"\\u25B3\",\"&biguplus;\":\"\\u2A04\",\"&bigvee;\":\"\\u22C1\",\"&bigwedge;\":\"\\u22C0\",\"&bkarow;\":\"\\u290D\",\"&blacklozenge;\":\"\\u29EB\",\"&blacksquare;\":\"\\u25AA\",\"&blacktriangle;\":\"\\u25B4\",\"&blacktriangledown;\":\"\\u25BE\",\"&blacktriangleleft;\":\"\\u25C2\",\"&blacktriangleright;\":\"\\u25B8\",\"&blank;\":\"\\u2423\",\"&blk12;\":\"\\u2592\",\"&blk14;\":\"\\u2591\",\"&blk34;\":\"\\u2593\",\"&block;\":\"\\u2588\",\"&bne;\":\"=\\u20E5\",\"&bnequiv;\":\"\\u2261\\u20E5\",\"&bnot;\":\"\\u2310\",\"&bopf;\":\"\\u{1D553}\",\"&bot;\":\"\\u22A5\",\"&bottom;\":\"\\u22A5\",\"&bowtie;\":\"\\u22C8\",\"&boxDL;\":\"\\u2557\",\"&boxDR;\":\"\\u2554\",\"&boxDl;\":\"\\u2556\",\"&boxDr;\":\"\\u2553\",\"&boxH;\":\"\\u2550\",\"&boxHD;\":\"\\u2566\",\"&boxHU;\":\"\\u2569\",\"&boxHd;\":\"\\u2564\",\"&boxHu;\":\"\\u2567\",\"&boxUL;\":\"\\u255D\",\"&boxUR;\":\"\\u255A\",\"&boxUl;\":\"\\u255C\",\"&boxUr;\":\"\\u2559\",\"&boxV;\":\"\\u2551\",\"&boxVH;\":\"\\u256C\",\"&boxVL;\":\"\\u2563\",\"&boxVR;\":\"\\u2560\",\"&boxVh;\":\"\\u256B\",\"&boxVl;\":\"\\u2562\",\"&boxVr;\":\"\\u255F\",\"&boxbox;\":\"\\u29C9\",\"&boxdL;\":\"\\u2555\",\"&boxdR;\":\"\\u2552\",\"&boxdl;\":\"\\u2510\",\"&boxdr;\":\"\\u250C\",\"&boxh;\":\"\\u2500\",\"&boxhD;\":\"\\u2565\",\"&boxhU;\":\"\\u2568\",\"&boxhd;\":\"\\u252C\",\"&boxhu;\":\"\\u2534\",\"&boxminus;\":\"\\u229F\",\"&boxplus;\":\"\\u229E\",\"&boxtimes;\":\"\\u22A0\",\"&boxuL;\":\"\\u255B\",\"&boxuR;\":\"\\u2558\",\"&boxul;\":\"\\u2518\",\"&boxur;\":\"\\u2514\",\"&boxv;\":\"\\u2502\",\"&boxvH;\":\"\\u256A\",\"&boxvL;\":\"\\u2561\",\"&boxvR;\":\"\\u255E\",\"&boxvh;\":\"\\u253C\",\"&boxvl;\":\"\\u2524\",\"&boxvr;\":\"\\u251C\",\"&bprime;\":\"\\u2035\",\"&breve;\":\"\\u02D8\",\"&brvbar\":\"\\xA6\",\"&brvbar;\":\"\\xA6\",\"&bscr;\":\"\\u{1D4B7}\",\"&bsemi;\":\"\\u204F\",\"&bsim;\":\"\\u223D\",\"&bsime;\":\"\\u22CD\",\"&bsol;\":\"\\\\\",\"&bsolb;\":\"\\u29C5\",\"&bsolhsub;\":\"\\u27C8\",\"&bull;\":\"\\u2022\",\"&bullet;\":\"\\u2022\",\"&bump;\":\"\\u224E\",\"&bumpE;\":\"\\u2AAE\",\"&bumpe;\":\"\\u224F\",\"&bumpeq;\":\"\\u224F\",\"&cacute;\":\"\\u0107\",\"&cap;\":\"\\u2229\",\"&capand;\":\"\\u2A44\",\"&capbrcup;\":\"\\u2A49\",\"&capcap;\":\"\\u2A4B\",\"&capcup;\":\"\\u2A47\",\"&capdot;\":\"\\u2A40\",\"&caps;\":\"\\u2229\\uFE00\",\"&caret;\":\"\\u2041\",\"&caron;\":\"\\u02C7\",\"&ccaps;\":\"\\u2A4D\",\"&ccaron;\":\"\\u010D\",\"&ccedil\":\"\\xE7\",\"&ccedil;\":\"\\xE7\",\"&ccirc;\":\"\\u0109\",\"&ccups;\":\"\\u2A4C\",\"&ccupssm;\":\"\\u2A50\",\"&cdot;\":\"\\u010B\",\"&cedil\":\"\\xB8\",\"&cedil;\":\"\\xB8\",\"&cemptyv;\":\"\\u29B2\",\"&cent\":\"\\xA2\",\"&cent;\":\"\\xA2\",\"&centerdot;\":\"\\xB7\",\"&cfr;\":\"\\u{1D520}\",\"&chcy;\":\"\\u0447\",\"&check;\":\"\\u2713\",\"&checkmark;\":\"\\u2713\",\"&chi;\":\"\\u03C7\",\"&cir;\":\"\\u25CB\",\"&cirE;\":\"\\u29C3\",\"&circ;\":\"\\u02C6\",\"&circeq;\":\"\\u2257\",\"&circlearrowleft;\":\"\\u21BA\",\"&circlearrowright;\":\"\\u21BB\",\"&circledR;\":\"\\xAE\",\"&circledS;\":\"\\u24C8\",\"&circledast;\":\"\\u229B\",\"&circledcirc;\":\"\\u229A\",\"&circleddash;\":\"\\u229D\",\"&cire;\":\"\\u2257\",\"&cirfnint;\":\"\\u2A10\",\"&cirmid;\":\"\\u2AEF\",\"&cirscir;\":\"\\u29C2\",\"&clubs;\":\"\\u2663\",\"&clubsuit;\":\"\\u2663\",\"&colon;\":\":\",\"&colone;\":\"\\u2254\",\"&coloneq;\":\"\\u2254\",\"&comma;\":\",\",\"&commat;\":\"@\",\"&comp;\":\"\\u2201\",\"&compfn;\":\"\\u2218\",\"&complement;\":\"\\u2201\",\"&complexes;\":\"\\u2102\",\"&cong;\":\"\\u2245\",\"&congdot;\":\"\\u2A6D\",\"&conint;\":\"\\u222E\",\"&copf;\":\"\\u{1D554}\",\"&coprod;\":\"\\u2210\",\"&copy\":\"\\xA9\",\"&copy;\":\"\\xA9\",\"&copysr;\":\"\\u2117\",\"&crarr;\":\"\\u21B5\",\"&cross;\":\"\\u2717\",\"&cscr;\":\"\\u{1D4B8}\",\"&csub;\":\"\\u2ACF\",\"&csube;\":\"\\u2AD1\",\"&csup;\":\"\\u2AD0\",\"&csupe;\":\"\\u2AD2\",\"&ctdot;\":\"\\u22EF\",\"&cudarrl;\":\"\\u2938\",\"&cudarrr;\":\"\\u2935\",\"&cuepr;\":\"\\u22DE\",\"&cuesc;\":\"\\u22DF\",\"&cularr;\":\"\\u21B6\",\"&cularrp;\":\"\\u293D\",\"&cup;\":\"\\u222A\",\"&cupbrcap;\":\"\\u2A48\",\"&cupcap;\":\"\\u2A46\",\"&cupcup;\":\"\\u2A4A\",\"&cupdot;\":\"\\u228D\",\"&cupor;\":\"\\u2A45\",\"&cups;\":\"\\u222A\\uFE00\",\"&curarr;\":\"\\u21B7\",\"&curarrm;\":\"\\u293C\",\"&curlyeqprec;\":\"\\u22DE\",\"&curlyeqsucc;\":\"\\u22DF\",\"&curlyvee;\":\"\\u22CE\",\"&curlywedge;\":\"\\u22CF\",\"&curren\":\"\\xA4\",\"&curren;\":\"\\xA4\",\"&curvearrowleft;\":\"\\u21B6\",\"&curvearrowright;\":\"\\u21B7\",\"&cuvee;\":\"\\u22CE\",\"&cuwed;\":\"\\u22CF\",\"&cwconint;\":\"\\u2232\",\"&cwint;\":\"\\u2231\",\"&cylcty;\":\"\\u232D\",\"&dArr;\":\"\\u21D3\",\"&dHar;\":\"\\u2965\",\"&dagger;\":\"\\u2020\",\"&daleth;\":\"\\u2138\",\"&darr;\":\"\\u2193\",\"&dash;\":\"\\u2010\",\"&dashv;\":\"\\u22A3\",\"&dbkarow;\":\"\\u290F\",\"&dblac;\":\"\\u02DD\",\"&dcaron;\":\"\\u010F\",\"&dcy;\":\"\\u0434\",\"&dd;\":\"\\u2146\",\"&ddagger;\":\"\\u2021\",\"&ddarr;\":\"\\u21CA\",\"&ddotseq;\":\"\\u2A77\",\"&deg\":\"\\xB0\",\"&deg;\":\"\\xB0\",\"&delta;\":\"\\u03B4\",\"&demptyv;\":\"\\u29B1\",\"&dfisht;\":\"\\u297F\",\"&dfr;\":\"\\u{1D521}\",\"&dharl;\":\"\\u21C3\",\"&dharr;\":\"\\u21C2\",\"&diam;\":\"\\u22C4\",\"&diamond;\":\"\\u22C4\",\"&diamondsuit;\":\"\\u2666\",\"&diams;\":\"\\u2666\",\"&die;\":\"\\xA8\",\"&digamma;\":\"\\u03DD\",\"&disin;\":\"\\u22F2\",\"&div;\":\"\\xF7\",\"&divide\":\"\\xF7\",\"&divide;\":\"\\xF7\",\"&divideontimes;\":\"\\u22C7\",\"&divonx;\":\"\\u22C7\",\"&djcy;\":\"\\u0452\",\"&dlcorn;\":\"\\u231E\",\"&dlcrop;\":\"\\u230D\",\"&dollar;\":\"$\",\"&dopf;\":\"\\u{1D555}\",\"&dot;\":\"\\u02D9\",\"&doteq;\":\"\\u2250\",\"&doteqdot;\":\"\\u2251\",\"&dotminus;\":\"\\u2238\",\"&dotplus;\":\"\\u2214\",\"&dotsquare;\":\"\\u22A1\",\"&doublebarwedge;\":\"\\u2306\",\"&downarrow;\":\"\\u2193\",\"&downdownarrows;\":\"\\u21CA\",\"&downharpoonleft;\":\"\\u21C3\",\"&downharpoonright;\":\"\\u21C2\",\"&drbkarow;\":\"\\u2910\",\"&drcorn;\":\"\\u231F\",\"&drcrop;\":\"\\u230C\",\"&dscr;\":\"\\u{1D4B9}\",\"&dscy;\":\"\\u0455\",\"&dsol;\":\"\\u29F6\",\"&dstrok;\":\"\\u0111\",\"&dtdot;\":\"\\u22F1\",\"&dtri;\":\"\\u25BF\",\"&dtrif;\":\"\\u25BE\",\"&duarr;\":\"\\u21F5\",\"&duhar;\":\"\\u296F\",\"&dwangle;\":\"\\u29A6\",\"&dzcy;\":\"\\u045F\",\"&dzigrarr;\":\"\\u27FF\",\"&eDDot;\":\"\\u2A77\",\"&eDot;\":\"\\u2251\",\"&eacute\":\"\\xE9\",\"&eacute;\":\"\\xE9\",\"&easter;\":\"\\u2A6E\",\"&ecaron;\":\"\\u011B\",\"&ecir;\":\"\\u2256\",\"&ecirc\":\"\\xEA\",\"&ecirc;\":\"\\xEA\",\"&ecolon;\":\"\\u2255\",\"&ecy;\":\"\\u044D\",\"&edot;\":\"\\u0117\",\"&ee;\":\"\\u2147\",\"&efDot;\":\"\\u2252\",\"&efr;\":\"\\u{1D522}\",\"&eg;\":\"\\u2A9A\",\"&egrave\":\"\\xE8\",\"&egrave;\":\"\\xE8\",\"&egs;\":\"\\u2A96\",\"&egsdot;\":\"\\u2A98\",\"&el;\":\"\\u2A99\",\"&elinters;\":\"\\u23E7\",\"&ell;\":\"\\u2113\",\"&els;\":\"\\u2A95\",\"&elsdot;\":\"\\u2A97\",\"&emacr;\":\"\\u0113\",\"&empty;\":\"\\u2205\",\"&emptyset;\":\"\\u2205\",\"&emptyv;\":\"\\u2205\",\"&emsp13;\":\"\\u2004\",\"&emsp14;\":\"\\u2005\",\"&emsp;\":\"\\u2003\",\"&eng;\":\"\\u014B\",\"&ensp;\":\"\\u2002\",\"&eogon;\":\"\\u0119\",\"&eopf;\":\"\\u{1D556}\",\"&epar;\":\"\\u22D5\",\"&eparsl;\":\"\\u29E3\",\"&eplus;\":\"\\u2A71\",\"&epsi;\":\"\\u03B5\",\"&epsilon;\":\"\\u03B5\",\"&epsiv;\":\"\\u03F5\",\"&eqcirc;\":\"\\u2256\",\"&eqcolon;\":\"\\u2255\",\"&eqsim;\":\"\\u2242\",\"&eqslantgtr;\":\"\\u2A96\",\"&eqslantless;\":\"\\u2A95\",\"&equals;\":\"=\",\"&equest;\":\"\\u225F\",\"&equiv;\":\"\\u2261\",\"&equivDD;\":\"\\u2A78\",\"&eqvparsl;\":\"\\u29E5\",\"&erDot;\":\"\\u2253\",\"&erarr;\":\"\\u2971\",\"&escr;\":\"\\u212F\",\"&esdot;\":\"\\u2250\",\"&esim;\":\"\\u2242\",\"&eta;\":\"\\u03B7\",\"&eth\":\"\\xF0\",\"&eth;\":\"\\xF0\",\"&euml\":\"\\xEB\",\"&euml;\":\"\\xEB\",\"&euro;\":\"\\u20AC\",\"&excl;\":\"!\",\"&exist;\":\"\\u2203\",\"&expectation;\":\"\\u2130\",\"&exponentiale;\":\"\\u2147\",\"&fallingdotseq;\":\"\\u2252\",\"&fcy;\":\"\\u0444\",\"&female;\":\"\\u2640\",\"&ffilig;\":\"\\uFB03\",\"&fflig;\":\"\\uFB00\",\"&ffllig;\":\"\\uFB04\",\"&ffr;\":\"\\u{1D523}\",\"&filig;\":\"\\uFB01\",\"&fjlig;\":\"fj\",\"&flat;\":\"\\u266D\",\"&fllig;\":\"\\uFB02\",\"&fltns;\":\"\\u25B1\",\"&fnof;\":\"\\u0192\",\"&fopf;\":\"\\u{1D557}\",\"&forall;\":\"\\u2200\",\"&fork;\":\"\\u22D4\",\"&forkv;\":\"\\u2AD9\",\"&fpartint;\":\"\\u2A0D\",\"&frac12\":\"\\xBD\",\"&frac12;\":\"\\xBD\",\"&frac13;\":\"\\u2153\",\"&frac14\":\"\\xBC\",\"&frac14;\":\"\\xBC\",\"&frac15;\":\"\\u2155\",\"&frac16;\":\"\\u2159\",\"&frac18;\":\"\\u215B\",\"&frac23;\":\"\\u2154\",\"&frac25;\":\"\\u2156\",\"&frac34\":\"\\xBE\",\"&frac34;\":\"\\xBE\",\"&frac35;\":\"\\u2157\",\"&frac38;\":\"\\u215C\",\"&frac45;\":\"\\u2158\",\"&frac56;\":\"\\u215A\",\"&frac58;\":\"\\u215D\",\"&frac78;\":\"\\u215E\",\"&frasl;\":\"\\u2044\",\"&frown;\":\"\\u2322\",\"&fscr;\":\"\\u{1D4BB}\",\"&gE;\":\"\\u2267\",\"&gEl;\":\"\\u2A8C\",\"&gacute;\":\"\\u01F5\",\"&gamma;\":\"\\u03B3\",\"&gammad;\":\"\\u03DD\",\"&gap;\":\"\\u2A86\",\"&gbreve;\":\"\\u011F\",\"&gcirc;\":\"\\u011D\",\"&gcy;\":\"\\u0433\",\"&gdot;\":\"\\u0121\",\"&ge;\":\"\\u2265\",\"&gel;\":\"\\u22DB\",\"&geq;\":\"\\u2265\",\"&geqq;\":\"\\u2267\",\"&geqslant;\":\"\\u2A7E\",\"&ges;\":\"\\u2A7E\",\"&gescc;\":\"\\u2AA9\",\"&gesdot;\":\"\\u2A80\",\"&gesdoto;\":\"\\u2A82\",\"&gesdotol;\":\"\\u2A84\",\"&gesl;\":\"\\u22DB\\uFE00\",\"&gesles;\":\"\\u2A94\",\"&gfr;\":\"\\u{1D524}\",\"&gg;\":\"\\u226B\",\"&ggg;\":\"\\u22D9\",\"&gimel;\":\"\\u2137\",\"&gjcy;\":\"\\u0453\",\"&gl;\":\"\\u2277\",\"&glE;\":\"\\u2A92\",\"&gla;\":\"\\u2AA5\",\"&glj;\":\"\\u2AA4\",\"&gnE;\":\"\\u2269\",\"&gnap;\":\"\\u2A8A\",\"&gnapprox;\":\"\\u2A8A\",\"&gne;\":\"\\u2A88\",\"&gneq;\":\"\\u2A88\",\"&gneqq;\":\"\\u2269\",\"&gnsim;\":\"\\u22E7\",\"&gopf;\":\"\\u{1D558}\",\"&grave;\":\"`\",\"&gscr;\":\"\\u210A\",\"&gsim;\":\"\\u2273\",\"&gsime;\":\"\\u2A8E\",\"&gsiml;\":\"\\u2A90\",\"&gt\":\">\",\"&gt;\":\">\",\"&gtcc;\":\"\\u2AA7\",\"&gtcir;\":\"\\u2A7A\",\"&gtdot;\":\"\\u22D7\",\"&gtlPar;\":\"\\u2995\",\"&gtquest;\":\"\\u2A7C\",\"&gtrapprox;\":\"\\u2A86\",\"&gtrarr;\":\"\\u2978\",\"&gtrdot;\":\"\\u22D7\",\"&gtreqless;\":\"\\u22DB\",\"&gtreqqless;\":\"\\u2A8C\",\"&gtrless;\":\"\\u2277\",\"&gtrsim;\":\"\\u2273\",\"&gvertneqq;\":\"\\u2269\\uFE00\",\"&gvnE;\":\"\\u2269\\uFE00\",\"&hArr;\":\"\\u21D4\",\"&hairsp;\":\"\\u200A\",\"&half;\":\"\\xBD\",\"&hamilt;\":\"\\u210B\",\"&hardcy;\":\"\\u044A\",\"&harr;\":\"\\u2194\",\"&harrcir;\":\"\\u2948\",\"&harrw;\":\"\\u21AD\",\"&hbar;\":\"\\u210F\",\"&hcirc;\":\"\\u0125\",\"&hearts;\":\"\\u2665\",\"&heartsuit;\":\"\\u2665\",\"&hellip;\":\"\\u2026\",\"&hercon;\":\"\\u22B9\",\"&hfr;\":\"\\u{1D525}\",\"&hksearow;\":\"\\u2925\",\"&hkswarow;\":\"\\u2926\",\"&hoarr;\":\"\\u21FF\",\"&homtht;\":\"\\u223B\",\"&hookleftarrow;\":\"\\u21A9\",\"&hookrightarrow;\":\"\\u21AA\",\"&hopf;\":\"\\u{1D559}\",\"&horbar;\":\"\\u2015\",\"&hscr;\":\"\\u{1D4BD}\",\"&hslash;\":\"\\u210F\",\"&hstrok;\":\"\\u0127\",\"&hybull;\":\"\\u2043\",\"&hyphen;\":\"\\u2010\",\"&iacute\":\"\\xED\",\"&iacute;\":\"\\xED\",\"&ic;\":\"\\u2063\",\"&icirc\":\"\\xEE\",\"&icirc;\":\"\\xEE\",\"&icy;\":\"\\u0438\",\"&iecy;\":\"\\u0435\",\"&iexcl\":\"\\xA1\",\"&iexcl;\":\"\\xA1\",\"&iff;\":\"\\u21D4\",\"&ifr;\":\"\\u{1D526}\",\"&igrave\":\"\\xEC\",\"&igrave;\":\"\\xEC\",\"&ii;\":\"\\u2148\",\"&iiiint;\":\"\\u2A0C\",\"&iiint;\":\"\\u222D\",\"&iinfin;\":\"\\u29DC\",\"&iiota;\":\"\\u2129\",\"&ijlig;\":\"\\u0133\",\"&imacr;\":\"\\u012B\",\"&image;\":\"\\u2111\",\"&imagline;\":\"\\u2110\",\"&imagpart;\":\"\\u2111\",\"&imath;\":\"\\u0131\",\"&imof;\":\"\\u22B7\",\"&imped;\":\"\\u01B5\",\"&in;\":\"\\u2208\",\"&incare;\":\"\\u2105\",\"&infin;\":\"\\u221E\",\"&infintie;\":\"\\u29DD\",\"&inodot;\":\"\\u0131\",\"&int;\":\"\\u222B\",\"&intcal;\":\"\\u22BA\",\"&integers;\":\"\\u2124\",\"&intercal;\":\"\\u22BA\",\"&intlarhk;\":\"\\u2A17\",\"&intprod;\":\"\\u2A3C\",\"&iocy;\":\"\\u0451\",\"&iogon;\":\"\\u012F\",\"&iopf;\":\"\\u{1D55A}\",\"&iota;\":\"\\u03B9\",\"&iprod;\":\"\\u2A3C\",\"&iquest\":\"\\xBF\",\"&iquest;\":\"\\xBF\",\"&iscr;\":\"\\u{1D4BE}\",\"&isin;\":\"\\u2208\",\"&isinE;\":\"\\u22F9\",\"&isindot;\":\"\\u22F5\",\"&isins;\":\"\\u22F4\",\"&isinsv;\":\"\\u22F3\",\"&isinv;\":\"\\u2208\",\"&it;\":\"\\u2062\",\"&itilde;\":\"\\u0129\",\"&iukcy;\":\"\\u0456\",\"&iuml\":\"\\xEF\",\"&iuml;\":\"\\xEF\",\"&jcirc;\":\"\\u0135\",\"&jcy;\":\"\\u0439\",\"&jfr;\":\"\\u{1D527}\",\"&jmath;\":\"\\u0237\",\"&jopf;\":\"\\u{1D55B}\",\"&jscr;\":\"\\u{1D4BF}\",\"&jsercy;\":\"\\u0458\",\"&jukcy;\":\"\\u0454\",\"&kappa;\":\"\\u03BA\",\"&kappav;\":\"\\u03F0\",\"&kcedil;\":\"\\u0137\",\"&kcy;\":\"\\u043A\",\"&kfr;\":\"\\u{1D528}\",\"&kgreen;\":\"\\u0138\",\"&khcy;\":\"\\u0445\",\"&kjcy;\":\"\\u045C\",\"&kopf;\":\"\\u{1D55C}\",\"&kscr;\":\"\\u{1D4C0}\",\"&lAarr;\":\"\\u21DA\",\"&lArr;\":\"\\u21D0\",\"&lAtail;\":\"\\u291B\",\"&lBarr;\":\"\\u290E\",\"&lE;\":\"\\u2266\",\"&lEg;\":\"\\u2A8B\",\"&lHar;\":\"\\u2962\",\"&lacute;\":\"\\u013A\",\"&laemptyv;\":\"\\u29B4\",\"&lagran;\":\"\\u2112\",\"&lambda;\":\"\\u03BB\",\"&lang;\":\"\\u27E8\",\"&langd;\":\"\\u2991\",\"&langle;\":\"\\u27E8\",\"&lap;\":\"\\u2A85\",\"&laquo\":\"\\xAB\",\"&laquo;\":\"\\xAB\",\"&larr;\":\"\\u2190\",\"&larrb;\":\"\\u21E4\",\"&larrbfs;\":\"\\u291F\",\"&larrfs;\":\"\\u291D\",\"&larrhk;\":\"\\u21A9\",\"&larrlp;\":\"\\u21AB\",\"&larrpl;\":\"\\u2939\",\"&larrsim;\":\"\\u2973\",\"&larrtl;\":\"\\u21A2\",\"&lat;\":\"\\u2AAB\",\"&latail;\":\"\\u2919\",\"&late;\":\"\\u2AAD\",\"&lates;\":\"\\u2AAD\\uFE00\",\"&lbarr;\":\"\\u290C\",\"&lbbrk;\":\"\\u2772\",\"&lbrace;\":\"{\",\"&lbrack;\":\"[\",\"&lbrke;\":\"\\u298B\",\"&lbrksld;\":\"\\u298F\",\"&lbrkslu;\":\"\\u298D\",\"&lcaron;\":\"\\u013E\",\"&lcedil;\":\"\\u013C\",\"&lceil;\":\"\\u2308\",\"&lcub;\":\"{\",\"&lcy;\":\"\\u043B\",\"&ldca;\":\"\\u2936\",\"&ldquo;\":\"\\u201C\",\"&ldquor;\":\"\\u201E\",\"&ldrdhar;\":\"\\u2967\",\"&ldrushar;\":\"\\u294B\",\"&ldsh;\":\"\\u21B2\",\"&le;\":\"\\u2264\",\"&leftarrow;\":\"\\u2190\",\"&leftarrowtail;\":\"\\u21A2\",\"&leftharpoondown;\":\"\\u21BD\",\"&leftharpoonup;\":\"\\u21BC\",\"&leftleftarrows;\":\"\\u21C7\",\"&leftrightarrow;\":\"\\u2194\",\"&leftrightarrows;\":\"\\u21C6\",\"&leftrightharpoons;\":\"\\u21CB\",\"&leftrightsquigarrow;\":\"\\u21AD\",\"&leftthreetimes;\":\"\\u22CB\",\"&leg;\":\"\\u22DA\",\"&leq;\":\"\\u2264\",\"&leqq;\":\"\\u2266\",\"&leqslant;\":\"\\u2A7D\",\"&les;\":\"\\u2A7D\",\"&lescc;\":\"\\u2AA8\",\"&lesdot;\":\"\\u2A7F\",\"&lesdoto;\":\"\\u2A81\",\"&lesdotor;\":\"\\u2A83\",\"&lesg;\":\"\\u22DA\\uFE00\",\"&lesges;\":\"\\u2A93\",\"&lessapprox;\":\"\\u2A85\",\"&lessdot;\":\"\\u22D6\",\"&lesseqgtr;\":\"\\u22DA\",\"&lesseqqgtr;\":\"\\u2A8B\",\"&lessgtr;\":\"\\u2276\",\"&lesssim;\":\"\\u2272\",\"&lfisht;\":\"\\u297C\",\"&lfloor;\":\"\\u230A\",\"&lfr;\":\"\\u{1D529}\",\"&lg;\":\"\\u2276\",\"&lgE;\":\"\\u2A91\",\"&lhard;\":\"\\u21BD\",\"&lharu;\":\"\\u21BC\",\"&lharul;\":\"\\u296A\",\"&lhblk;\":\"\\u2584\",\"&ljcy;\":\"\\u0459\",\"&ll;\":\"\\u226A\",\"&llarr;\":\"\\u21C7\",\"&llcorner;\":\"\\u231E\",\"&llhard;\":\"\\u296B\",\"&lltri;\":\"\\u25FA\",\"&lmidot;\":\"\\u0140\",\"&lmoust;\":\"\\u23B0\",\"&lmoustache;\":\"\\u23B0\",\"&lnE;\":\"\\u2268\",\"&lnap;\":\"\\u2A89\",\"&lnapprox;\":\"\\u2A89\",\"&lne;\":\"\\u2A87\",\"&lneq;\":\"\\u2A87\",\"&lneqq;\":\"\\u2268\",\"&lnsim;\":\"\\u22E6\",\"&loang;\":\"\\u27EC\",\"&loarr;\":\"\\u21FD\",\"&lobrk;\":\"\\u27E6\",\"&longleftarrow;\":\"\\u27F5\",\"&longleftrightarrow;\":\"\\u27F7\",\"&longmapsto;\":\"\\u27FC\",\"&longrightarrow;\":\"\\u27F6\",\"&looparrowleft;\":\"\\u21AB\",\"&looparrowright;\":\"\\u21AC\",\"&lopar;\":\"\\u2985\",\"&lopf;\":\"\\u{1D55D}\",\"&loplus;\":\"\\u2A2D\",\"&lotimes;\":\"\\u2A34\",\"&lowast;\":\"\\u2217\",\"&lowbar;\":\"_\",\"&loz;\":\"\\u25CA\",\"&lozenge;\":\"\\u25CA\",\"&lozf;\":\"\\u29EB\",\"&lpar;\":\"(\",\"&lparlt;\":\"\\u2993\",\"&lrarr;\":\"\\u21C6\",\"&lrcorner;\":\"\\u231F\",\"&lrhar;\":\"\\u21CB\",\"&lrhard;\":\"\\u296D\",\"&lrm;\":\"\\u200E\",\"&lrtri;\":\"\\u22BF\",\"&lsaquo;\":\"\\u2039\",\"&lscr;\":\"\\u{1D4C1}\",\"&lsh;\":\"\\u21B0\",\"&lsim;\":\"\\u2272\",\"&lsime;\":\"\\u2A8D\",\"&lsimg;\":\"\\u2A8F\",\"&lsqb;\":\"[\",\"&lsquo;\":\"\\u2018\",\"&lsquor;\":\"\\u201A\",\"&lstrok;\":\"\\u0142\",\"&lt\":\"<\",\"&lt;\":\"<\",\"&ltcc;\":\"\\u2AA6\",\"&ltcir;\":\"\\u2A79\",\"&ltdot;\":\"\\u22D6\",\"&lthree;\":\"\\u22CB\",\"&ltimes;\":\"\\u22C9\",\"&ltlarr;\":\"\\u2976\",\"&ltquest;\":\"\\u2A7B\",\"&ltrPar;\":\"\\u2996\",\"&ltri;\":\"\\u25C3\",\"&ltrie;\":\"\\u22B4\",\"&ltrif;\":\"\\u25C2\",\"&lurdshar;\":\"\\u294A\",\"&luruhar;\":\"\\u2966\",\"&lvertneqq;\":\"\\u2268\\uFE00\",\"&lvnE;\":\"\\u2268\\uFE00\",\"&mDDot;\":\"\\u223A\",\"&macr\":\"\\xAF\",\"&macr;\":\"\\xAF\",\"&male;\":\"\\u2642\",\"&malt;\":\"\\u2720\",\"&maltese;\":\"\\u2720\",\"&map;\":\"\\u21A6\",\"&mapsto;\":\"\\u21A6\",\"&mapstodown;\":\"\\u21A7\",\"&mapstoleft;\":\"\\u21A4\",\"&mapstoup;\":\"\\u21A5\",\"&marker;\":\"\\u25AE\",\"&mcomma;\":\"\\u2A29\",\"&mcy;\":\"\\u043C\",\"&mdash;\":\"\\u2014\",\"&measuredangle;\":\"\\u2221\",\"&mfr;\":\"\\u{1D52A}\",\"&mho;\":\"\\u2127\",\"&micro\":\"\\xB5\",\"&micro;\":\"\\xB5\",\"&mid;\":\"\\u2223\",\"&midast;\":\"*\",\"&midcir;\":\"\\u2AF0\",\"&middot\":\"\\xB7\",\"&middot;\":\"\\xB7\",\"&minus;\":\"\\u2212\",\"&minusb;\":\"\\u229F\",\"&minusd;\":\"\\u2238\",\"&minusdu;\":\"\\u2A2A\",\"&mlcp;\":\"\\u2ADB\",\"&mldr;\":\"\\u2026\",\"&mnplus;\":\"\\u2213\",\"&models;\":\"\\u22A7\",\"&mopf;\":\"\\u{1D55E}\",\"&mp;\":\"\\u2213\",\"&mscr;\":\"\\u{1D4C2}\",\"&mstpos;\":\"\\u223E\",\"&mu;\":\"\\u03BC\",\"&multimap;\":\"\\u22B8\",\"&mumap;\":\"\\u22B8\",\"&nGg;\":\"\\u22D9\\u0338\",\"&nGt;\":\"\\u226B\\u20D2\",\"&nGtv;\":\"\\u226B\\u0338\",\"&nLeftarrow;\":\"\\u21CD\",\"&nLeftrightarrow;\":\"\\u21CE\",\"&nLl;\":\"\\u22D8\\u0338\",\"&nLt;\":\"\\u226A\\u20D2\",\"&nLtv;\":\"\\u226A\\u0338\",\"&nRightarrow;\":\"\\u21CF\",\"&nVDash;\":\"\\u22AF\",\"&nVdash;\":\"\\u22AE\",\"&nabla;\":\"\\u2207\",\"&nacute;\":\"\\u0144\",\"&nang;\":\"\\u2220\\u20D2\",\"&nap;\":\"\\u2249\",\"&napE;\":\"\\u2A70\\u0338\",\"&napid;\":\"\\u224B\\u0338\",\"&napos;\":\"\\u0149\",\"&napprox;\":\"\\u2249\",\"&natur;\":\"\\u266E\",\"&natural;\":\"\\u266E\",\"&naturals;\":\"\\u2115\",\"&nbsp\":\"\\xA0\",\"&nbsp;\":\"\\xA0\",\"&nbump;\":\"\\u224E\\u0338\",\"&nbumpe;\":\"\\u224F\\u0338\",\"&ncap;\":\"\\u2A43\",\"&ncaron;\":\"\\u0148\",\"&ncedil;\":\"\\u0146\",\"&ncong;\":\"\\u2247\",\"&ncongdot;\":\"\\u2A6D\\u0338\",\"&ncup;\":\"\\u2A42\",\"&ncy;\":\"\\u043D\",\"&ndash;\":\"\\u2013\",\"&ne;\":\"\\u2260\",\"&neArr;\":\"\\u21D7\",\"&nearhk;\":\"\\u2924\",\"&nearr;\":\"\\u2197\",\"&nearrow;\":\"\\u2197\",\"&nedot;\":\"\\u2250\\u0338\",\"&nequiv;\":\"\\u2262\",\"&nesear;\":\"\\u2928\",\"&nesim;\":\"\\u2242\\u0338\",\"&nexist;\":\"\\u2204\",\"&nexists;\":\"\\u2204\",\"&nfr;\":\"\\u{1D52B}\",\"&ngE;\":\"\\u2267\\u0338\",\"&nge;\":\"\\u2271\",\"&ngeq;\":\"\\u2271\",\"&ngeqq;\":\"\\u2267\\u0338\",\"&ngeqslant;\":\"\\u2A7E\\u0338\",\"&nges;\":\"\\u2A7E\\u0338\",\"&ngsim;\":\"\\u2275\",\"&ngt;\":\"\\u226F\",\"&ngtr;\":\"\\u226F\",\"&nhArr;\":\"\\u21CE\",\"&nharr;\":\"\\u21AE\",\"&nhpar;\":\"\\u2AF2\",\"&ni;\":\"\\u220B\",\"&nis;\":\"\\u22FC\",\"&nisd;\":\"\\u22FA\",\"&niv;\":\"\\u220B\",\"&njcy;\":\"\\u045A\",\"&nlArr;\":\"\\u21CD\",\"&nlE;\":\"\\u2266\\u0338\",\"&nlarr;\":\"\\u219A\",\"&nldr;\":\"\\u2025\",\"&nle;\":\"\\u2270\",\"&nleftarrow;\":\"\\u219A\",\"&nleftrightarrow;\":\"\\u21AE\",\"&nleq;\":\"\\u2270\",\"&nleqq;\":\"\\u2266\\u0338\",\"&nleqslant;\":\"\\u2A7D\\u0338\",\"&nles;\":\"\\u2A7D\\u0338\",\"&nless;\":\"\\u226E\",\"&nlsim;\":\"\\u2274\",\"&nlt;\":\"\\u226E\",\"&nltri;\":\"\\u22EA\",\"&nltrie;\":\"\\u22EC\",\"&nmid;\":\"\\u2224\",\"&nopf;\":\"\\u{1D55F}\",\"&not\":\"\\xAC\",\"&not;\":\"\\xAC\",\"&notin;\":\"\\u2209\",\"&notinE;\":\"\\u22F9\\u0338\",\"&notindot;\":\"\\u22F5\\u0338\",\"&notinva;\":\"\\u2209\",\"&notinvb;\":\"\\u22F7\",\"&notinvc;\":\"\\u22F6\",\"&notni;\":\"\\u220C\",\"&notniva;\":\"\\u220C\",\"&notnivb;\":\"\\u22FE\",\"&notnivc;\":\"\\u22FD\",\"&npar;\":\"\\u2226\",\"&nparallel;\":\"\\u2226\",\"&nparsl;\":\"\\u2AFD\\u20E5\",\"&npart;\":\"\\u2202\\u0338\",\"&npolint;\":\"\\u2A14\",\"&npr;\":\"\\u2280\",\"&nprcue;\":\"\\u22E0\",\"&npre;\":\"\\u2AAF\\u0338\",\"&nprec;\":\"\\u2280\",\"&npreceq;\":\"\\u2AAF\\u0338\",\"&nrArr;\":\"\\u21CF\",\"&nrarr;\":\"\\u219B\",\"&nrarrc;\":\"\\u2933\\u0338\",\"&nrarrw;\":\"\\u219D\\u0338\",\"&nrightarrow;\":\"\\u219B\",\"&nrtri;\":\"\\u22EB\",\"&nrtrie;\":\"\\u22ED\",\"&nsc;\":\"\\u2281\",\"&nsccue;\":\"\\u22E1\",\"&nsce;\":\"\\u2AB0\\u0338\",\"&nscr;\":\"\\u{1D4C3}\",\"&nshortmid;\":\"\\u2224\",\"&nshortparallel;\":\"\\u2226\",\"&nsim;\":\"\\u2241\",\"&nsime;\":\"\\u2244\",\"&nsimeq;\":\"\\u2244\",\"&nsmid;\":\"\\u2224\",\"&nspar;\":\"\\u2226\",\"&nsqsube;\":\"\\u22E2\",\"&nsqsupe;\":\"\\u22E3\",\"&nsub;\":\"\\u2284\",\"&nsubE;\":\"\\u2AC5\\u0338\",\"&nsube;\":\"\\u2288\",\"&nsubset;\":\"\\u2282\\u20D2\",\"&nsubseteq;\":\"\\u2288\",\"&nsubseteqq;\":\"\\u2AC5\\u0338\",\"&nsucc;\":\"\\u2281\",\"&nsucceq;\":\"\\u2AB0\\u0338\",\"&nsup;\":\"\\u2285\",\"&nsupE;\":\"\\u2AC6\\u0338\",\"&nsupe;\":\"\\u2289\",\"&nsupset;\":\"\\u2283\\u20D2\",\"&nsupseteq;\":\"\\u2289\",\"&nsupseteqq;\":\"\\u2AC6\\u0338\",\"&ntgl;\":\"\\u2279\",\"&ntilde\":\"\\xF1\",\"&ntilde;\":\"\\xF1\",\"&ntlg;\":\"\\u2278\",\"&ntriangleleft;\":\"\\u22EA\",\"&ntrianglelefteq;\":\"\\u22EC\",\"&ntriangleright;\":\"\\u22EB\",\"&ntrianglerighteq;\":\"\\u22ED\",\"&nu;\":\"\\u03BD\",\"&num;\":\"#\",\"&numero;\":\"\\u2116\",\"&numsp;\":\"\\u2007\",\"&nvDash;\":\"\\u22AD\",\"&nvHarr;\":\"\\u2904\",\"&nvap;\":\"\\u224D\\u20D2\",\"&nvdash;\":\"\\u22AC\",\"&nvge;\":\"\\u2265\\u20D2\",\"&nvgt;\":\">\\u20D2\",\"&nvinfin;\":\"\\u29DE\",\"&nvlArr;\":\"\\u2902\",\"&nvle;\":\"\\u2264\\u20D2\",\"&nvlt;\":\"<\\u20D2\",\"&nvltrie;\":\"\\u22B4\\u20D2\",\"&nvrArr;\":\"\\u2903\",\"&nvrtrie;\":\"\\u22B5\\u20D2\",\"&nvsim;\":\"\\u223C\\u20D2\",\"&nwArr;\":\"\\u21D6\",\"&nwarhk;\":\"\\u2923\",\"&nwarr;\":\"\\u2196\",\"&nwarrow;\":\"\\u2196\",\"&nwnear;\":\"\\u2927\",\"&oS;\":\"\\u24C8\",\"&oacute\":\"\\xF3\",\"&oacute;\":\"\\xF3\",\"&oast;\":\"\\u229B\",\"&ocir;\":\"\\u229A\",\"&ocirc\":\"\\xF4\",\"&ocirc;\":\"\\xF4\",\"&ocy;\":\"\\u043E\",\"&odash;\":\"\\u229D\",\"&odblac;\":\"\\u0151\",\"&odiv;\":\"\\u2A38\",\"&odot;\":\"\\u2299\",\"&odsold;\":\"\\u29BC\",\"&oelig;\":\"\\u0153\",\"&ofcir;\":\"\\u29BF\",\"&ofr;\":\"\\u{1D52C}\",\"&ogon;\":\"\\u02DB\",\"&ograve\":\"\\xF2\",\"&ograve;\":\"\\xF2\",\"&ogt;\":\"\\u29C1\",\"&ohbar;\":\"\\u29B5\",\"&ohm;\":\"\\u03A9\",\"&oint;\":\"\\u222E\",\"&olarr;\":\"\\u21BA\",\"&olcir;\":\"\\u29BE\",\"&olcross;\":\"\\u29BB\",\"&oline;\":\"\\u203E\",\"&olt;\":\"\\u29C0\",\"&omacr;\":\"\\u014D\",\"&omega;\":\"\\u03C9\",\"&omicron;\":\"\\u03BF\",\"&omid;\":\"\\u29B6\",\"&ominus;\":\"\\u2296\",\"&oopf;\":\"\\u{1D560}\",\"&opar;\":\"\\u29B7\",\"&operp;\":\"\\u29B9\",\"&oplus;\":\"\\u2295\",\"&or;\":\"\\u2228\",\"&orarr;\":\"\\u21BB\",\"&ord;\":\"\\u2A5D\",\"&order;\":\"\\u2134\",\"&orderof;\":\"\\u2134\",\"&ordf\":\"\\xAA\",\"&ordf;\":\"\\xAA\",\"&ordm\":\"\\xBA\",\"&ordm;\":\"\\xBA\",\"&origof;\":\"\\u22B6\",\"&oror;\":\"\\u2A56\",\"&orslope;\":\"\\u2A57\",\"&orv;\":\"\\u2A5B\",\"&oscr;\":\"\\u2134\",\"&oslash\":\"\\xF8\",\"&oslash;\":\"\\xF8\",\"&osol;\":\"\\u2298\",\"&otilde\":\"\\xF5\",\"&otilde;\":\"\\xF5\",\"&otimes;\":\"\\u2297\",\"&otimesas;\":\"\\u2A36\",\"&ouml\":\"\\xF6\",\"&ouml;\":\"\\xF6\",\"&ovbar;\":\"\\u233D\",\"&par;\":\"\\u2225\",\"&para\":\"\\xB6\",\"&para;\":\"\\xB6\",\"&parallel;\":\"\\u2225\",\"&parsim;\":\"\\u2AF3\",\"&parsl;\":\"\\u2AFD\",\"&part;\":\"\\u2202\",\"&pcy;\":\"\\u043F\",\"&percnt;\":\"%\",\"&period;\":\".\",\"&permil;\":\"\\u2030\",\"&perp;\":\"\\u22A5\",\"&pertenk;\":\"\\u2031\",\"&pfr;\":\"\\u{1D52D}\",\"&phi;\":\"\\u03C6\",\"&phiv;\":\"\\u03D5\",\"&phmmat;\":\"\\u2133\",\"&phone;\":\"\\u260E\",\"&pi;\":\"\\u03C0\",\"&pitchfork;\":\"\\u22D4\",\"&piv;\":\"\\u03D6\",\"&planck;\":\"\\u210F\",\"&planckh;\":\"\\u210E\",\"&plankv;\":\"\\u210F\",\"&plus;\":\"+\",\"&plusacir;\":\"\\u2A23\",\"&plusb;\":\"\\u229E\",\"&pluscir;\":\"\\u2A22\",\"&plusdo;\":\"\\u2214\",\"&plusdu;\":\"\\u2A25\",\"&pluse;\":\"\\u2A72\",\"&plusmn\":\"\\xB1\",\"&plusmn;\":\"\\xB1\",\"&plussim;\":\"\\u2A26\",\"&plustwo;\":\"\\u2A27\",\"&pm;\":\"\\xB1\",\"&pointint;\":\"\\u2A15\",\"&popf;\":\"\\u{1D561}\",\"&pound\":\"\\xA3\",\"&pound;\":\"\\xA3\",\"&pr;\":\"\\u227A\",\"&prE;\":\"\\u2AB3\",\"&prap;\":\"\\u2AB7\",\"&prcue;\":\"\\u227C\",\"&pre;\":\"\\u2AAF\",\"&prec;\":\"\\u227A\",\"&precapprox;\":\"\\u2AB7\",\"&preccurlyeq;\":\"\\u227C\",\"&preceq;\":\"\\u2AAF\",\"&precnapprox;\":\"\\u2AB9\",\"&precneqq;\":\"\\u2AB5\",\"&precnsim;\":\"\\u22E8\",\"&precsim;\":\"\\u227E\",\"&prime;\":\"\\u2032\",\"&primes;\":\"\\u2119\",\"&prnE;\":\"\\u2AB5\",\"&prnap;\":\"\\u2AB9\",\"&prnsim;\":\"\\u22E8\",\"&prod;\":\"\\u220F\",\"&profalar;\":\"\\u232E\",\"&profline;\":\"\\u2312\",\"&profsurf;\":\"\\u2313\",\"&prop;\":\"\\u221D\",\"&propto;\":\"\\u221D\",\"&prsim;\":\"\\u227E\",\"&prurel;\":\"\\u22B0\",\"&pscr;\":\"\\u{1D4C5}\",\"&psi;\":\"\\u03C8\",\"&puncsp;\":\"\\u2008\",\"&qfr;\":\"\\u{1D52E}\",\"&qint;\":\"\\u2A0C\",\"&qopf;\":\"\\u{1D562}\",\"&qprime;\":\"\\u2057\",\"&qscr;\":\"\\u{1D4C6}\",\"&quaternions;\":\"\\u210D\",\"&quatint;\":\"\\u2A16\",\"&quest;\":\"?\",\"&questeq;\":\"\\u225F\",\"&quot\":'\"',\"&quot;\":'\"',\"&rAarr;\":\"\\u21DB\",\"&rArr;\":\"\\u21D2\",\"&rAtail;\":\"\\u291C\",\"&rBarr;\":\"\\u290F\",\"&rHar;\":\"\\u2964\",\"&race;\":\"\\u223D\\u0331\",\"&racute;\":\"\\u0155\",\"&radic;\":\"\\u221A\",\"&raemptyv;\":\"\\u29B3\",\"&rang;\":\"\\u27E9\",\"&rangd;\":\"\\u2992\",\"&range;\":\"\\u29A5\",\"&rangle;\":\"\\u27E9\",\"&raquo\":\"\\xBB\",\"&raquo;\":\"\\xBB\",\"&rarr;\":\"\\u2192\",\"&rarrap;\":\"\\u2975\",\"&rarrb;\":\"\\u21E5\",\"&rarrbfs;\":\"\\u2920\",\"&rarrc;\":\"\\u2933\",\"&rarrfs;\":\"\\u291E\",\"&rarrhk;\":\"\\u21AA\",\"&rarrlp;\":\"\\u21AC\",\"&rarrpl;\":\"\\u2945\",\"&rarrsim;\":\"\\u2974\",\"&rarrtl;\":\"\\u21A3\",\"&rarrw;\":\"\\u219D\",\"&ratail;\":\"\\u291A\",\"&ratio;\":\"\\u2236\",\"&rationals;\":\"\\u211A\",\"&rbarr;\":\"\\u290D\",\"&rbbrk;\":\"\\u2773\",\"&rbrace;\":\"}\",\"&rbrack;\":\"]\",\"&rbrke;\":\"\\u298C\",\"&rbrksld;\":\"\\u298E\",\"&rbrkslu;\":\"\\u2990\",\"&rcaron;\":\"\\u0159\",\"&rcedil;\":\"\\u0157\",\"&rceil;\":\"\\u2309\",\"&rcub;\":\"}\",\"&rcy;\":\"\\u0440\",\"&rdca;\":\"\\u2937\",\"&rdldhar;\":\"\\u2969\",\"&rdquo;\":\"\\u201D\",\"&rdquor;\":\"\\u201D\",\"&rdsh;\":\"\\u21B3\",\"&real;\":\"\\u211C\",\"&realine;\":\"\\u211B\",\"&realpart;\":\"\\u211C\",\"&reals;\":\"\\u211D\",\"&rect;\":\"\\u25AD\",\"&reg\":\"\\xAE\",\"&reg;\":\"\\xAE\",\"&rfisht;\":\"\\u297D\",\"&rfloor;\":\"\\u230B\",\"&rfr;\":\"\\u{1D52F}\",\"&rhard;\":\"\\u21C1\",\"&rharu;\":\"\\u21C0\",\"&rharul;\":\"\\u296C\",\"&rho;\":\"\\u03C1\",\"&rhov;\":\"\\u03F1\",\"&rightarrow;\":\"\\u2192\",\"&rightarrowtail;\":\"\\u21A3\",\"&rightharpoondown;\":\"\\u21C1\",\"&rightharpoonup;\":\"\\u21C0\",\"&rightleftarrows;\":\"\\u21C4\",\"&rightleftharpoons;\":\"\\u21CC\",\"&rightrightarrows;\":\"\\u21C9\",\"&rightsquigarrow;\":\"\\u219D\",\"&rightthreetimes;\":\"\\u22CC\",\"&ring;\":\"\\u02DA\",\"&risingdotseq;\":\"\\u2253\",\"&rlarr;\":\"\\u21C4\",\"&rlhar;\":\"\\u21CC\",\"&rlm;\":\"\\u200F\",\"&rmoust;\":\"\\u23B1\",\"&rmoustache;\":\"\\u23B1\",\"&rnmid;\":\"\\u2AEE\",\"&roang;\":\"\\u27ED\",\"&roarr;\":\"\\u21FE\",\"&robrk;\":\"\\u27E7\",\"&ropar;\":\"\\u2986\",\"&ropf;\":\"\\u{1D563}\",\"&roplus;\":\"\\u2A2E\",\"&rotimes;\":\"\\u2A35\",\"&rpar;\":\")\",\"&rpargt;\":\"\\u2994\",\"&rppolint;\":\"\\u2A12\",\"&rrarr;\":\"\\u21C9\",\"&rsaquo;\":\"\\u203A\",\"&rscr;\":\"\\u{1D4C7}\",\"&rsh;\":\"\\u21B1\",\"&rsqb;\":\"]\",\"&rsquo;\":\"\\u2019\",\"&rsquor;\":\"\\u2019\",\"&rthree;\":\"\\u22CC\",\"&rtimes;\":\"\\u22CA\",\"&rtri;\":\"\\u25B9\",\"&rtrie;\":\"\\u22B5\",\"&rtrif;\":\"\\u25B8\",\"&rtriltri;\":\"\\u29CE\",\"&ruluhar;\":\"\\u2968\",\"&rx;\":\"\\u211E\",\"&sacute;\":\"\\u015B\",\"&sbquo;\":\"\\u201A\",\"&sc;\":\"\\u227B\",\"&scE;\":\"\\u2AB4\",\"&scap;\":\"\\u2AB8\",\"&scaron;\":\"\\u0161\",\"&sccue;\":\"\\u227D\",\"&sce;\":\"\\u2AB0\",\"&scedil;\":\"\\u015F\",\"&scirc;\":\"\\u015D\",\"&scnE;\":\"\\u2AB6\",\"&scnap;\":\"\\u2ABA\",\"&scnsim;\":\"\\u22E9\",\"&scpolint;\":\"\\u2A13\",\"&scsim;\":\"\\u227F\",\"&scy;\":\"\\u0441\",\"&sdot;\":\"\\u22C5\",\"&sdotb;\":\"\\u22A1\",\"&sdote;\":\"\\u2A66\",\"&seArr;\":\"\\u21D8\",\"&searhk;\":\"\\u2925\",\"&searr;\":\"\\u2198\",\"&searrow;\":\"\\u2198\",\"&sect\":\"\\xA7\",\"&sect;\":\"\\xA7\",\"&semi;\":\";\",\"&seswar;\":\"\\u2929\",\"&setminus;\":\"\\u2216\",\"&setmn;\":\"\\u2216\",\"&sext;\":\"\\u2736\",\"&sfr;\":\"\\u{1D530}\",\"&sfrown;\":\"\\u2322\",\"&sharp;\":\"\\u266F\",\"&shchcy;\":\"\\u0449\",\"&shcy;\":\"\\u0448\",\"&shortmid;\":\"\\u2223\",\"&shortparallel;\":\"\\u2225\",\"&shy\":\"\\xAD\",\"&shy;\":\"\\xAD\",\"&sigma;\":\"\\u03C3\",\"&sigmaf;\":\"\\u03C2\",\"&sigmav;\":\"\\u03C2\",\"&sim;\":\"\\u223C\",\"&simdot;\":\"\\u2A6A\",\"&sime;\":\"\\u2243\",\"&simeq;\":\"\\u2243\",\"&simg;\":\"\\u2A9E\",\"&simgE;\":\"\\u2AA0\",\"&siml;\":\"\\u2A9D\",\"&simlE;\":\"\\u2A9F\",\"&simne;\":\"\\u2246\",\"&simplus;\":\"\\u2A24\",\"&simrarr;\":\"\\u2972\",\"&slarr;\":\"\\u2190\",\"&smallsetminus;\":\"\\u2216\",\"&smashp;\":\"\\u2A33\",\"&smeparsl;\":\"\\u29E4\",\"&smid;\":\"\\u2223\",\"&smile;\":\"\\u2323\",\"&smt;\":\"\\u2AAA\",\"&smte;\":\"\\u2AAC\",\"&smtes;\":\"\\u2AAC\\uFE00\",\"&softcy;\":\"\\u044C\",\"&sol;\":\"/\",\"&solb;\":\"\\u29C4\",\"&solbar;\":\"\\u233F\",\"&sopf;\":\"\\u{1D564}\",\"&spades;\":\"\\u2660\",\"&spadesuit;\":\"\\u2660\",\"&spar;\":\"\\u2225\",\"&sqcap;\":\"\\u2293\",\"&sqcaps;\":\"\\u2293\\uFE00\",\"&sqcup;\":\"\\u2294\",\"&sqcups;\":\"\\u2294\\uFE00\",\"&sqsub;\":\"\\u228F\",\"&sqsube;\":\"\\u2291\",\"&sqsubset;\":\"\\u228F\",\"&sqsubseteq;\":\"\\u2291\",\"&sqsup;\":\"\\u2290\",\"&sqsupe;\":\"\\u2292\",\"&sqsupset;\":\"\\u2290\",\"&sqsupseteq;\":\"\\u2292\",\"&squ;\":\"\\u25A1\",\"&square;\":\"\\u25A1\",\"&squarf;\":\"\\u25AA\",\"&squf;\":\"\\u25AA\",\"&srarr;\":\"\\u2192\",\"&sscr;\":\"\\u{1D4C8}\",\"&ssetmn;\":\"\\u2216\",\"&ssmile;\":\"\\u2323\",\"&sstarf;\":\"\\u22C6\",\"&star;\":\"\\u2606\",\"&starf;\":\"\\u2605\",\"&straightepsilon;\":\"\\u03F5\",\"&straightphi;\":\"\\u03D5\",\"&strns;\":\"\\xAF\",\"&sub;\":\"\\u2282\",\"&subE;\":\"\\u2AC5\",\"&subdot;\":\"\\u2ABD\",\"&sube;\":\"\\u2286\",\"&subedot;\":\"\\u2AC3\",\"&submult;\":\"\\u2AC1\",\"&subnE;\":\"\\u2ACB\",\"&subne;\":\"\\u228A\",\"&subplus;\":\"\\u2ABF\",\"&subrarr;\":\"\\u2979\",\"&subset;\":\"\\u2282\",\"&subseteq;\":\"\\u2286\",\"&subseteqq;\":\"\\u2AC5\",\"&subsetneq;\":\"\\u228A\",\"&subsetneqq;\":\"\\u2ACB\",\"&subsim;\":\"\\u2AC7\",\"&subsub;\":\"\\u2AD5\",\"&subsup;\":\"\\u2AD3\",\"&succ;\":\"\\u227B\",\"&succapprox;\":\"\\u2AB8\",\"&succcurlyeq;\":\"\\u227D\",\"&succeq;\":\"\\u2AB0\",\"&succnapprox;\":\"\\u2ABA\",\"&succneqq;\":\"\\u2AB6\",\"&succnsim;\":\"\\u22E9\",\"&succsim;\":\"\\u227F\",\"&sum;\":\"\\u2211\",\"&sung;\":\"\\u266A\",\"&sup1\":\"\\xB9\",\"&sup1;\":\"\\xB9\",\"&sup2\":\"\\xB2\",\"&sup2;\":\"\\xB2\",\"&sup3\":\"\\xB3\",\"&sup3;\":\"\\xB3\",\"&sup;\":\"\\u2283\",\"&supE;\":\"\\u2AC6\",\"&supdot;\":\"\\u2ABE\",\"&supdsub;\":\"\\u2AD8\",\"&supe;\":\"\\u2287\",\"&supedot;\":\"\\u2AC4\",\"&suphsol;\":\"\\u27C9\",\"&suphsub;\":\"\\u2AD7\",\"&suplarr;\":\"\\u297B\",\"&supmult;\":\"\\u2AC2\",\"&supnE;\":\"\\u2ACC\",\"&supne;\":\"\\u228B\",\"&supplus;\":\"\\u2AC0\",\"&supset;\":\"\\u2283\",\"&supseteq;\":\"\\u2287\",\"&supseteqq;\":\"\\u2AC6\",\"&supsetneq;\":\"\\u228B\",\"&supsetneqq;\":\"\\u2ACC\",\"&supsim;\":\"\\u2AC8\",\"&supsub;\":\"\\u2AD4\",\"&supsup;\":\"\\u2AD6\",\"&swArr;\":\"\\u21D9\",\"&swarhk;\":\"\\u2926\",\"&swarr;\":\"\\u2199\",\"&swarrow;\":\"\\u2199\",\"&swnwar;\":\"\\u292A\",\"&szlig\":\"\\xDF\",\"&szlig;\":\"\\xDF\",\"&target;\":\"\\u2316\",\"&tau;\":\"\\u03C4\",\"&tbrk;\":\"\\u23B4\",\"&tcaron;\":\"\\u0165\",\"&tcedil;\":\"\\u0163\",\"&tcy;\":\"\\u0442\",\"&tdot;\":\"\\u20DB\",\"&telrec;\":\"\\u2315\",\"&tfr;\":\"\\u{1D531}\",\"&there4;\":\"\\u2234\",\"&therefore;\":\"\\u2234\",\"&theta;\":\"\\u03B8\",\"&thetasym;\":\"\\u03D1\",\"&thetav;\":\"\\u03D1\",\"&thickapprox;\":\"\\u2248\",\"&thicksim;\":\"\\u223C\",\"&thinsp;\":\"\\u2009\",\"&thkap;\":\"\\u2248\",\"&thksim;\":\"\\u223C\",\"&thorn\":\"\\xFE\",\"&thorn;\":\"\\xFE\",\"&tilde;\":\"\\u02DC\",\"&times\":\"\\xD7\",\"&times;\":\"\\xD7\",\"&timesb;\":\"\\u22A0\",\"&timesbar;\":\"\\u2A31\",\"&timesd;\":\"\\u2A30\",\"&tint;\":\"\\u222D\",\"&toea;\":\"\\u2928\",\"&top;\":\"\\u22A4\",\"&topbot;\":\"\\u2336\",\"&topcir;\":\"\\u2AF1\",\"&topf;\":\"\\u{1D565}\",\"&topfork;\":\"\\u2ADA\",\"&tosa;\":\"\\u2929\",\"&tprime;\":\"\\u2034\",\"&trade;\":\"\\u2122\",\"&triangle;\":\"\\u25B5\",\"&triangledown;\":\"\\u25BF\",\"&triangleleft;\":\"\\u25C3\",\"&trianglelefteq;\":\"\\u22B4\",\"&triangleq;\":\"\\u225C\",\"&triangleright;\":\"\\u25B9\",\"&trianglerighteq;\":\"\\u22B5\",\"&tridot;\":\"\\u25EC\",\"&trie;\":\"\\u225C\",\"&triminus;\":\"\\u2A3A\",\"&triplus;\":\"\\u2A39\",\"&trisb;\":\"\\u29CD\",\"&tritime;\":\"\\u2A3B\",\"&trpezium;\":\"\\u23E2\",\"&tscr;\":\"\\u{1D4C9}\",\"&tscy;\":\"\\u0446\",\"&tshcy;\":\"\\u045B\",\"&tstrok;\":\"\\u0167\",\"&twixt;\":\"\\u226C\",\"&twoheadleftarrow;\":\"\\u219E\",\"&twoheadrightarrow;\":\"\\u21A0\",\"&uArr;\":\"\\u21D1\",\"&uHar;\":\"\\u2963\",\"&uacute\":\"\\xFA\",\"&uacute;\":\"\\xFA\",\"&uarr;\":\"\\u2191\",\"&ubrcy;\":\"\\u045E\",\"&ubreve;\":\"\\u016D\",\"&ucirc\":\"\\xFB\",\"&ucirc;\":\"\\xFB\",\"&ucy;\":\"\\u0443\",\"&udarr;\":\"\\u21C5\",\"&udblac;\":\"\\u0171\",\"&udhar;\":\"\\u296E\",\"&ufisht;\":\"\\u297E\",\"&ufr;\":\"\\u{1D532}\",\"&ugrave\":\"\\xF9\",\"&ugrave;\":\"\\xF9\",\"&uharl;\":\"\\u21BF\",\"&uharr;\":\"\\u21BE\",\"&uhblk;\":\"\\u2580\",\"&ulcorn;\":\"\\u231C\",\"&ulcorner;\":\"\\u231C\",\"&ulcrop;\":\"\\u230F\",\"&ultri;\":\"\\u25F8\",\"&umacr;\":\"\\u016B\",\"&uml\":\"\\xA8\",\"&uml;\":\"\\xA8\",\"&uogon;\":\"\\u0173\",\"&uopf;\":\"\\u{1D566}\",\"&uparrow;\":\"\\u2191\",\"&updownarrow;\":\"\\u2195\",\"&upharpoonleft;\":\"\\u21BF\",\"&upharpoonright;\":\"\\u21BE\",\"&uplus;\":\"\\u228E\",\"&upsi;\":\"\\u03C5\",\"&upsih;\":\"\\u03D2\",\"&upsilon;\":\"\\u03C5\",\"&upuparrows;\":\"\\u21C8\",\"&urcorn;\":\"\\u231D\",\"&urcorner;\":\"\\u231D\",\"&urcrop;\":\"\\u230E\",\"&uring;\":\"\\u016F\",\"&urtri;\":\"\\u25F9\",\"&uscr;\":\"\\u{1D4CA}\",\"&utdot;\":\"\\u22F0\",\"&utilde;\":\"\\u0169\",\"&utri;\":\"\\u25B5\",\"&utrif;\":\"\\u25B4\",\"&uuarr;\":\"\\u21C8\",\"&uuml\":\"\\xFC\",\"&uuml;\":\"\\xFC\",\"&uwangle;\":\"\\u29A7\",\"&vArr;\":\"\\u21D5\",\"&vBar;\":\"\\u2AE8\",\"&vBarv;\":\"\\u2AE9\",\"&vDash;\":\"\\u22A8\",\"&vangrt;\":\"\\u299C\",\"&varepsilon;\":\"\\u03F5\",\"&varkappa;\":\"\\u03F0\",\"&varnothing;\":\"\\u2205\",\"&varphi;\":\"\\u03D5\",\"&varpi;\":\"\\u03D6\",\"&varpropto;\":\"\\u221D\",\"&varr;\":\"\\u2195\",\"&varrho;\":\"\\u03F1\",\"&varsigma;\":\"\\u03C2\",\"&varsubsetneq;\":\"\\u228A\\uFE00\",\"&varsubsetneqq;\":\"\\u2ACB\\uFE00\",\"&varsupsetneq;\":\"\\u228B\\uFE00\",\"&varsupsetneqq;\":\"\\u2ACC\\uFE00\",\"&vartheta;\":\"\\u03D1\",\"&vartriangleleft;\":\"\\u22B2\",\"&vartriangleright;\":\"\\u22B3\",\"&vcy;\":\"\\u0432\",\"&vdash;\":\"\\u22A2\",\"&vee;\":\"\\u2228\",\"&veebar;\":\"\\u22BB\",\"&veeeq;\":\"\\u225A\",\"&vellip;\":\"\\u22EE\",\"&verbar;\":\"|\",\"&vert;\":\"|\",\"&vfr;\":\"\\u{1D533}\",\"&vltri;\":\"\\u22B2\",\"&vnsub;\":\"\\u2282\\u20D2\",\"&vnsup;\":\"\\u2283\\u20D2\",\"&vopf;\":\"\\u{1D567}\",\"&vprop;\":\"\\u221D\",\"&vrtri;\":\"\\u22B3\",\"&vscr;\":\"\\u{1D4CB}\",\"&vsubnE;\":\"\\u2ACB\\uFE00\",\"&vsubne;\":\"\\u228A\\uFE00\",\"&vsupnE;\":\"\\u2ACC\\uFE00\",\"&vsupne;\":\"\\u228B\\uFE00\",\"&vzigzag;\":\"\\u299A\",\"&wcirc;\":\"\\u0175\",\"&wedbar;\":\"\\u2A5F\",\"&wedge;\":\"\\u2227\",\"&wedgeq;\":\"\\u2259\",\"&weierp;\":\"\\u2118\",\"&wfr;\":\"\\u{1D534}\",\"&wopf;\":\"\\u{1D568}\",\"&wp;\":\"\\u2118\",\"&wr;\":\"\\u2240\",\"&wreath;\":\"\\u2240\",\"&wscr;\":\"\\u{1D4CC}\",\"&xcap;\":\"\\u22C2\",\"&xcirc;\":\"\\u25EF\",\"&xcup;\":\"\\u22C3\",\"&xdtri;\":\"\\u25BD\",\"&xfr;\":\"\\u{1D535}\",\"&xhArr;\":\"\\u27FA\",\"&xharr;\":\"\\u27F7\",\"&xi;\":\"\\u03BE\",\"&xlArr;\":\"\\u27F8\",\"&xlarr;\":\"\\u27F5\",\"&xmap;\":\"\\u27FC\",\"&xnis;\":\"\\u22FB\",\"&xodot;\":\"\\u2A00\",\"&xopf;\":\"\\u{1D569}\",\"&xoplus;\":\"\\u2A01\",\"&xotime;\":\"\\u2A02\",\"&xrArr;\":\"\\u27F9\",\"&xrarr;\":\"\\u27F6\",\"&xscr;\":\"\\u{1D4CD}\",\"&xsqcup;\":\"\\u2A06\",\"&xuplus;\":\"\\u2A04\",\"&xutri;\":\"\\u25B3\",\"&xvee;\":\"\\u22C1\",\"&xwedge;\":\"\\u22C0\",\"&yacute\":\"\\xFD\",\"&yacute;\":\"\\xFD\",\"&yacy;\":\"\\u044F\",\"&ycirc;\":\"\\u0177\",\"&ycy;\":\"\\u044B\",\"&yen\":\"\\xA5\",\"&yen;\":\"\\xA5\",\"&yfr;\":\"\\u{1D536}\",\"&yicy;\":\"\\u0457\",\"&yopf;\":\"\\u{1D56A}\",\"&yscr;\":\"\\u{1D4CE}\",\"&yucy;\":\"\\u044E\",\"&yuml\":\"\\xFF\",\"&yuml;\":\"\\xFF\",\"&zacute;\":\"\\u017A\",\"&zcaron;\":\"\\u017E\",\"&zcy;\":\"\\u0437\",\"&zdot;\":\"\\u017C\",\"&zeetrf;\":\"\\u2128\",\"&zeta;\":\"\\u03B6\",\"&zfr;\":\"\\u{1D537}\",\"&zhcy;\":\"\\u0436\",\"&zigrarr;\":\"\\u21DD\",\"&zopf;\":\"\\u{1D56B}\",\"&zscr;\":\"\\u{1D4CF}\",\"&zwj;\":\"\\u200D\",\"&zwnj;\":\"\\u200C\"},characters:{\\u00C6:\"&AElig;\",\"&\":\"&amp;\",\\u00C1:\"&Aacute;\",\\u0102:\"&Abreve;\",\\u00C2:\"&Acirc;\",\\u0410:\"&Acy;\",\"\\u{1D504}\":\"&Afr;\",\\u00C0:\"&Agrave;\",\\u0391:\"&Alpha;\",\\u0100:\"&Amacr;\",\"\\u2A53\":\"&And;\",\\u0104:\"&Aogon;\",\"\\u{1D538}\":\"&Aopf;\",\"\\u2061\":\"&af;\",\\u00C5:\"&angst;\",\"\\u{1D49C}\":\"&Ascr;\",\"\\u2254\":\"&coloneq;\",\\u00C3:\"&Atilde;\",\\u00C4:\"&Auml;\",\"\\u2216\":\"&ssetmn;\",\"\\u2AE7\":\"&Barv;\",\"\\u2306\":\"&doublebarwedge;\",\\u0411:\"&Bcy;\",\"\\u2235\":\"&because;\",\\u212C:\"&bernou;\",\\u0392:\"&Beta;\",\"\\u{1D505}\":\"&Bfr;\",\"\\u{1D539}\":\"&Bopf;\",\"\\u02D8\":\"&breve;\",\"\\u224E\":\"&bump;\",\\u0427:\"&CHcy;\",\"\\xA9\":\"&copy;\",\\u0106:\"&Cacute;\",\"\\u22D2\":\"&Cap;\",\"\\u2145\":\"&DD;\",\\u212D:\"&Cfr;\",\\u010C:\"&Ccaron;\",\\u00C7:\"&Ccedil;\",\\u0108:\"&Ccirc;\",\"\\u2230\":\"&Cconint;\",\\u010A:\"&Cdot;\",\"\\xB8\":\"&cedil;\",\"\\xB7\":\"&middot;\",\\u03A7:\"&Chi;\",\"\\u2299\":\"&odot;\",\"\\u2296\":\"&ominus;\",\"\\u2295\":\"&oplus;\",\"\\u2297\":\"&otimes;\",\"\\u2232\":\"&cwconint;\",\"\\u201D\":\"&rdquor;\",\"\\u2019\":\"&rsquor;\",\"\\u2237\":\"&Proportion;\",\"\\u2A74\":\"&Colone;\",\"\\u2261\":\"&equiv;\",\"\\u222F\":\"&DoubleContourIntegral;\",\"\\u222E\":\"&oint;\",\\u2102:\"&complexes;\",\"\\u2210\":\"&coprod;\",\"\\u2233\":\"&awconint;\",\"\\u2A2F\":\"&Cross;\",\"\\u{1D49E}\":\"&Cscr;\",\"\\u22D3\":\"&Cup;\",\"\\u224D\":\"&asympeq;\",\"\\u2911\":\"&DDotrahd;\",\\u0402:\"&DJcy;\",\\u0405:\"&DScy;\",\\u040F:\"&DZcy;\",\"\\u2021\":\"&ddagger;\",\"\\u21A1\":\"&Darr;\",\"\\u2AE4\":\"&DoubleLeftTee;\",\\u010E:\"&Dcaron;\",\\u0414:\"&Dcy;\",\"\\u2207\":\"&nabla;\",\\u0394:\"&Delta;\",\"\\u{1D507}\":\"&Dfr;\",\"\\xB4\":\"&acute;\",\"\\u02D9\":\"&dot;\",\"\\u02DD\":\"&dblac;\",\"`\":\"&grave;\",\"\\u02DC\":\"&tilde;\",\"\\u22C4\":\"&diamond;\",\"\\u2146\":\"&dd;\",\"\\u{1D53B}\":\"&Dopf;\",\"\\xA8\":\"&uml;\",\"\\u20DC\":\"&DotDot;\",\"\\u2250\":\"&esdot;\",\"\\u21D3\":\"&dArr;\",\"\\u21D0\":\"&lArr;\",\"\\u21D4\":\"&iff;\",\"\\u27F8\":\"&xlArr;\",\"\\u27FA\":\"&xhArr;\",\"\\u27F9\":\"&xrArr;\",\"\\u21D2\":\"&rArr;\",\"\\u22A8\":\"&vDash;\",\"\\u21D1\":\"&uArr;\",\"\\u21D5\":\"&vArr;\",\"\\u2225\":\"&spar;\",\"\\u2193\":\"&downarrow;\",\"\\u2913\":\"&DownArrowBar;\",\"\\u21F5\":\"&duarr;\",\"\\u0311\":\"&DownBreve;\",\"\\u2950\":\"&DownLeftRightVector;\",\"\\u295E\":\"&DownLeftTeeVector;\",\"\\u21BD\":\"&lhard;\",\"\\u2956\":\"&DownLeftVectorBar;\",\"\\u295F\":\"&DownRightTeeVector;\",\"\\u21C1\":\"&rightharpoondown;\",\"\\u2957\":\"&DownRightVectorBar;\",\"\\u22A4\":\"&top;\",\"\\u21A7\":\"&mapstodown;\",\"\\u{1D49F}\":\"&Dscr;\",\\u0110:\"&Dstrok;\",\\u014A:\"&ENG;\",\\u00D0:\"&ETH;\",\\u00C9:\"&Eacute;\",\\u011A:\"&Ecaron;\",\\u00CA:\"&Ecirc;\",\\u042D:\"&Ecy;\",\\u0116:\"&Edot;\",\"\\u{1D508}\":\"&Efr;\",\\u00C8:\"&Egrave;\",\"\\u2208\":\"&isinv;\",\\u0112:\"&Emacr;\",\"\\u25FB\":\"&EmptySmallSquare;\",\"\\u25AB\":\"&EmptyVerySmallSquare;\",\\u0118:\"&Eogon;\",\"\\u{1D53C}\":\"&Eopf;\",\\u0395:\"&Epsilon;\",\"\\u2A75\":\"&Equal;\",\"\\u2242\":\"&esim;\",\"\\u21CC\":\"&rlhar;\",\\u2130:\"&expectation;\",\"\\u2A73\":\"&Esim;\",\\u0397:\"&Eta;\",\\u00CB:\"&Euml;\",\"\\u2203\":\"&exist;\",\"\\u2147\":\"&exponentiale;\",\\u0424:\"&Fcy;\",\"\\u{1D509}\":\"&Ffr;\",\"\\u25FC\":\"&FilledSmallSquare;\",\"\\u25AA\":\"&squf;\",\"\\u{1D53D}\":\"&Fopf;\",\"\\u2200\":\"&forall;\",\\u2131:\"&Fscr;\",\\u0403:\"&GJcy;\",\">\":\"&gt;\",\\u0393:\"&Gamma;\",\\u03DC:\"&Gammad;\",\\u011E:\"&Gbreve;\",\\u0122:\"&Gcedil;\",\\u011C:\"&Gcirc;\",\\u0413:\"&Gcy;\",\\u0120:\"&Gdot;\",\"\\u{1D50A}\":\"&Gfr;\",\"\\u22D9\":\"&ggg;\",\"\\u{1D53E}\":\"&Gopf;\",\"\\u2265\":\"&geq;\",\"\\u22DB\":\"&gtreqless;\",\"\\u2267\":\"&geqq;\",\"\\u2AA2\":\"&GreaterGreater;\",\"\\u2277\":\"&gtrless;\",\"\\u2A7E\":\"&ges;\",\"\\u2273\":\"&gtrsim;\",\"\\u{1D4A2}\":\"&Gscr;\",\"\\u226B\":\"&gg;\",\\u042A:\"&HARDcy;\",\"\\u02C7\":\"&caron;\",\"^\":\"&Hat;\",\\u0124:\"&Hcirc;\",\\u210C:\"&Poincareplane;\",\\u210B:\"&hamilt;\",\\u210D:\"&quaternions;\",\"\\u2500\":\"&boxh;\",\\u0126:\"&Hstrok;\",\"\\u224F\":\"&bumpeq;\",\\u0415:\"&IEcy;\",\\u0132:\"&IJlig;\",\\u0401:\"&IOcy;\",\\u00CD:\"&Iacute;\",\\u00CE:\"&Icirc;\",\\u0418:\"&Icy;\",\\u0130:\"&Idot;\",\\u2111:\"&imagpart;\",\\u00CC:\"&Igrave;\",\\u012A:\"&Imacr;\",\"\\u2148\":\"&ii;\",\"\\u222C\":\"&Int;\",\"\\u222B\":\"&int;\",\"\\u22C2\":\"&xcap;\",\"\\u2063\":\"&ic;\",\"\\u2062\":\"&it;\",\\u012E:\"&Iogon;\",\"\\u{1D540}\":\"&Iopf;\",\\u0399:\"&Iota;\",\\u2110:\"&imagline;\",\\u0128:\"&Itilde;\",\\u0406:\"&Iukcy;\",\\u00CF:\"&Iuml;\",\\u0134:\"&Jcirc;\",\\u0419:\"&Jcy;\",\"\\u{1D50D}\":\"&Jfr;\",\"\\u{1D541}\":\"&Jopf;\",\"\\u{1D4A5}\":\"&Jscr;\",\\u0408:\"&Jsercy;\",\\u0404:\"&Jukcy;\",\\u0425:\"&KHcy;\",\\u040C:\"&KJcy;\",\\u039A:\"&Kappa;\",\\u0136:\"&Kcedil;\",\\u041A:\"&Kcy;\",\"\\u{1D50E}\":\"&Kfr;\",\"\\u{1D542}\":\"&Kopf;\",\"\\u{1D4A6}\":\"&Kscr;\",\\u0409:\"&LJcy;\",\"<\":\"&lt;\",\\u0139:\"&Lacute;\",\\u039B:\"&Lambda;\",\"\\u27EA\":\"&Lang;\",\\u2112:\"&lagran;\",\"\\u219E\":\"&twoheadleftarrow;\",\\u013D:\"&Lcaron;\",\\u013B:\"&Lcedil;\",\\u041B:\"&Lcy;\",\"\\u27E8\":\"&langle;\",\"\\u2190\":\"&slarr;\",\"\\u21E4\":\"&larrb;\",\"\\u21C6\":\"&lrarr;\",\"\\u2308\":\"&lceil;\",\"\\u27E6\":\"&lobrk;\",\"\\u2961\":\"&LeftDownTeeVector;\",\"\\u21C3\":\"&downharpoonleft;\",\"\\u2959\":\"&LeftDownVectorBar;\",\"\\u230A\":\"&lfloor;\",\"\\u2194\":\"&leftrightarrow;\",\"\\u294E\":\"&LeftRightVector;\",\"\\u22A3\":\"&dashv;\",\"\\u21A4\":\"&mapstoleft;\",\"\\u295A\":\"&LeftTeeVector;\",\"\\u22B2\":\"&vltri;\",\"\\u29CF\":\"&LeftTriangleBar;\",\"\\u22B4\":\"&trianglelefteq;\",\"\\u2951\":\"&LeftUpDownVector;\",\"\\u2960\":\"&LeftUpTeeVector;\",\"\\u21BF\":\"&upharpoonleft;\",\"\\u2958\":\"&LeftUpVectorBar;\",\"\\u21BC\":\"&lharu;\",\"\\u2952\":\"&LeftVectorBar;\",\"\\u22DA\":\"&lesseqgtr;\",\"\\u2266\":\"&leqq;\",\"\\u2276\":\"&lg;\",\"\\u2AA1\":\"&LessLess;\",\"\\u2A7D\":\"&les;\",\"\\u2272\":\"&lsim;\",\"\\u{1D50F}\":\"&Lfr;\",\"\\u22D8\":\"&Ll;\",\"\\u21DA\":\"&lAarr;\",\\u013F:\"&Lmidot;\",\"\\u27F5\":\"&xlarr;\",\"\\u27F7\":\"&xharr;\",\"\\u27F6\":\"&xrarr;\",\"\\u{1D543}\":\"&Lopf;\",\"\\u2199\":\"&swarrow;\",\"\\u2198\":\"&searrow;\",\"\\u21B0\":\"&lsh;\",\\u0141:\"&Lstrok;\",\"\\u226A\":\"&ll;\",\"\\u2905\":\"&Map;\",\\u041C:\"&Mcy;\",\"\\u205F\":\"&MediumSpace;\",\\u2133:\"&phmmat;\",\"\\u{1D510}\":\"&Mfr;\",\"\\u2213\":\"&mp;\",\"\\u{1D544}\":\"&Mopf;\",\\u039C:\"&Mu;\",\\u040A:\"&NJcy;\",\\u0143:\"&Nacute;\",\\u0147:\"&Ncaron;\",\\u0145:\"&Ncedil;\",\\u041D:\"&Ncy;\",\"\\u200B\":\"&ZeroWidthSpace;\",\"\\n\":\"&NewLine;\",\"\\u{1D511}\":\"&Nfr;\",\"\\u2060\":\"&NoBreak;\",\"\\xA0\":\"&nbsp;\",\\u2115:\"&naturals;\",\"\\u2AEC\":\"&Not;\",\"\\u2262\":\"&nequiv;\",\"\\u226D\":\"&NotCupCap;\",\"\\u2226\":\"&nspar;\",\"\\u2209\":\"&notinva;\",\"\\u2260\":\"&ne;\",\"\\u2242\\u0338\":\"&nesim;\",\"\\u2204\":\"&nexists;\",\"\\u226F\":\"&ngtr;\",\"\\u2271\":\"&ngeq;\",\"\\u2267\\u0338\":\"&ngeqq;\",\"\\u226B\\u0338\":\"&nGtv;\",\"\\u2279\":\"&ntgl;\",\"\\u2A7E\\u0338\":\"&nges;\",\"\\u2275\":\"&ngsim;\",\"\\u224E\\u0338\":\"&nbump;\",\"\\u224F\\u0338\":\"&nbumpe;\",\"\\u22EA\":\"&ntriangleleft;\",\"\\u29CF\\u0338\":\"&NotLeftTriangleBar;\",\"\\u22EC\":\"&ntrianglelefteq;\",\"\\u226E\":\"&nlt;\",\"\\u2270\":\"&nleq;\",\"\\u2278\":\"&ntlg;\",\"\\u226A\\u0338\":\"&nLtv;\",\"\\u2A7D\\u0338\":\"&nles;\",\"\\u2274\":\"&nlsim;\",\"\\u2AA2\\u0338\":\"&NotNestedGreaterGreater;\",\"\\u2AA1\\u0338\":\"&NotNestedLessLess;\",\"\\u2280\":\"&nprec;\",\"\\u2AAF\\u0338\":\"&npreceq;\",\"\\u22E0\":\"&nprcue;\",\"\\u220C\":\"&notniva;\",\"\\u22EB\":\"&ntriangleright;\",\"\\u29D0\\u0338\":\"&NotRightTriangleBar;\",\"\\u22ED\":\"&ntrianglerighteq;\",\"\\u228F\\u0338\":\"&NotSquareSubset;\",\"\\u22E2\":\"&nsqsube;\",\"\\u2290\\u0338\":\"&NotSquareSuperset;\",\"\\u22E3\":\"&nsqsupe;\",\"\\u2282\\u20D2\":\"&vnsub;\",\"\\u2288\":\"&nsubseteq;\",\"\\u2281\":\"&nsucc;\",\"\\u2AB0\\u0338\":\"&nsucceq;\",\"\\u22E1\":\"&nsccue;\",\"\\u227F\\u0338\":\"&NotSucceedsTilde;\",\"\\u2283\\u20D2\":\"&vnsup;\",\"\\u2289\":\"&nsupseteq;\",\"\\u2241\":\"&nsim;\",\"\\u2244\":\"&nsimeq;\",\"\\u2247\":\"&ncong;\",\"\\u2249\":\"&napprox;\",\"\\u2224\":\"&nsmid;\",\"\\u{1D4A9}\":\"&Nscr;\",\\u00D1:\"&Ntilde;\",\\u039D:\"&Nu;\",\\u0152:\"&OElig;\",\\u00D3:\"&Oacute;\",\\u00D4:\"&Ocirc;\",\\u041E:\"&Ocy;\",\\u0150:\"&Odblac;\",\"\\u{1D512}\":\"&Ofr;\",\\u00D2:\"&Ograve;\",\\u014C:\"&Omacr;\",\\u03A9:\"&ohm;\",\\u039F:\"&Omicron;\",\"\\u{1D546}\":\"&Oopf;\",\"\\u201C\":\"&ldquo;\",\"\\u2018\":\"&lsquo;\",\"\\u2A54\":\"&Or;\",\"\\u{1D4AA}\":\"&Oscr;\",\\u00D8:\"&Oslash;\",\\u00D5:\"&Otilde;\",\"\\u2A37\":\"&Otimes;\",\\u00D6:\"&Ouml;\",\"\\u203E\":\"&oline;\",\"\\u23DE\":\"&OverBrace;\",\"\\u23B4\":\"&tbrk;\",\"\\u23DC\":\"&OverParenthesis;\",\"\\u2202\":\"&part;\",\\u041F:\"&Pcy;\",\"\\u{1D513}\":\"&Pfr;\",\\u03A6:\"&Phi;\",\\u03A0:\"&Pi;\",\"\\xB1\":\"&pm;\",\\u2119:\"&primes;\",\"\\u2ABB\":\"&Pr;\",\"\\u227A\":\"&prec;\",\"\\u2AAF\":\"&preceq;\",\"\\u227C\":\"&preccurlyeq;\",\"\\u227E\":\"&prsim;\",\"\\u2033\":\"&Prime;\",\"\\u220F\":\"&prod;\",\"\\u221D\":\"&vprop;\",\"\\u{1D4AB}\":\"&Pscr;\",\\u03A8:\"&Psi;\",'\"':\"&quot;\",\"\\u{1D514}\":\"&Qfr;\",\\u211A:\"&rationals;\",\"\\u{1D4AC}\":\"&Qscr;\",\"\\u2910\":\"&drbkarow;\",\"\\xAE\":\"&reg;\",\\u0154:\"&Racute;\",\"\\u27EB\":\"&Rang;\",\"\\u21A0\":\"&twoheadrightarrow;\",\"\\u2916\":\"&Rarrtl;\",\\u0158:\"&Rcaron;\",\\u0156:\"&Rcedil;\",\\u0420:\"&Rcy;\",\\u211C:\"&realpart;\",\"\\u220B\":\"&niv;\",\"\\u21CB\":\"&lrhar;\",\"\\u296F\":\"&duhar;\",\\u03A1:\"&Rho;\",\"\\u27E9\":\"&rangle;\",\"\\u2192\":\"&srarr;\",\"\\u21E5\":\"&rarrb;\",\"\\u21C4\":\"&rlarr;\",\"\\u2309\":\"&rceil;\",\"\\u27E7\":\"&robrk;\",\"\\u295D\":\"&RightDownTeeVector;\",\"\\u21C2\":\"&downharpoonright;\",\"\\u2955\":\"&RightDownVectorBar;\",\"\\u230B\":\"&rfloor;\",\"\\u22A2\":\"&vdash;\",\"\\u21A6\":\"&mapsto;\",\"\\u295B\":\"&RightTeeVector;\",\"\\u22B3\":\"&vrtri;\",\"\\u29D0\":\"&RightTriangleBar;\",\"\\u22B5\":\"&trianglerighteq;\",\"\\u294F\":\"&RightUpDownVector;\",\"\\u295C\":\"&RightUpTeeVector;\",\"\\u21BE\":\"&upharpoonright;\",\"\\u2954\":\"&RightUpVectorBar;\",\"\\u21C0\":\"&rightharpoonup;\",\"\\u2953\":\"&RightVectorBar;\",\\u211D:\"&reals;\",\"\\u2970\":\"&RoundImplies;\",\"\\u21DB\":\"&rAarr;\",\\u211B:\"&realine;\",\"\\u21B1\":\"&rsh;\",\"\\u29F4\":\"&RuleDelayed;\",\\u0429:\"&SHCHcy;\",\\u0428:\"&SHcy;\",\\u042C:\"&SOFTcy;\",\\u015A:\"&Sacute;\",\"\\u2ABC\":\"&Sc;\",\\u0160:\"&Scaron;\",\\u015E:\"&Scedil;\",\\u015C:\"&Scirc;\",\\u0421:\"&Scy;\",\"\\u{1D516}\":\"&Sfr;\",\"\\u2191\":\"&uparrow;\",\\u03A3:\"&Sigma;\",\"\\u2218\":\"&compfn;\",\"\\u{1D54A}\":\"&Sopf;\",\"\\u221A\":\"&radic;\",\"\\u25A1\":\"&square;\",\"\\u2293\":\"&sqcap;\",\"\\u228F\":\"&sqsubset;\",\"\\u2291\":\"&sqsubseteq;\",\"\\u2290\":\"&sqsupset;\",\"\\u2292\":\"&sqsupseteq;\",\"\\u2294\":\"&sqcup;\",\"\\u{1D4AE}\":\"&Sscr;\",\"\\u22C6\":\"&sstarf;\",\"\\u22D0\":\"&Subset;\",\"\\u2286\":\"&subseteq;\",\"\\u227B\":\"&succ;\",\"\\u2AB0\":\"&succeq;\",\"\\u227D\":\"&succcurlyeq;\",\"\\u227F\":\"&succsim;\",\"\\u2211\":\"&sum;\",\"\\u22D1\":\"&Supset;\",\"\\u2283\":\"&supset;\",\"\\u2287\":\"&supseteq;\",\\u00DE:\"&THORN;\",\"\\u2122\":\"&trade;\",\\u040B:\"&TSHcy;\",\\u0426:\"&TScy;\",\"\t\":\"&Tab;\",\\u03A4:\"&Tau;\",\\u0164:\"&Tcaron;\",\\u0162:\"&Tcedil;\",\\u0422:\"&Tcy;\",\"\\u{1D517}\":\"&Tfr;\",\"\\u2234\":\"&therefore;\",\\u0398:\"&Theta;\",\"\\u205F\\u200A\":\"&ThickSpace;\",\"\\u2009\":\"&thinsp;\",\"\\u223C\":\"&thksim;\",\"\\u2243\":\"&simeq;\",\"\\u2245\":\"&cong;\",\"\\u2248\":\"&thkap;\",\"\\u{1D54B}\":\"&Topf;\",\"\\u20DB\":\"&tdot;\",\"\\u{1D4AF}\":\"&Tscr;\",\\u0166:\"&Tstrok;\",\\u00DA:\"&Uacute;\",\"\\u219F\":\"&Uarr;\",\"\\u2949\":\"&Uarrocir;\",\\u040E:\"&Ubrcy;\",\\u016C:\"&Ubreve;\",\\u00DB:\"&Ucirc;\",\\u0423:\"&Ucy;\",\\u0170:\"&Udblac;\",\"\\u{1D518}\":\"&Ufr;\",\\u00D9:\"&Ugrave;\",\\u016A:\"&Umacr;\",_:\"&lowbar;\",\"\\u23DF\":\"&UnderBrace;\",\"\\u23B5\":\"&bbrk;\",\"\\u23DD\":\"&UnderParenthesis;\",\"\\u22C3\":\"&xcup;\",\"\\u228E\":\"&uplus;\",\\u0172:\"&Uogon;\",\"\\u{1D54C}\":\"&Uopf;\",\"\\u2912\":\"&UpArrowBar;\",\"\\u21C5\":\"&udarr;\",\"\\u2195\":\"&varr;\",\"\\u296E\":\"&udhar;\",\"\\u22A5\":\"&perp;\",\"\\u21A5\":\"&mapstoup;\",\"\\u2196\":\"&nwarrow;\",\"\\u2197\":\"&nearrow;\",\\u03D2:\"&upsih;\",\\u03A5:\"&Upsilon;\",\\u016E:\"&Uring;\",\"\\u{1D4B0}\":\"&Uscr;\",\\u0168:\"&Utilde;\",\\u00DC:\"&Uuml;\",\"\\u22AB\":\"&VDash;\",\"\\u2AEB\":\"&Vbar;\",\\u0412:\"&Vcy;\",\"\\u22A9\":\"&Vdash;\",\"\\u2AE6\":\"&Vdashl;\",\"\\u22C1\":\"&xvee;\",\"\\u2016\":\"&Vert;\",\"\\u2223\":\"&smid;\",\"|\":\"&vert;\",\"\\u2758\":\"&VerticalSeparator;\",\"\\u2240\":\"&wreath;\",\"\\u200A\":\"&hairsp;\",\"\\u{1D519}\":\"&Vfr;\",\"\\u{1D54D}\":\"&Vopf;\",\"\\u{1D4B1}\":\"&Vscr;\",\"\\u22AA\":\"&Vvdash;\",\\u0174:\"&Wcirc;\",\"\\u22C0\":\"&xwedge;\",\"\\u{1D51A}\":\"&Wfr;\",\"\\u{1D54E}\":\"&Wopf;\",\"\\u{1D4B2}\":\"&Wscr;\",\"\\u{1D51B}\":\"&Xfr;\",\\u039E:\"&Xi;\",\"\\u{1D54F}\":\"&Xopf;\",\"\\u{1D4B3}\":\"&Xscr;\",\\u042F:\"&YAcy;\",\\u0407:\"&YIcy;\",\\u042E:\"&YUcy;\",\\u00DD:\"&Yacute;\",\\u0176:\"&Ycirc;\",\\u042B:\"&Ycy;\",\"\\u{1D51C}\":\"&Yfr;\",\"\\u{1D550}\":\"&Yopf;\",\"\\u{1D4B4}\":\"&Yscr;\",\\u0178:\"&Yuml;\",\\u0416:\"&ZHcy;\",\\u0179:\"&Zacute;\",\\u017D:\"&Zcaron;\",\\u0417:\"&Zcy;\",\\u017B:\"&Zdot;\",\\u0396:\"&Zeta;\",\\u2128:\"&zeetrf;\",\\u2124:\"&integers;\",\"\\u{1D4B5}\":\"&Zscr;\",\\u00E1:\"&aacute;\",\\u0103:\"&abreve;\",\"\\u223E\":\"&mstpos;\",\"\\u223E\\u0333\":\"&acE;\",\"\\u223F\":\"&acd;\",\\u00E2:\"&acirc;\",\\u0430:\"&acy;\",\\u00E6:\"&aelig;\",\"\\u{1D51E}\":\"&afr;\",\\u00E0:\"&agrave;\",\\u2135:\"&aleph;\",\\u03B1:\"&alpha;\",\\u0101:\"&amacr;\",\"\\u2A3F\":\"&amalg;\",\"\\u2227\":\"&wedge;\",\"\\u2A55\":\"&andand;\",\"\\u2A5C\":\"&andd;\",\"\\u2A58\":\"&andslope;\",\"\\u2A5A\":\"&andv;\",\"\\u2220\":\"&angle;\",\"\\u29A4\":\"&ange;\",\"\\u2221\":\"&measuredangle;\",\"\\u29A8\":\"&angmsdaa;\",\"\\u29A9\":\"&angmsdab;\",\"\\u29AA\":\"&angmsdac;\",\"\\u29AB\":\"&angmsdad;\",\"\\u29AC\":\"&angmsdae;\",\"\\u29AD\":\"&angmsdaf;\",\"\\u29AE\":\"&angmsdag;\",\"\\u29AF\":\"&angmsdah;\",\"\\u221F\":\"&angrt;\",\"\\u22BE\":\"&angrtvb;\",\"\\u299D\":\"&angrtvbd;\",\"\\u2222\":\"&angsph;\",\"\\u237C\":\"&angzarr;\",\\u0105:\"&aogon;\",\"\\u{1D552}\":\"&aopf;\",\"\\u2A70\":\"&apE;\",\"\\u2A6F\":\"&apacir;\",\"\\u224A\":\"&approxeq;\",\"\\u224B\":\"&apid;\",\"'\":\"&apos;\",\\u00E5:\"&aring;\",\"\\u{1D4B6}\":\"&ascr;\",\"*\":\"&midast;\",\\u00E3:\"&atilde;\",\\u00E4:\"&auml;\",\"\\u2A11\":\"&awint;\",\"\\u2AED\":\"&bNot;\",\"\\u224C\":\"&bcong;\",\"\\u03F6\":\"&bepsi;\",\"\\u2035\":\"&bprime;\",\"\\u223D\":\"&bsim;\",\"\\u22CD\":\"&bsime;\",\"\\u22BD\":\"&barvee;\",\"\\u2305\":\"&barwedge;\",\"\\u23B6\":\"&bbrktbrk;\",\\u0431:\"&bcy;\",\"\\u201E\":\"&ldquor;\",\"\\u29B0\":\"&bemptyv;\",\\u03B2:\"&beta;\",\\u2136:\"&beth;\",\"\\u226C\":\"&twixt;\",\"\\u{1D51F}\":\"&bfr;\",\"\\u25EF\":\"&xcirc;\",\"\\u2A00\":\"&xodot;\",\"\\u2A01\":\"&xoplus;\",\"\\u2A02\":\"&xotime;\",\"\\u2A06\":\"&xsqcup;\",\"\\u2605\":\"&starf;\",\"\\u25BD\":\"&xdtri;\",\"\\u25B3\":\"&xutri;\",\"\\u2A04\":\"&xuplus;\",\"\\u290D\":\"&rbarr;\",\"\\u29EB\":\"&lozf;\",\"\\u25B4\":\"&utrif;\",\"\\u25BE\":\"&dtrif;\",\"\\u25C2\":\"&ltrif;\",\"\\u25B8\":\"&rtrif;\",\"\\u2423\":\"&blank;\",\"\\u2592\":\"&blk12;\",\"\\u2591\":\"&blk14;\",\"\\u2593\":\"&blk34;\",\"\\u2588\":\"&block;\",\"=\\u20E5\":\"&bne;\",\"\\u2261\\u20E5\":\"&bnequiv;\",\"\\u2310\":\"&bnot;\",\"\\u{1D553}\":\"&bopf;\",\"\\u22C8\":\"&bowtie;\",\"\\u2557\":\"&boxDL;\",\"\\u2554\":\"&boxDR;\",\"\\u2556\":\"&boxDl;\",\"\\u2553\":\"&boxDr;\",\"\\u2550\":\"&boxH;\",\"\\u2566\":\"&boxHD;\",\"\\u2569\":\"&boxHU;\",\"\\u2564\":\"&boxHd;\",\"\\u2567\":\"&boxHu;\",\"\\u255D\":\"&boxUL;\",\"\\u255A\":\"&boxUR;\",\"\\u255C\":\"&boxUl;\",\"\\u2559\":\"&boxUr;\",\"\\u2551\":\"&boxV;\",\"\\u256C\":\"&boxVH;\",\"\\u2563\":\"&boxVL;\",\"\\u2560\":\"&boxVR;\",\"\\u256B\":\"&boxVh;\",\"\\u2562\":\"&boxVl;\",\"\\u255F\":\"&boxVr;\",\"\\u29C9\":\"&boxbox;\",\"\\u2555\":\"&boxdL;\",\"\\u2552\":\"&boxdR;\",\"\\u2510\":\"&boxdl;\",\"\\u250C\":\"&boxdr;\",\"\\u2565\":\"&boxhD;\",\"\\u2568\":\"&boxhU;\",\"\\u252C\":\"&boxhd;\",\"\\u2534\":\"&boxhu;\",\"\\u229F\":\"&minusb;\",\"\\u229E\":\"&plusb;\",\"\\u22A0\":\"&timesb;\",\"\\u255B\":\"&boxuL;\",\"\\u2558\":\"&boxuR;\",\"\\u2518\":\"&boxul;\",\"\\u2514\":\"&boxur;\",\"\\u2502\":\"&boxv;\",\"\\u256A\":\"&boxvH;\",\"\\u2561\":\"&boxvL;\",\"\\u255E\":\"&boxvR;\",\"\\u253C\":\"&boxvh;\",\"\\u2524\":\"&boxvl;\",\"\\u251C\":\"&boxvr;\",\"\\xA6\":\"&brvbar;\",\"\\u{1D4B7}\":\"&bscr;\",\"\\u204F\":\"&bsemi;\",\"\\\\\":\"&bsol;\",\"\\u29C5\":\"&bsolb;\",\"\\u27C8\":\"&bsolhsub;\",\"\\u2022\":\"&bullet;\",\"\\u2AAE\":\"&bumpE;\",\\u0107:\"&cacute;\",\"\\u2229\":\"&cap;\",\"\\u2A44\":\"&capand;\",\"\\u2A49\":\"&capbrcup;\",\"\\u2A4B\":\"&capcap;\",\"\\u2A47\":\"&capcup;\",\"\\u2A40\":\"&capdot;\",\"\\u2229\\uFE00\":\"&caps;\",\"\\u2041\":\"&caret;\",\"\\u2A4D\":\"&ccaps;\",\\u010D:\"&ccaron;\",\\u00E7:\"&ccedil;\",\\u0109:\"&ccirc;\",\"\\u2A4C\":\"&ccups;\",\"\\u2A50\":\"&ccupssm;\",\\u010B:\"&cdot;\",\"\\u29B2\":\"&cemptyv;\",\"\\xA2\":\"&cent;\",\"\\u{1D520}\":\"&cfr;\",\\u0447:\"&chcy;\",\"\\u2713\":\"&checkmark;\",\\u03C7:\"&chi;\",\"\\u25CB\":\"&cir;\",\"\\u29C3\":\"&cirE;\",\"\\u02C6\":\"&circ;\",\"\\u2257\":\"&cire;\",\"\\u21BA\":\"&olarr;\",\"\\u21BB\":\"&orarr;\",\"\\u24C8\":\"&oS;\",\"\\u229B\":\"&oast;\",\"\\u229A\":\"&ocir;\",\"\\u229D\":\"&odash;\",\"\\u2A10\":\"&cirfnint;\",\"\\u2AEF\":\"&cirmid;\",\"\\u29C2\":\"&cirscir;\",\"\\u2663\":\"&clubsuit;\",\":\":\"&colon;\",\",\":\"&comma;\",\"@\":\"&commat;\",\"\\u2201\":\"&complement;\",\"\\u2A6D\":\"&congdot;\",\"\\u{1D554}\":\"&copf;\",\"\\u2117\":\"&copysr;\",\"\\u21B5\":\"&crarr;\",\"\\u2717\":\"&cross;\",\"\\u{1D4B8}\":\"&cscr;\",\"\\u2ACF\":\"&csub;\",\"\\u2AD1\":\"&csube;\",\"\\u2AD0\":\"&csup;\",\"\\u2AD2\":\"&csupe;\",\"\\u22EF\":\"&ctdot;\",\"\\u2938\":\"&cudarrl;\",\"\\u2935\":\"&cudarrr;\",\"\\u22DE\":\"&curlyeqprec;\",\"\\u22DF\":\"&curlyeqsucc;\",\"\\u21B6\":\"&curvearrowleft;\",\"\\u293D\":\"&cularrp;\",\"\\u222A\":\"&cup;\",\"\\u2A48\":\"&cupbrcap;\",\"\\u2A46\":\"&cupcap;\",\"\\u2A4A\":\"&cupcup;\",\"\\u228D\":\"&cupdot;\",\"\\u2A45\":\"&cupor;\",\"\\u222A\\uFE00\":\"&cups;\",\"\\u21B7\":\"&curvearrowright;\",\"\\u293C\":\"&curarrm;\",\"\\u22CE\":\"&cuvee;\",\"\\u22CF\":\"&cuwed;\",\"\\xA4\":\"&curren;\",\"\\u2231\":\"&cwint;\",\"\\u232D\":\"&cylcty;\",\"\\u2965\":\"&dHar;\",\"\\u2020\":\"&dagger;\",\\u2138:\"&daleth;\",\"\\u2010\":\"&hyphen;\",\"\\u290F\":\"&rBarr;\",\\u010F:\"&dcaron;\",\\u0434:\"&dcy;\",\"\\u21CA\":\"&downdownarrows;\",\"\\u2A77\":\"&eDDot;\",\"\\xB0\":\"&deg;\",\\u03B4:\"&delta;\",\"\\u29B1\":\"&demptyv;\",\"\\u297F\":\"&dfisht;\",\"\\u{1D521}\":\"&dfr;\",\"\\u2666\":\"&diams;\",\\u03DD:\"&gammad;\",\"\\u22F2\":\"&disin;\",\"\\xF7\":\"&divide;\",\"\\u22C7\":\"&divonx;\",\\u0452:\"&djcy;\",\"\\u231E\":\"&llcorner;\",\"\\u230D\":\"&dlcrop;\",$:\"&dollar;\",\"\\u{1D555}\":\"&dopf;\",\"\\u2251\":\"&eDot;\",\"\\u2238\":\"&minusd;\",\"\\u2214\":\"&plusdo;\",\"\\u22A1\":\"&sdotb;\",\"\\u231F\":\"&lrcorner;\",\"\\u230C\":\"&drcrop;\",\"\\u{1D4B9}\":\"&dscr;\",\\u0455:\"&dscy;\",\"\\u29F6\":\"&dsol;\",\\u0111:\"&dstrok;\",\"\\u22F1\":\"&dtdot;\",\"\\u25BF\":\"&triangledown;\",\"\\u29A6\":\"&dwangle;\",\\u045F:\"&dzcy;\",\"\\u27FF\":\"&dzigrarr;\",\\u00E9:\"&eacute;\",\"\\u2A6E\":\"&easter;\",\\u011B:\"&ecaron;\",\"\\u2256\":\"&eqcirc;\",\\u00EA:\"&ecirc;\",\"\\u2255\":\"&eqcolon;\",\\u044D:\"&ecy;\",\\u0117:\"&edot;\",\"\\u2252\":\"&fallingdotseq;\",\"\\u{1D522}\":\"&efr;\",\"\\u2A9A\":\"&eg;\",\\u00E8:\"&egrave;\",\"\\u2A96\":\"&eqslantgtr;\",\"\\u2A98\":\"&egsdot;\",\"\\u2A99\":\"&el;\",\"\\u23E7\":\"&elinters;\",\\u2113:\"&ell;\",\"\\u2A95\":\"&eqslantless;\",\"\\u2A97\":\"&elsdot;\",\\u0113:\"&emacr;\",\"\\u2205\":\"&varnothing;\",\"\\u2004\":\"&emsp13;\",\"\\u2005\":\"&emsp14;\",\"\\u2003\":\"&emsp;\",\\u014B:\"&eng;\",\"\\u2002\":\"&ensp;\",\\u0119:\"&eogon;\",\"\\u{1D556}\":\"&eopf;\",\"\\u22D5\":\"&epar;\",\"\\u29E3\":\"&eparsl;\",\"\\u2A71\":\"&eplus;\",\\u03B5:\"&epsilon;\",\"\\u03F5\":\"&varepsilon;\",\"=\":\"&equals;\",\"\\u225F\":\"&questeq;\",\"\\u2A78\":\"&equivDD;\",\"\\u29E5\":\"&eqvparsl;\",\"\\u2253\":\"&risingdotseq;\",\"\\u2971\":\"&erarr;\",\\u212F:\"&escr;\",\\u03B7:\"&eta;\",\\u00F0:\"&eth;\",\\u00EB:\"&euml;\",\"\\u20AC\":\"&euro;\",\"!\":\"&excl;\",\\u0444:\"&fcy;\",\"\\u2640\":\"&female;\",\\uFB03:\"&ffilig;\",\\uFB00:\"&fflig;\",\\uFB04:\"&ffllig;\",\"\\u{1D523}\":\"&ffr;\",\\uFB01:\"&filig;\",fj:\"&fjlig;\",\"\\u266D\":\"&flat;\",\\uFB02:\"&fllig;\",\"\\u25B1\":\"&fltns;\",\\u0192:\"&fnof;\",\"\\u{1D557}\":\"&fopf;\",\"\\u22D4\":\"&pitchfork;\",\"\\u2AD9\":\"&forkv;\",\"\\u2A0D\":\"&fpartint;\",\"\\xBD\":\"&half;\",\"\\u2153\":\"&frac13;\",\"\\xBC\":\"&frac14;\",\"\\u2155\":\"&frac15;\",\"\\u2159\":\"&frac16;\",\"\\u215B\":\"&frac18;\",\"\\u2154\":\"&frac23;\",\"\\u2156\":\"&frac25;\",\"\\xBE\":\"&frac34;\",\"\\u2157\":\"&frac35;\",\"\\u215C\":\"&frac38;\",\"\\u2158\":\"&frac45;\",\"\\u215A\":\"&frac56;\",\"\\u215D\":\"&frac58;\",\"\\u215E\":\"&frac78;\",\"\\u2044\":\"&frasl;\",\"\\u2322\":\"&sfrown;\",\"\\u{1D4BB}\":\"&fscr;\",\"\\u2A8C\":\"&gtreqqless;\",\\u01F5:\"&gacute;\",\\u03B3:\"&gamma;\",\"\\u2A86\":\"&gtrapprox;\",\\u011F:\"&gbreve;\",\\u011D:\"&gcirc;\",\\u0433:\"&gcy;\",\\u0121:\"&gdot;\",\"\\u2AA9\":\"&gescc;\",\"\\u2A80\":\"&gesdot;\",\"\\u2A82\":\"&gesdoto;\",\"\\u2A84\":\"&gesdotol;\",\"\\u22DB\\uFE00\":\"&gesl;\",\"\\u2A94\":\"&gesles;\",\"\\u{1D524}\":\"&gfr;\",\\u2137:\"&gimel;\",\\u0453:\"&gjcy;\",\"\\u2A92\":\"&glE;\",\"\\u2AA5\":\"&gla;\",\"\\u2AA4\":\"&glj;\",\"\\u2269\":\"&gneqq;\",\"\\u2A8A\":\"&gnapprox;\",\"\\u2A88\":\"&gneq;\",\"\\u22E7\":\"&gnsim;\",\"\\u{1D558}\":\"&gopf;\",\\u210A:\"&gscr;\",\"\\u2A8E\":\"&gsime;\",\"\\u2A90\":\"&gsiml;\",\"\\u2AA7\":\"&gtcc;\",\"\\u2A7A\":\"&gtcir;\",\"\\u22D7\":\"&gtrdot;\",\"\\u2995\":\"&gtlPar;\",\"\\u2A7C\":\"&gtquest;\",\"\\u2978\":\"&gtrarr;\",\"\\u2269\\uFE00\":\"&gvnE;\",\\u044A:\"&hardcy;\",\"\\u2948\":\"&harrcir;\",\"\\u21AD\":\"&leftrightsquigarrow;\",\\u210F:\"&plankv;\",\\u0125:\"&hcirc;\",\"\\u2665\":\"&heartsuit;\",\"\\u2026\":\"&mldr;\",\"\\u22B9\":\"&hercon;\",\"\\u{1D525}\":\"&hfr;\",\"\\u2925\":\"&searhk;\",\"\\u2926\":\"&swarhk;\",\"\\u21FF\":\"&hoarr;\",\"\\u223B\":\"&homtht;\",\"\\u21A9\":\"&larrhk;\",\"\\u21AA\":\"&rarrhk;\",\"\\u{1D559}\":\"&hopf;\",\"\\u2015\":\"&horbar;\",\"\\u{1D4BD}\":\"&hscr;\",\\u0127:\"&hstrok;\",\"\\u2043\":\"&hybull;\",\\u00ED:\"&iacute;\",\\u00EE:\"&icirc;\",\\u0438:\"&icy;\",\\u0435:\"&iecy;\",\"\\xA1\":\"&iexcl;\",\"\\u{1D526}\":\"&ifr;\",\\u00EC:\"&igrave;\",\"\\u2A0C\":\"&qint;\",\"\\u222D\":\"&tint;\",\"\\u29DC\":\"&iinfin;\",\"\\u2129\":\"&iiota;\",\\u0133:\"&ijlig;\",\\u012B:\"&imacr;\",\\u0131:\"&inodot;\",\"\\u22B7\":\"&imof;\",\\u01B5:\"&imped;\",\"\\u2105\":\"&incare;\",\"\\u221E\":\"&infin;\",\"\\u29DD\":\"&infintie;\",\"\\u22BA\":\"&intercal;\",\"\\u2A17\":\"&intlarhk;\",\"\\u2A3C\":\"&iprod;\",\\u0451:\"&iocy;\",\\u012F:\"&iogon;\",\"\\u{1D55A}\":\"&iopf;\",\\u03B9:\"&iota;\",\"\\xBF\":\"&iquest;\",\"\\u{1D4BE}\":\"&iscr;\",\"\\u22F9\":\"&isinE;\",\"\\u22F5\":\"&isindot;\",\"\\u22F4\":\"&isins;\",\"\\u22F3\":\"&isinsv;\",\\u0129:\"&itilde;\",\\u0456:\"&iukcy;\",\\u00EF:\"&iuml;\",\\u0135:\"&jcirc;\",\\u0439:\"&jcy;\",\"\\u{1D527}\":\"&jfr;\",\"\\u0237\":\"&jmath;\",\"\\u{1D55B}\":\"&jopf;\",\"\\u{1D4BF}\":\"&jscr;\",\\u0458:\"&jsercy;\",\\u0454:\"&jukcy;\",\\u03BA:\"&kappa;\",\\u03F0:\"&varkappa;\",\\u0137:\"&kcedil;\",\\u043A:\"&kcy;\",\"\\u{1D528}\":\"&kfr;\",\\u0138:\"&kgreen;\",\\u0445:\"&khcy;\",\\u045C:\"&kjcy;\",\"\\u{1D55C}\":\"&kopf;\",\"\\u{1D4C0}\":\"&kscr;\",\"\\u291B\":\"&lAtail;\",\"\\u290E\":\"&lBarr;\",\"\\u2A8B\":\"&lesseqqgtr;\",\"\\u2962\":\"&lHar;\",\\u013A:\"&lacute;\",\"\\u29B4\":\"&laemptyv;\",\\u03BB:\"&lambda;\",\"\\u2991\":\"&langd;\",\"\\u2A85\":\"&lessapprox;\",\"\\xAB\":\"&laquo;\",\"\\u291F\":\"&larrbfs;\",\"\\u291D\":\"&larrfs;\",\"\\u21AB\":\"&looparrowleft;\",\"\\u2939\":\"&larrpl;\",\"\\u2973\":\"&larrsim;\",\"\\u21A2\":\"&leftarrowtail;\",\"\\u2AAB\":\"&lat;\",\"\\u2919\":\"&latail;\",\"\\u2AAD\":\"&late;\",\"\\u2AAD\\uFE00\":\"&lates;\",\"\\u290C\":\"&lbarr;\",\"\\u2772\":\"&lbbrk;\",\"{\":\"&lcub;\",\"[\":\"&lsqb;\",\"\\u298B\":\"&lbrke;\",\"\\u298F\":\"&lbrksld;\",\"\\u298D\":\"&lbrkslu;\",\\u013E:\"&lcaron;\",\\u013C:\"&lcedil;\",\\u043B:\"&lcy;\",\"\\u2936\":\"&ldca;\",\"\\u2967\":\"&ldrdhar;\",\"\\u294B\":\"&ldrushar;\",\"\\u21B2\":\"&ldsh;\",\"\\u2264\":\"&leq;\",\"\\u21C7\":\"&llarr;\",\"\\u22CB\":\"&lthree;\",\"\\u2AA8\":\"&lescc;\",\"\\u2A7F\":\"&lesdot;\",\"\\u2A81\":\"&lesdoto;\",\"\\u2A83\":\"&lesdotor;\",\"\\u22DA\\uFE00\":\"&lesg;\",\"\\u2A93\":\"&lesges;\",\"\\u22D6\":\"&ltdot;\",\"\\u297C\":\"&lfisht;\",\"\\u{1D529}\":\"&lfr;\",\"\\u2A91\":\"&lgE;\",\"\\u296A\":\"&lharul;\",\"\\u2584\":\"&lhblk;\",\\u0459:\"&ljcy;\",\"\\u296B\":\"&llhard;\",\"\\u25FA\":\"&lltri;\",\\u0140:\"&lmidot;\",\"\\u23B0\":\"&lmoustache;\",\"\\u2268\":\"&lneqq;\",\"\\u2A89\":\"&lnapprox;\",\"\\u2A87\":\"&lneq;\",\"\\u22E6\":\"&lnsim;\",\"\\u27EC\":\"&loang;\",\"\\u21FD\":\"&loarr;\",\"\\u27FC\":\"&xmap;\",\"\\u21AC\":\"&rarrlp;\",\"\\u2985\":\"&lopar;\",\"\\u{1D55D}\":\"&lopf;\",\"\\u2A2D\":\"&loplus;\",\"\\u2A34\":\"&lotimes;\",\"\\u2217\":\"&lowast;\",\"\\u25CA\":\"&lozenge;\",\"(\":\"&lpar;\",\"\\u2993\":\"&lparlt;\",\"\\u296D\":\"&lrhard;\",\"\\u200E\":\"&lrm;\",\"\\u22BF\":\"&lrtri;\",\"\\u2039\":\"&lsaquo;\",\"\\u{1D4C1}\":\"&lscr;\",\"\\u2A8D\":\"&lsime;\",\"\\u2A8F\":\"&lsimg;\",\"\\u201A\":\"&sbquo;\",\\u0142:\"&lstrok;\",\"\\u2AA6\":\"&ltcc;\",\"\\u2A79\":\"&ltcir;\",\"\\u22C9\":\"&ltimes;\",\"\\u2976\":\"&ltlarr;\",\"\\u2A7B\":\"&ltquest;\",\"\\u2996\":\"&ltrPar;\",\"\\u25C3\":\"&triangleleft;\",\"\\u294A\":\"&lurdshar;\",\"\\u2966\":\"&luruhar;\",\"\\u2268\\uFE00\":\"&lvnE;\",\"\\u223A\":\"&mDDot;\",\"\\xAF\":\"&strns;\",\"\\u2642\":\"&male;\",\"\\u2720\":\"&maltese;\",\"\\u25AE\":\"&marker;\",\"\\u2A29\":\"&mcomma;\",\\u043C:\"&mcy;\",\"\\u2014\":\"&mdash;\",\"\\u{1D52A}\":\"&mfr;\",\"\\u2127\":\"&mho;\",\\u00B5:\"&micro;\",\"\\u2AF0\":\"&midcir;\",\"\\u2212\":\"&minus;\",\"\\u2A2A\":\"&minusdu;\",\"\\u2ADB\":\"&mlcp;\",\"\\u22A7\":\"&models;\",\"\\u{1D55E}\":\"&mopf;\",\"\\u{1D4C2}\":\"&mscr;\",\\u03BC:\"&mu;\",\"\\u22B8\":\"&mumap;\",\"\\u22D9\\u0338\":\"&nGg;\",\"\\u226B\\u20D2\":\"&nGt;\",\"\\u21CD\":\"&nlArr;\",\"\\u21CE\":\"&nhArr;\",\"\\u22D8\\u0338\":\"&nLl;\",\"\\u226A\\u20D2\":\"&nLt;\",\"\\u21CF\":\"&nrArr;\",\"\\u22AF\":\"&nVDash;\",\"\\u22AE\":\"&nVdash;\",\\u0144:\"&nacute;\",\"\\u2220\\u20D2\":\"&nang;\",\"\\u2A70\\u0338\":\"&napE;\",\"\\u224B\\u0338\":\"&napid;\",\\u0149:\"&napos;\",\"\\u266E\":\"&natural;\",\"\\u2A43\":\"&ncap;\",\\u0148:\"&ncaron;\",\\u0146:\"&ncedil;\",\"\\u2A6D\\u0338\":\"&ncongdot;\",\"\\u2A42\":\"&ncup;\",\\u043D:\"&ncy;\",\"\\u2013\":\"&ndash;\",\"\\u21D7\":\"&neArr;\",\"\\u2924\":\"&nearhk;\",\"\\u2250\\u0338\":\"&nedot;\",\"\\u2928\":\"&toea;\",\"\\u{1D52B}\":\"&nfr;\",\"\\u21AE\":\"&nleftrightarrow;\",\"\\u2AF2\":\"&nhpar;\",\"\\u22FC\":\"&nis;\",\"\\u22FA\":\"&nisd;\",\\u045A:\"&njcy;\",\"\\u2266\\u0338\":\"&nleqq;\",\"\\u219A\":\"&nleftarrow;\",\"\\u2025\":\"&nldr;\",\"\\u{1D55F}\":\"&nopf;\",\"\\xAC\":\"&not;\",\"\\u22F9\\u0338\":\"&notinE;\",\"\\u22F5\\u0338\":\"&notindot;\",\"\\u22F7\":\"&notinvb;\",\"\\u22F6\":\"&notinvc;\",\"\\u22FE\":\"&notnivb;\",\"\\u22FD\":\"&notnivc;\",\"\\u2AFD\\u20E5\":\"&nparsl;\",\"\\u2202\\u0338\":\"&npart;\",\"\\u2A14\":\"&npolint;\",\"\\u219B\":\"&nrightarrow;\",\"\\u2933\\u0338\":\"&nrarrc;\",\"\\u219D\\u0338\":\"&nrarrw;\",\"\\u{1D4C3}\":\"&nscr;\",\"\\u2284\":\"&nsub;\",\"\\u2AC5\\u0338\":\"&nsubseteqq;\",\"\\u2285\":\"&nsup;\",\"\\u2AC6\\u0338\":\"&nsupseteqq;\",\\u00F1:\"&ntilde;\",\\u03BD:\"&nu;\",\"#\":\"&num;\",\"\\u2116\":\"&numero;\",\"\\u2007\":\"&numsp;\",\"\\u22AD\":\"&nvDash;\",\"\\u2904\":\"&nvHarr;\",\"\\u224D\\u20D2\":\"&nvap;\",\"\\u22AC\":\"&nvdash;\",\"\\u2265\\u20D2\":\"&nvge;\",\">\\u20D2\":\"&nvgt;\",\"\\u29DE\":\"&nvinfin;\",\"\\u2902\":\"&nvlArr;\",\"\\u2264\\u20D2\":\"&nvle;\",\"<\\u20D2\":\"&nvlt;\",\"\\u22B4\\u20D2\":\"&nvltrie;\",\"\\u2903\":\"&nvrArr;\",\"\\u22B5\\u20D2\":\"&nvrtrie;\",\"\\u223C\\u20D2\":\"&nvsim;\",\"\\u21D6\":\"&nwArr;\",\"\\u2923\":\"&nwarhk;\",\"\\u2927\":\"&nwnear;\",\\u00F3:\"&oacute;\",\\u00F4:\"&ocirc;\",\\u043E:\"&ocy;\",\\u0151:\"&odblac;\",\"\\u2A38\":\"&odiv;\",\"\\u29BC\":\"&odsold;\",\\u0153:\"&oelig;\",\"\\u29BF\":\"&ofcir;\",\"\\u{1D52C}\":\"&ofr;\",\"\\u02DB\":\"&ogon;\",\\u00F2:\"&ograve;\",\"\\u29C1\":\"&ogt;\",\"\\u29B5\":\"&ohbar;\",\"\\u29BE\":\"&olcir;\",\"\\u29BB\":\"&olcross;\",\"\\u29C0\":\"&olt;\",\\u014D:\"&omacr;\",\\u03C9:\"&omega;\",\\u03BF:\"&omicron;\",\"\\u29B6\":\"&omid;\",\"\\u{1D560}\":\"&oopf;\",\"\\u29B7\":\"&opar;\",\"\\u29B9\":\"&operp;\",\"\\u2228\":\"&vee;\",\"\\u2A5D\":\"&ord;\",\\u2134:\"&oscr;\",\\u00AA:\"&ordf;\",\\u00BA:\"&ordm;\",\"\\u22B6\":\"&origof;\",\"\\u2A56\":\"&oror;\",\"\\u2A57\":\"&orslope;\",\"\\u2A5B\":\"&orv;\",\\u00F8:\"&oslash;\",\"\\u2298\":\"&osol;\",\\u00F5:\"&otilde;\",\"\\u2A36\":\"&otimesas;\",\\u00F6:\"&ouml;\",\"\\u233D\":\"&ovbar;\",\"\\xB6\":\"&para;\",\"\\u2AF3\":\"&parsim;\",\"\\u2AFD\":\"&parsl;\",\\u043F:\"&pcy;\",\"%\":\"&percnt;\",\".\":\"&period;\",\"\\u2030\":\"&permil;\",\"\\u2031\":\"&pertenk;\",\"\\u{1D52D}\":\"&pfr;\",\\u03C6:\"&phi;\",\\u03D5:\"&varphi;\",\"\\u260E\":\"&phone;\",\\u03C0:\"&pi;\",\\u03D6:\"&varpi;\",\\u210E:\"&planckh;\",\"+\":\"&plus;\",\"\\u2A23\":\"&plusacir;\",\"\\u2A22\":\"&pluscir;\",\"\\u2A25\":\"&plusdu;\",\"\\u2A72\":\"&pluse;\",\"\\u2A26\":\"&plussim;\",\"\\u2A27\":\"&plustwo;\",\"\\u2A15\":\"&pointint;\",\"\\u{1D561}\":\"&popf;\",\"\\xA3\":\"&pound;\",\"\\u2AB3\":\"&prE;\",\"\\u2AB7\":\"&precapprox;\",\"\\u2AB9\":\"&prnap;\",\"\\u2AB5\":\"&prnE;\",\"\\u22E8\":\"&prnsim;\",\"\\u2032\":\"&prime;\",\"\\u232E\":\"&profalar;\",\"\\u2312\":\"&profline;\",\"\\u2313\":\"&profsurf;\",\"\\u22B0\":\"&prurel;\",\"\\u{1D4C5}\":\"&pscr;\",\\u03C8:\"&psi;\",\"\\u2008\":\"&puncsp;\",\"\\u{1D52E}\":\"&qfr;\",\"\\u{1D562}\":\"&qopf;\",\"\\u2057\":\"&qprime;\",\"\\u{1D4C6}\":\"&qscr;\",\"\\u2A16\":\"&quatint;\",\"?\":\"&quest;\",\"\\u291C\":\"&rAtail;\",\"\\u2964\":\"&rHar;\",\"\\u223D\\u0331\":\"&race;\",\\u0155:\"&racute;\",\"\\u29B3\":\"&raemptyv;\",\"\\u2992\":\"&rangd;\",\"\\u29A5\":\"&range;\",\"\\xBB\":\"&raquo;\",\"\\u2975\":\"&rarrap;\",\"\\u2920\":\"&rarrbfs;\",\"\\u2933\":\"&rarrc;\",\"\\u291E\":\"&rarrfs;\",\"\\u2945\":\"&rarrpl;\",\"\\u2974\":\"&rarrsim;\",\"\\u21A3\":\"&rightarrowtail;\",\"\\u219D\":\"&rightsquigarrow;\",\"\\u291A\":\"&ratail;\",\"\\u2236\":\"&ratio;\",\"\\u2773\":\"&rbbrk;\",\"}\":\"&rcub;\",\"]\":\"&rsqb;\",\"\\u298C\":\"&rbrke;\",\"\\u298E\":\"&rbrksld;\",\"\\u2990\":\"&rbrkslu;\",\\u0159:\"&rcaron;\",\\u0157:\"&rcedil;\",\\u0440:\"&rcy;\",\"\\u2937\":\"&rdca;\",\"\\u2969\":\"&rdldhar;\",\"\\u21B3\":\"&rdsh;\",\"\\u25AD\":\"&rect;\",\"\\u297D\":\"&rfisht;\",\"\\u{1D52F}\":\"&rfr;\",\"\\u296C\":\"&rharul;\",\\u03C1:\"&rho;\",\\u03F1:\"&varrho;\",\"\\u21C9\":\"&rrarr;\",\"\\u22CC\":\"&rthree;\",\"\\u02DA\":\"&ring;\",\"\\u200F\":\"&rlm;\",\"\\u23B1\":\"&rmoustache;\",\"\\u2AEE\":\"&rnmid;\",\"\\u27ED\":\"&roang;\",\"\\u21FE\":\"&roarr;\",\"\\u2986\":\"&ropar;\",\"\\u{1D563}\":\"&ropf;\",\"\\u2A2E\":\"&roplus;\",\"\\u2A35\":\"&rotimes;\",\")\":\"&rpar;\",\"\\u2994\":\"&rpargt;\",\"\\u2A12\":\"&rppolint;\",\"\\u203A\":\"&rsaquo;\",\"\\u{1D4C7}\":\"&rscr;\",\"\\u22CA\":\"&rtimes;\",\"\\u25B9\":\"&triangleright;\",\"\\u29CE\":\"&rtriltri;\",\"\\u2968\":\"&ruluhar;\",\"\\u211E\":\"&rx;\",\\u015B:\"&sacute;\",\"\\u2AB4\":\"&scE;\",\"\\u2AB8\":\"&succapprox;\",\\u0161:\"&scaron;\",\\u015F:\"&scedil;\",\\u015D:\"&scirc;\",\"\\u2AB6\":\"&succneqq;\",\"\\u2ABA\":\"&succnapprox;\",\"\\u22E9\":\"&succnsim;\",\"\\u2A13\":\"&scpolint;\",\\u0441:\"&scy;\",\"\\u22C5\":\"&sdot;\",\"\\u2A66\":\"&sdote;\",\"\\u21D8\":\"&seArr;\",\"\\xA7\":\"&sect;\",\";\":\"&semi;\",\"\\u2929\":\"&tosa;\",\"\\u2736\":\"&sext;\",\"\\u{1D530}\":\"&sfr;\",\"\\u266F\":\"&sharp;\",\\u0449:\"&shchcy;\",\\u0448:\"&shcy;\",\"\\xAD\":\"&shy;\",\\u03C3:\"&sigma;\",\\u03C2:\"&varsigma;\",\"\\u2A6A\":\"&simdot;\",\"\\u2A9E\":\"&simg;\",\"\\u2AA0\":\"&simgE;\",\"\\u2A9D\":\"&siml;\",\"\\u2A9F\":\"&simlE;\",\"\\u2246\":\"&simne;\",\"\\u2A24\":\"&simplus;\",\"\\u2972\":\"&simrarr;\",\"\\u2A33\":\"&smashp;\",\"\\u29E4\":\"&smeparsl;\",\"\\u2323\":\"&ssmile;\",\"\\u2AAA\":\"&smt;\",\"\\u2AAC\":\"&smte;\",\"\\u2AAC\\uFE00\":\"&smtes;\",\\u044C:\"&softcy;\",\"/\":\"&sol;\",\"\\u29C4\":\"&solb;\",\"\\u233F\":\"&solbar;\",\"\\u{1D564}\":\"&sopf;\",\"\\u2660\":\"&spadesuit;\",\"\\u2293\\uFE00\":\"&sqcaps;\",\"\\u2294\\uFE00\":\"&sqcups;\",\"\\u{1D4C8}\":\"&sscr;\",\"\\u2606\":\"&star;\",\"\\u2282\":\"&subset;\",\"\\u2AC5\":\"&subseteqq;\",\"\\u2ABD\":\"&subdot;\",\"\\u2AC3\":\"&subedot;\",\"\\u2AC1\":\"&submult;\",\"\\u2ACB\":\"&subsetneqq;\",\"\\u228A\":\"&subsetneq;\",\"\\u2ABF\":\"&subplus;\",\"\\u2979\":\"&subrarr;\",\"\\u2AC7\":\"&subsim;\",\"\\u2AD5\":\"&subsub;\",\"\\u2AD3\":\"&subsup;\",\"\\u266A\":\"&sung;\",\"\\xB9\":\"&sup1;\",\"\\xB2\":\"&sup2;\",\"\\xB3\":\"&sup3;\",\"\\u2AC6\":\"&supseteqq;\",\"\\u2ABE\":\"&supdot;\",\"\\u2AD8\":\"&supdsub;\",\"\\u2AC4\":\"&supedot;\",\"\\u27C9\":\"&suphsol;\",\"\\u2AD7\":\"&suphsub;\",\"\\u297B\":\"&suplarr;\",\"\\u2AC2\":\"&supmult;\",\"\\u2ACC\":\"&supsetneqq;\",\"\\u228B\":\"&supsetneq;\",\"\\u2AC0\":\"&supplus;\",\"\\u2AC8\":\"&supsim;\",\"\\u2AD4\":\"&supsub;\",\"\\u2AD6\":\"&supsup;\",\"\\u21D9\":\"&swArr;\",\"\\u292A\":\"&swnwar;\",\\u00DF:\"&szlig;\",\"\\u2316\":\"&target;\",\\u03C4:\"&tau;\",\\u0165:\"&tcaron;\",\\u0163:\"&tcedil;\",\\u0442:\"&tcy;\",\"\\u2315\":\"&telrec;\",\"\\u{1D531}\":\"&tfr;\",\\u03B8:\"&theta;\",\\u03D1:\"&vartheta;\",\\u00FE:\"&thorn;\",\"\\xD7\":\"&times;\",\"\\u2A31\":\"&timesbar;\",\"\\u2A30\":\"&timesd;\",\"\\u2336\":\"&topbot;\",\"\\u2AF1\":\"&topcir;\",\"\\u{1D565}\":\"&topf;\",\"\\u2ADA\":\"&topfork;\",\"\\u2034\":\"&tprime;\",\"\\u25B5\":\"&utri;\",\"\\u225C\":\"&trie;\",\"\\u25EC\":\"&tridot;\",\"\\u2A3A\":\"&triminus;\",\"\\u2A39\":\"&triplus;\",\"\\u29CD\":\"&trisb;\",\"\\u2A3B\":\"&tritime;\",\"\\u23E2\":\"&trpezium;\",\"\\u{1D4C9}\":\"&tscr;\",\\u0446:\"&tscy;\",\\u045B:\"&tshcy;\",\\u0167:\"&tstrok;\",\"\\u2963\":\"&uHar;\",\\u00FA:\"&uacute;\",\\u045E:\"&ubrcy;\",\\u016D:\"&ubreve;\",\\u00FB:\"&ucirc;\",\\u0443:\"&ucy;\",\\u0171:\"&udblac;\",\"\\u297E\":\"&ufisht;\",\"\\u{1D532}\":\"&ufr;\",\\u00F9:\"&ugrave;\",\"\\u2580\":\"&uhblk;\",\"\\u231C\":\"&ulcorner;\",\"\\u230F\":\"&ulcrop;\",\"\\u25F8\":\"&ultri;\",\\u016B:\"&umacr;\",\\u0173:\"&uogon;\",\"\\u{1D566}\":\"&uopf;\",\\u03C5:\"&upsilon;\",\"\\u21C8\":\"&uuarr;\",\"\\u231D\":\"&urcorner;\",\"\\u230E\":\"&urcrop;\",\\u016F:\"&uring;\",\"\\u25F9\":\"&urtri;\",\"\\u{1D4CA}\":\"&uscr;\",\"\\u22F0\":\"&utdot;\",\\u0169:\"&utilde;\",\\u00FC:\"&uuml;\",\"\\u29A7\":\"&uwangle;\",\"\\u2AE8\":\"&vBar;\",\"\\u2AE9\":\"&vBarv;\",\"\\u299C\":\"&vangrt;\",\"\\u228A\\uFE00\":\"&vsubne;\",\"\\u2ACB\\uFE00\":\"&vsubnE;\",\"\\u228B\\uFE00\":\"&vsupne;\",\"\\u2ACC\\uFE00\":\"&vsupnE;\",\\u0432:\"&vcy;\",\"\\u22BB\":\"&veebar;\",\"\\u225A\":\"&veeeq;\",\"\\u22EE\":\"&vellip;\",\"\\u{1D533}\":\"&vfr;\",\"\\u{1D567}\":\"&vopf;\",\"\\u{1D4CB}\":\"&vscr;\",\"\\u299A\":\"&vzigzag;\",\\u0175:\"&wcirc;\",\"\\u2A5F\":\"&wedbar;\",\"\\u2259\":\"&wedgeq;\",\"\\u2118\":\"&wp;\",\"\\u{1D534}\":\"&wfr;\",\"\\u{1D568}\":\"&wopf;\",\"\\u{1D4CC}\":\"&wscr;\",\"\\u{1D535}\":\"&xfr;\",\\u03BE:\"&xi;\",\"\\u22FB\":\"&xnis;\",\"\\u{1D569}\":\"&xopf;\",\"\\u{1D4CD}\":\"&xscr;\",\\u00FD:\"&yacute;\",\\u044F:\"&yacy;\",\\u0177:\"&ycirc;\",\\u044B:\"&ycy;\",\"\\xA5\":\"&yen;\",\"\\u{1D536}\":\"&yfr;\",\\u0457:\"&yicy;\",\"\\u{1D56A}\":\"&yopf;\",\"\\u{1D4CE}\":\"&yscr;\",\\u044E:\"&yucy;\",\\u00FF:\"&yuml;\",\\u017A:\"&zacute;\",\\u017E:\"&zcaron;\",\\u0437:\"&zcy;\",\\u017C:\"&zdot;\",\\u03B6:\"&zeta;\",\"\\u{1D537}\":\"&zfr;\",\\u0436:\"&zhcy;\",\"\\u21DD\":\"&zigrarr;\",\"\\u{1D56B}\":\"&zopf;\",\"\\u{1D4CF}\":\"&zscr;\",\"\\u200D\":\"&zwj;\",\"\\u200C\":\"&zwnj;\"}}}});var nn=L(kr=>{\"use strict\";Object.defineProperty(kr,\"__esModule\",{value:!0});kr.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}});var an=L(_e=>{\"use strict\";Object.defineProperty(_e,\"__esModule\",{value:!0});_e.fromCodePoint=String.fromCodePoint||function(e){return String.fromCharCode(Math.floor((e-65536)/1024)+55296,(e-65536)%1024+56320)};_e.getCodePoint=String.prototype.codePointAt?function(e,t){return e.codePointAt(t)}:function(e,t){return(e.charCodeAt(t)-55296)*1024+e.charCodeAt(t+1)-56320+65536};_e.highSurrogateFrom=55296;_e.highSurrogateTo=56319});var un=L(xe=>{\"use strict\";var Oe=xe&&xe.__assign||function(){return Oe=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++){t=arguments[r];for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s])}return e},Oe.apply(this,arguments)};Object.defineProperty(xe,\"__esModule\",{value:!0});var je=sn(),ln=nn(),Hr=an(),Mr=Oe(Oe({},je.namedReferences),{all:je.namedReferences.html5}),Cc={specialChars:/[<>'\"&]/g,nonAscii:/[<>'\"&\\u0080-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g,nonAsciiPrintable:/[<>'\"&\\x01-\\x08\\x11-\\x15\\x17-\\x1F\\x7f-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g,nonAsciiPrintableOnly:/[\\x01-\\x08\\x11-\\x15\\x17-\\x1F\\x7f-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g,extensive:/[\\x01-\\x0c\\x0e-\\x1f\\x21-\\x2c\\x2e-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7d\\x7f-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/g},_c={mode:\"specialChars\",level:\"all\",numeric:\"decimal\"};function Oc(e,t){var p=t===void 0?_c:t,d=p.mode,r=d===void 0?\"specialChars\":d,i=p.numeric,s=i===void 0?\"decimal\":i,a=p.level,o=a===void 0?\"all\":a;if(!e)return\"\";var l=Cc[r],c=Mr[o].characters,u=s===\"hexadecimal\";l.lastIndex=0;var p=l.exec(e),d;if(p){d=\"\";var i=0;do{i!==p.index&&(d+=e.substring(i,p.index));var a=p[0],f=c[a];if(!f){var E=a.length>1?Hr.getCodePoint(a,0):a.charCodeAt(0);f=(u?\"&#x\"+E.toString(16):\"&#\"+E)+\";\"}d+=f,i=p.index+a.length}while(p=l.exec(e));i!==e.length&&(d+=e.substring(i))}else d=e;return d}n(Oc,\"encode\");xe.encode=Oc;var Pc={scope:\"body\",level:\"all\"},Dr=/&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+);/g,Ir=/&(?:#\\d+|#[xX][\\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g,on={xml:{strict:Dr,attribute:Ir,body:je.bodyRegExps.xml},html4:{strict:Dr,attribute:Ir,body:je.bodyRegExps.html4},html5:{strict:Dr,attribute:Ir,body:je.bodyRegExps.html5}},Lc=Oe(Oe({},on),{all:on.html5}),Ur=String.fromCharCode,cn=Ur(65533),Nc={level:\"all\"};function qc(e,t){var i=(t===void 0?Nc:t).level,r=i===void 0?\"all\":i;if(!e)return\"\";var i=e,s=e[e.length-1],a=Mr[r].entities[e];if(a)i=a;else if(e[0]===\"&\"&&e[1]===\"#\"){var o=e[2],l=o==\"x\"||o==\"X\"?parseInt(e.substr(3),16):parseInt(e.substr(2));i=l>=1114111?cn:l>65535?Hr.fromCodePoint(l):Ur(ln.numericUnicodeMap[l]||l)}return i}n(qc,\"decodeEntity\");xe.decodeEntity=qc;function kc(e,t){var r=t===void 0?Pc:t,i=r.level,s=i===void 0?\"all\":i,a=r.scope,o=a===void 0?s===\"xml\"?\"strict\":\"body\":a;if(!e)return\"\";var l=Lc[s][o],c=Mr[s].entities,u=o===\"attribute\",p=o===\"strict\";l.lastIndex=0;var d=l.exec(e),f;if(d){f=\"\";var E=0;do{E!==d.index&&(f+=e.substring(E,d.index));var b=d[0],y=b,x=b[b.length-1];if(u&&x===\"=\")y=b;else if(p&&x!==\";\")y=b;else{var R=c[b];if(R)y=R;else if(b[0]===\"&\"&&b[1]===\"#\"){var T=b[2],w=T==\"x\"||T==\"X\"?parseInt(b.substr(3),16):parseInt(b.substr(2));y=w>=1114111?cn:w>65535?Hr.fromCodePoint(w):Ur(ln.numericUnicodeMap[w]||w)}}f+=y,E=d.index+b.length}while(d=l.exec(e));E!==e.length&&(f+=e.substring(E))}else f=e;return f}n(kc,\"decode\");xe.decode=kc});var Fr=L(Pe=>{function pn(){var e={};return e[\"align-content\"]=!1,e[\"align-items\"]=!1,e[\"align-self\"]=!1,e[\"alignment-adjust\"]=!1,e[\"alignment-baseline\"]=!1,e.all=!1,e[\"anchor-point\"]=!1,e.animation=!1,e[\"animation-delay\"]=!1,e[\"animation-direction\"]=!1,e[\"animation-duration\"]=!1,e[\"animation-fill-mode\"]=!1,e[\"animation-iteration-count\"]=!1,e[\"animation-name\"]=!1,e[\"animation-play-state\"]=!1,e[\"animation-timing-function\"]=!1,e.azimuth=!1,e[\"backface-visibility\"]=!1,e.background=!0,e[\"background-attachment\"]=!0,e[\"background-clip\"]=!0,e[\"background-color\"]=!0,e[\"background-image\"]=!0,e[\"background-origin\"]=!0,e[\"background-position\"]=!0,e[\"background-repeat\"]=!0,e[\"background-size\"]=!0,e[\"baseline-shift\"]=!1,e.binding=!1,e.bleed=!1,e[\"bookmark-label\"]=!1,e[\"bookmark-level\"]=!1,e[\"bookmark-state\"]=!1,e.border=!0,e[\"border-bottom\"]=!0,e[\"border-bottom-color\"]=!0,e[\"border-bottom-left-radius\"]=!0,e[\"border-bottom-right-radius\"]=!0,e[\"border-bottom-style\"]=!0,e[\"border-bottom-width\"]=!0,e[\"border-collapse\"]=!0,e[\"border-color\"]=!0,e[\"border-image\"]=!0,e[\"border-image-outset\"]=!0,e[\"border-image-repeat\"]=!0,e[\"border-image-slice\"]=!0,e[\"border-image-source\"]=!0,e[\"border-image-width\"]=!0,e[\"border-left\"]=!0,e[\"border-left-color\"]=!0,e[\"border-left-style\"]=!0,e[\"border-left-width\"]=!0,e[\"border-radius\"]=!0,e[\"border-right\"]=!0,e[\"border-right-color\"]=!0,e[\"border-right-style\"]=!0,e[\"border-right-width\"]=!0,e[\"border-spacing\"]=!0,e[\"border-style\"]=!0,e[\"border-top\"]=!0,e[\"border-top-color\"]=!0,e[\"border-top-left-radius\"]=!0,e[\"border-top-right-radius\"]=!0,e[\"border-top-style\"]=!0,e[\"border-top-width\"]=!0,e[\"border-width\"]=!0,e.bottom=!1,e[\"box-decoration-break\"]=!0,e[\"box-shadow\"]=!0,e[\"box-sizing\"]=!0,e[\"box-snap\"]=!0,e[\"box-suppress\"]=!0,e[\"break-after\"]=!0,e[\"break-before\"]=!0,e[\"break-inside\"]=!0,e[\"caption-side\"]=!1,e.chains=!1,e.clear=!0,e.clip=!1,e[\"clip-path\"]=!1,e[\"clip-rule\"]=!1,e.color=!0,e[\"color-interpolation-filters\"]=!0,e[\"column-count\"]=!1,e[\"column-fill\"]=!1,e[\"column-gap\"]=!1,e[\"column-rule\"]=!1,e[\"column-rule-color\"]=!1,e[\"column-rule-style\"]=!1,e[\"column-rule-width\"]=!1,e[\"column-span\"]=!1,e[\"column-width\"]=!1,e.columns=!1,e.contain=!1,e.content=!1,e[\"counter-increment\"]=!1,e[\"counter-reset\"]=!1,e[\"counter-set\"]=!1,e.crop=!1,e.cue=!1,e[\"cue-after\"]=!1,e[\"cue-before\"]=!1,e.cursor=!1,e.direction=!1,e.display=!0,e[\"display-inside\"]=!0,e[\"display-list\"]=!0,e[\"display-outside\"]=!0,e[\"dominant-baseline\"]=!1,e.elevation=!1,e[\"empty-cells\"]=!1,e.filter=!1,e.flex=!1,e[\"flex-basis\"]=!1,e[\"flex-direction\"]=!1,e[\"flex-flow\"]=!1,e[\"flex-grow\"]=!1,e[\"flex-shrink\"]=!1,e[\"flex-wrap\"]=!1,e.float=!1,e[\"float-offset\"]=!1,e[\"flood-color\"]=!1,e[\"flood-opacity\"]=!1,e[\"flow-from\"]=!1,e[\"flow-into\"]=!1,e.font=!0,e[\"font-family\"]=!0,e[\"font-feature-settings\"]=!0,e[\"font-kerning\"]=!0,e[\"font-language-override\"]=!0,e[\"font-size\"]=!0,e[\"font-size-adjust\"]=!0,e[\"font-stretch\"]=!0,e[\"font-style\"]=!0,e[\"font-synthesis\"]=!0,e[\"font-variant\"]=!0,e[\"font-variant-alternates\"]=!0,e[\"font-variant-caps\"]=!0,e[\"font-variant-east-asian\"]=!0,e[\"font-variant-ligatures\"]=!0,e[\"font-variant-numeric\"]=!0,e[\"font-variant-position\"]=!0,e[\"font-weight\"]=!0,e.grid=!1,e[\"grid-area\"]=!1,e[\"grid-auto-columns\"]=!1,e[\"grid-auto-flow\"]=!1,e[\"grid-auto-rows\"]=!1,e[\"grid-column\"]=!1,e[\"grid-column-end\"]=!1,e[\"grid-column-start\"]=!1,e[\"grid-row\"]=!1,e[\"grid-row-end\"]=!1,e[\"grid-row-start\"]=!1,e[\"grid-template\"]=!1,e[\"grid-template-areas\"]=!1,e[\"grid-template-columns\"]=!1,e[\"grid-template-rows\"]=!1,e[\"hanging-punctuation\"]=!1,e.height=!0,e.hyphens=!1,e.icon=!1,e[\"image-orientation\"]=!1,e[\"image-resolution\"]=!1,e[\"ime-mode\"]=!1,e[\"initial-letters\"]=!1,e[\"inline-box-align\"]=!1,e[\"justify-content\"]=!1,e[\"justify-items\"]=!1,e[\"justify-self\"]=!1,e.left=!1,e[\"letter-spacing\"]=!0,e[\"lighting-color\"]=!0,e[\"line-box-contain\"]=!1,e[\"line-break\"]=!1,e[\"line-grid\"]=!1,e[\"line-height\"]=!1,e[\"line-snap\"]=!1,e[\"line-stacking\"]=!1,e[\"line-stacking-ruby\"]=!1,e[\"line-stacking-shift\"]=!1,e[\"line-stacking-strategy\"]=!1,e[\"list-style\"]=!0,e[\"list-style-image\"]=!0,e[\"list-style-position\"]=!0,e[\"list-style-type\"]=!0,e.margin=!0,e[\"margin-bottom\"]=!0,e[\"margin-left\"]=!0,e[\"margin-right\"]=!0,e[\"margin-top\"]=!0,e[\"marker-offset\"]=!1,e[\"marker-side\"]=!1,e.marks=!1,e.mask=!1,e[\"mask-box\"]=!1,e[\"mask-box-outset\"]=!1,e[\"mask-box-repeat\"]=!1,e[\"mask-box-slice\"]=!1,e[\"mask-box-source\"]=!1,e[\"mask-box-width\"]=!1,e[\"mask-clip\"]=!1,e[\"mask-image\"]=!1,e[\"mask-origin\"]=!1,e[\"mask-position\"]=!1,e[\"mask-repeat\"]=!1,e[\"mask-size\"]=!1,e[\"mask-source-type\"]=!1,e[\"mask-type\"]=!1,e[\"max-height\"]=!0,e[\"max-lines\"]=!1,e[\"max-width\"]=!0,e[\"min-height\"]=!0,e[\"min-width\"]=!0,e[\"move-to\"]=!1,e[\"nav-down\"]=!1,e[\"nav-index\"]=!1,e[\"nav-left\"]=!1,e[\"nav-right\"]=!1,e[\"nav-up\"]=!1,e[\"object-fit\"]=!1,e[\"object-position\"]=!1,e.opacity=!1,e.order=!1,e.orphans=!1,e.outline=!1,e[\"outline-color\"]=!1,e[\"outline-offset\"]=!1,e[\"outline-style\"]=!1,e[\"outline-width\"]=!1,e.overflow=!1,e[\"overflow-wrap\"]=!1,e[\"overflow-x\"]=!1,e[\"overflow-y\"]=!1,e.padding=!0,e[\"padding-bottom\"]=!0,e[\"padding-left\"]=!0,e[\"padding-right\"]=!0,e[\"padding-top\"]=!0,e.page=!1,e[\"page-break-after\"]=!1,e[\"page-break-before\"]=!1,e[\"page-break-inside\"]=!1,e[\"page-policy\"]=!1,e.pause=!1,e[\"pause-after\"]=!1,e[\"pause-before\"]=!1,e.perspective=!1,e[\"perspective-origin\"]=!1,e.pitch=!1,e[\"pitch-range\"]=!1,e[\"play-during\"]=!1,e.position=!1,e[\"presentation-level\"]=!1,e.quotes=!1,e[\"region-fragment\"]=!1,e.resize=!1,e.rest=!1,e[\"rest-after\"]=!1,e[\"rest-before\"]=!1,e.richness=!1,e.right=!1,e.rotation=!1,e[\"rotation-point\"]=!1,e[\"ruby-align\"]=!1,e[\"ruby-merge\"]=!1,e[\"ruby-position\"]=!1,e[\"shape-image-threshold\"]=!1,e[\"shape-outside\"]=!1,e[\"shape-margin\"]=!1,e.size=!1,e.speak=!1,e[\"speak-as\"]=!1,e[\"speak-header\"]=!1,e[\"speak-numeral\"]=!1,e[\"speak-punctuation\"]=!1,e[\"speech-rate\"]=!1,e.stress=!1,e[\"string-set\"]=!1,e[\"tab-size\"]=!1,e[\"table-layout\"]=!1,e[\"text-align\"]=!0,e[\"text-align-last\"]=!0,e[\"text-combine-upright\"]=!0,e[\"text-decoration\"]=!0,e[\"text-decoration-color\"]=!0,e[\"text-decoration-line\"]=!0,e[\"text-decoration-skip\"]=!0,e[\"text-decoration-style\"]=!0,e[\"text-emphasis\"]=!0,e[\"text-emphasis-color\"]=!0,e[\"text-emphasis-position\"]=!0,e[\"text-emphasis-style\"]=!0,e[\"text-height\"]=!0,e[\"text-indent\"]=!0,e[\"text-justify\"]=!0,e[\"text-orientation\"]=!0,e[\"text-overflow\"]=!0,e[\"text-shadow\"]=!0,e[\"text-space-collapse\"]=!0,e[\"text-transform\"]=!0,e[\"text-underline-position\"]=!0,e[\"text-wrap\"]=!0,e.top=!1,e.transform=!1,e[\"transform-origin\"]=!1,e[\"transform-style\"]=!1,e.transition=!1,e[\"transition-delay\"]=!1,e[\"transition-duration\"]=!1,e[\"transition-property\"]=!1,e[\"transition-timing-function\"]=!1,e[\"unicode-bidi\"]=!1,e[\"vertical-align\"]=!1,e.visibility=!1,e[\"voice-balance\"]=!1,e[\"voice-duration\"]=!1,e[\"voice-family\"]=!1,e[\"voice-pitch\"]=!1,e[\"voice-range\"]=!1,e[\"voice-rate\"]=!1,e[\"voice-stress\"]=!1,e[\"voice-volume\"]=!1,e.volume=!1,e[\"white-space\"]=!1,e.widows=!1,e.width=!0,e[\"will-change\"]=!1,e[\"word-break\"]=!0,e[\"word-spacing\"]=!0,e[\"word-wrap\"]=!0,e[\"wrap-flow\"]=!1,e[\"wrap-through\"]=!1,e[\"writing-mode\"]=!1,e[\"z-index\"]=!1,e}n(pn,\"getDefaultWhiteList\");function Dc(e,t,r){}n(Dc,\"onAttr\");function Ic(e,t,r){}n(Ic,\"onIgnoreAttr\");var Hc=/javascript\\s*\\:/img;function Mc(e,t){return Hc.test(t)?\"\":t}n(Mc,\"safeAttrValue\");Pe.whiteList=pn();Pe.getDefaultWhiteList=pn;Pe.onAttr=Dc;Pe.onIgnoreAttr=Ic;Pe.safeAttrValue=Mc});var $r=L((Gh,fn)=>{fn.exports={indexOf:function(e,t){var r,i;if(Array.prototype.indexOf)return e.indexOf(t);for(r=0,i=e.length;r<i;r++)if(e[r]===t)return r;return-1},forEach:function(e,t,r){var i,s;if(Array.prototype.forEach)return e.forEach(t,r);for(i=0,s=e.length;i<s;i++)t.call(r,e[i],i,e)},trim:function(e){return String.prototype.trim?e.trim():e.replace(/(^\\s*)|(\\s*$)/g,\"\")},trimRight:function(e){return String.prototype.trimRight?e.trimRight():e.replace(/(\\s*$)/g,\"\")}}});var hn=L((Vh,dn)=>{var Qe=$r();function Uc(e,t){e=Qe.trimRight(e),e[e.length-1]!==\";\"&&(e+=\";\");var r=e.length,i=!1,s=0,a=0,o=\"\";function l(){if(!i){var p=Qe.trim(e.slice(s,a)),d=p.indexOf(\":\");if(d!==-1){var f=Qe.trim(p.slice(0,d)),E=Qe.trim(p.slice(d+1));if(f){var b=t(s,o.length,f,E,p);b&&(o+=b+\"; \")}}}s=a+1}for(n(l,\"addNewAttr\");a<r;a++){var c=e[a];if(c===\"/\"&&e[a+1]===\"*\"){var u=e.indexOf(\"*/\",a+2);if(u===-1)break;a=u+1,s=a+1,i=!1}else c===\"(\"?i=!0:c===\")\"?i=!1:c===\";\"?i||l():c===`\n`&&l()}return Qe.trim(o)}n(Uc,\"parseStyle\");dn.exports=Uc});var bn=L((Kh,yn)=>{var xt=Fr(),Fc=hn(),Qh=$r();function gn(e){return e==null}n(gn,\"isNull\");function $c(e){var t={};for(var r in e)t[r]=e[r];return t}n($c,\"shallowCopyObject\");function mn(e){e=$c(e||{}),e.whiteList=e.whiteList||xt.whiteList,e.onAttr=e.onAttr||xt.onAttr,e.onIgnoreAttr=e.onIgnoreAttr||xt.onIgnoreAttr,e.safeAttrValue=e.safeAttrValue||xt.safeAttrValue,this.options=e}n(mn,\"FilterCSS\");mn.prototype.process=function(e){if(e=e||\"\",e=e.toString(),!e)return\"\";var t=this,r=t.options,i=r.whiteList,s=r.onAttr,a=r.onIgnoreAttr,o=r.safeAttrValue,l=Fc(e,function(c,u,p,d,f){var E=i[p],b=!1;if(E===!0?b=E:typeof E==\"function\"?b=E(d):E instanceof RegExp&&(b=E.test(d)),b!==!0&&(b=!1),d=o(p,d),!!d){var y={position:u,sourcePosition:c,source:f,isWhite:b};if(b){var x=s(p,d,y);return gn(x)?p+\":\"+d:x}else{var x=a(p,d,y);if(!gn(x))return x}}});return l};yn.exports=mn});var Rt=L((vt,zr)=>{var An=Fr(),En=bn();function Bc(e,t){var r=new En(t);return r.process(e)}n(Bc,\"filterCSS\");vt=zr.exports=Bc;vt.FilterCSS=En;for(Br in An)vt[Br]=An[Br];var Br;typeof window<\"u\"&&(window.filterCSS=zr.exports)});var wt=L((Xh,xn)=>{xn.exports={indexOf:function(e,t){var r,i;if(Array.prototype.indexOf)return e.indexOf(t);for(r=0,i=e.length;r<i;r++)if(e[r]===t)return r;return-1},forEach:function(e,t,r){var i,s;if(Array.prototype.forEach)return e.forEach(t,r);for(i=0,s=e.length;i<s;i++)t.call(r,e[i],i,e)},trim:function(e){return String.prototype.trim?e.trim():e.replace(/(^\\s*)|(\\s*$)/g,\"\")},spaceIndex:function(e){var t=/\\s|\\n|\\t/,r=t.exec(e);return r?r.index:-1}}});var Gr=L(B=>{var zc=Rt().FilterCSS,Gc=Rt().getDefaultWhiteList,Tt=wt();function wn(){return{a:[\"target\",\"href\",\"title\"],abbr:[\"title\"],address:[],area:[\"shape\",\"coords\",\"href\",\"alt\"],article:[],aside:[],audio:[\"autoplay\",\"controls\",\"crossorigin\",\"loop\",\"muted\",\"preload\",\"src\"],b:[],bdi:[\"dir\"],bdo:[\"dir\"],big:[],blockquote:[\"cite\"],br:[],caption:[],center:[],cite:[],code:[],col:[\"align\",\"valign\",\"span\",\"width\"],colgroup:[\"align\",\"valign\",\"span\",\"width\"],dd:[],del:[\"datetime\"],details:[\"open\"],div:[],dl:[],dt:[],em:[],figcaption:[],figure:[],font:[\"color\",\"size\",\"face\"],footer:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],header:[],hr:[],i:[],img:[\"src\",\"alt\",\"title\",\"width\",\"height\"],ins:[\"datetime\"],li:[],mark:[],nav:[],ol:[],p:[],pre:[],s:[],section:[],small:[],span:[],sub:[],summary:[],sup:[],strong:[],strike:[],table:[\"width\",\"border\",\"align\",\"valign\"],tbody:[\"align\",\"valign\"],td:[\"width\",\"rowspan\",\"colspan\",\"align\",\"valign\"],tfoot:[\"align\",\"valign\"],th:[\"width\",\"rowspan\",\"colspan\",\"align\",\"valign\"],thead:[\"align\",\"valign\"],tr:[\"rowspan\",\"align\",\"valign\"],tt:[],u:[],ul:[],video:[\"autoplay\",\"controls\",\"crossorigin\",\"loop\",\"muted\",\"playsinline\",\"poster\",\"preload\",\"src\",\"height\",\"width\"]}}n(wn,\"getDefaultWhiteList\");var Sn=new zc;function Vc(e,t,r){}n(Vc,\"onTag\");function jc(e,t,r){}n(jc,\"onIgnoreTag\");function Qc(e,t,r){}n(Qc,\"onTagAttr\");function Kc(e,t,r){}n(Kc,\"onIgnoreTagAttr\");function Tn(e){return e.replace(Yc,\"&lt;\").replace(Xc,\"&gt;\")}n(Tn,\"escapeHtml\");function Wc(e,t,r,i){if(r=Nn(r),t===\"href\"||t===\"src\"){if(r=Tt.trim(r),r===\"#\")return\"#\";if(!(r.substr(0,7)===\"http://\"||r.substr(0,8)===\"https://\"||r.substr(0,7)===\"mailto:\"||r.substr(0,4)===\"tel:\"||r.substr(0,11)===\"data:image/\"||r.substr(0,6)===\"ftp://\"||r.substr(0,2)===\"./\"||r.substr(0,3)===\"../\"||r[0]===\"#\"||r[0]===\"/\"))return\"\"}else if(t===\"background\"){if(St.lastIndex=0,St.test(r))return\"\"}else if(t===\"style\"){if(vn.lastIndex=0,vn.test(r)||(Rn.lastIndex=0,Rn.test(r)&&(St.lastIndex=0,St.test(r))))return\"\";i!==!1&&(i=i||Sn,r=i.process(r))}return r=qn(r),r}n(Wc,\"safeAttrValue\");var Yc=/</g,Xc=/>/g,Zc=/\"/g,Jc=/&quot;/g,eu=/&#([a-zA-Z0-9]*);?/gim,tu=/&colon;?/gim,ru=/&newline;?/gim,St=/((j\\s*a\\s*v\\s*a|v\\s*b|l\\s*i\\s*v\\s*e)\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*|m\\s*o\\s*c\\s*h\\s*a):/gi,vn=/e\\s*x\\s*p\\s*r\\s*e\\s*s\\s*s\\s*i\\s*o\\s*n\\s*\\(.*/gi,Rn=/u\\s*r\\s*l\\s*\\(.*/gi;function Cn(e){return e.replace(Zc,\"&quot;\")}n(Cn,\"escapeQuote\");function _n(e){return e.replace(Jc,'\"')}n(_n,\"unescapeQuote\");function On(e){return e.replace(eu,n(function(r,i){return i[0]===\"x\"||i[0]===\"X\"?String.fromCharCode(parseInt(i.substr(1),16)):String.fromCharCode(parseInt(i,10))},\"replaceUnicode\"))}n(On,\"escapeHtmlEntities\");function Pn(e){return e.replace(tu,\":\").replace(ru,\" \")}n(Pn,\"escapeDangerHtml5Entities\");function Ln(e){for(var t=\"\",r=0,i=e.length;r<i;r++)t+=e.charCodeAt(r)<32?\" \":e.charAt(r);return Tt.trim(t)}n(Ln,\"clearNonPrintableCharacter\");function Nn(e){return e=_n(e),e=On(e),e=Pn(e),e=Ln(e),e}n(Nn,\"friendlyAttrValue\");function qn(e){return e=Cn(e),e=Tn(e),e}n(qn,\"escapeAttrValue\");function iu(){return\"\"}n(iu,\"onIgnoreTagStripAll\");function su(e,t){typeof t!=\"function\"&&(t=n(function(){},\"next\"));var r=!Array.isArray(e);function i(o){return r?!0:Tt.indexOf(e,o)!==-1}n(i,\"isRemoveTag\");var s=[],a=!1;return{onIgnoreTag:function(o,l,c){if(i(o))if(c.isClosing){var u=\"[/removed]\",p=c.position+u.length;return s.push([a!==!1?a:c.position,p]),a=!1,u}else return a||(a=c.position),\"[removed]\";else return t(o,l,c)},remove:function(o){var l=\"\",c=0;return Tt.forEach(s,function(u){l+=o.slice(c,u[0]),c=u[1]}),l+=o.slice(c),l}}}n(su,\"StripTagBody\");function nu(e){for(var t=\"\",r=0;r<e.length;){var i=e.indexOf(\"<!--\",r);if(i===-1){t+=e.slice(r);break}t+=e.slice(r,i);var s=e.indexOf(\"-->\",i);if(s===-1)break;r=s+3}return t}n(nu,\"stripCommentTag\");function au(e){var t=e.split(\"\");return t=t.filter(function(r){var i=r.charCodeAt(0);return i===127?!1:i<=31?i===10||i===13:!0}),t.join(\"\")}n(au,\"stripBlankChar\");B.whiteList=wn();B.getDefaultWhiteList=wn;B.onTag=Vc;B.onIgnoreTag=jc;B.onTagAttr=Qc;B.onIgnoreTagAttr=Kc;B.safeAttrValue=Wc;B.escapeHtml=Tn;B.escapeQuote=Cn;B.unescapeQuote=_n;B.escapeHtmlEntities=On;B.escapeDangerHtml5Entities=Pn;B.clearNonPrintableCharacter=Ln;B.friendlyAttrValue=Nn;B.escapeAttrValue=qn;B.onIgnoreTagStripAll=iu;B.StripTagBody=su;B.stripCommentTag=nu;B.stripBlankChar=au;B.cssFilter=Sn;B.getDefaultCSSWhiteList=Gc});var jr=L(Vr=>{var me=wt();function ou(e){var t=me.spaceIndex(e),r;return t===-1?r=e.slice(1,-1):r=e.slice(1,t+1),r=me.trim(r).toLowerCase(),r.slice(0,1)===\"/\"&&(r=r.slice(1)),r.slice(-1)===\"/\"&&(r=r.slice(0,-1)),r}n(ou,\"getTagName\");function lu(e){return e.slice(0,2)===\"</\"}n(lu,\"isClosing\");function cu(e,t,r){\"use strict\";var i=\"\",s=0,a=!1,o=!1,l=0,c=e.length,u=\"\",p=\"\";e:for(l=0;l<c;l++){var d=e.charAt(l);if(a===!1){if(d===\"<\"){a=l;continue}}else if(o===!1){if(d===\"<\"){i+=r(e.slice(s,l)),a=l,s=l;continue}if(d===\">\"||l===c-1){i+=r(e.slice(s,a)),p=e.slice(a,l+1),u=ou(p),i+=t(a,i.length,u,p,lu(p)),s=l+1,a=!1;continue}if(d==='\"'||d===\"'\")for(var f=1,E=e.charAt(l-f);E.trim()===\"\"||E===\"=\";){if(E===\"=\"){o=d;continue e}E=e.charAt(l-++f)}}else if(d===o){o=!1;continue}}return s<c&&(i+=r(e.substr(s))),i}n(cu,\"parseTag\");var uu=/[^a-zA-Z0-9\\\\_:.-]/gim;function pu(e,t){\"use strict\";var r=0,i=0,s=[],a=!1,o=e.length;function l(f,E){if(f=me.trim(f),f=f.replace(uu,\"\").toLowerCase(),!(f.length<1)){var b=t(f,E||\"\");b&&s.push(b)}}n(l,\"addAttr\");for(var c=0;c<o;c++){var u=e.charAt(c),p,d;if(a===!1&&u===\"=\"){a=e.slice(r,c),r=c+1,i=e.charAt(r)==='\"'||e.charAt(r)===\"'\"?r:du(e,c+1);continue}if(a!==!1&&c===i){if(d=e.indexOf(u,c+1),d===-1)break;p=me.trim(e.slice(i+1,d)),l(a,p),a=!1,c=d,r=c+1;continue}if(/\\s|\\n|\\t/.test(u))if(e=e.replace(/\\s|\\n|\\t/g,\" \"),a===!1)if(d=fu(e,c),d===-1){p=me.trim(e.slice(r,c)),l(p),a=!1,r=c+1;continue}else{c=d-1;continue}else if(d=hu(e,c-1),d===-1){p=me.trim(e.slice(r,c)),p=kn(p),l(a,p),a=!1,r=c+1;continue}else continue}return r<e.length&&(a===!1?l(e.slice(r)):l(a,kn(me.trim(e.slice(r))))),me.trim(s.join(\" \"))}n(pu,\"parseAttr\");function fu(e,t){for(;t<e.length;t++){var r=e[t];if(r!==\" \")return r===\"=\"?t:-1}}n(fu,\"findNextEqual\");function du(e,t){for(;t<e.length;t++){var r=e[t];if(r!==\" \")return r===\"'\"||r==='\"'?t:-1}}n(du,\"findNextQuotationMark\");function hu(e,t){for(;t>0;t--){var r=e[t];if(r!==\" \")return r===\"=\"?t:-1}}n(hu,\"findBeforeEqual\");function gu(e){return e[0]==='\"'&&e[e.length-1]==='\"'||e[0]===\"'\"&&e[e.length-1]===\"'\"}n(gu,\"isQuoteWrapString\");function kn(e){return gu(e)?e.substr(1,e.length-2):e}n(kn,\"stripQuoteWrap\");Vr.parseTag=cu;Vr.parseAttr=pu});var Mn=L((rg,Hn)=>{var mu=Rt().FilterCSS,se=Gr(),Dn=jr(),yu=Dn.parseTag,bu=Dn.parseAttr,_t=wt();function Ct(e){return e==null}n(Ct,\"isNull\");function Au(e){var t=_t.spaceIndex(e);if(t===-1)return{html:\"\",closing:e[e.length-2]===\"/\"};e=_t.trim(e.slice(t+1,-1));var r=e[e.length-1]===\"/\";return r&&(e=_t.trim(e.slice(0,-1))),{html:e,closing:r}}n(Au,\"getAttrs\");function Eu(e){var t={};for(var r in e)t[r]=e[r];return t}n(Eu,\"shallowCopyObject\");function xu(e){var t={};for(var r in e)Array.isArray(e[r])?t[r.toLowerCase()]=e[r].map(function(i){return i.toLowerCase()}):t[r.toLowerCase()]=e[r];return t}n(xu,\"keysToLowerCase\");function In(e){e=Eu(e||{}),e.stripIgnoreTag&&(e.onIgnoreTag&&console.error('Notes: cannot use these two options \"stripIgnoreTag\" and \"onIgnoreTag\" at the same time'),e.onIgnoreTag=se.onIgnoreTagStripAll),e.whiteList||e.allowList?e.whiteList=xu(e.whiteList||e.allowList):e.whiteList=se.whiteList,e.onTag=e.onTag||se.onTag,e.onTagAttr=e.onTagAttr||se.onTagAttr,e.onIgnoreTag=e.onIgnoreTag||se.onIgnoreTag,e.onIgnoreTagAttr=e.onIgnoreTagAttr||se.onIgnoreTagAttr,e.safeAttrValue=e.safeAttrValue||se.safeAttrValue,e.escapeHtml=e.escapeHtml||se.escapeHtml,this.options=e,e.css===!1?this.cssFilter=!1:(e.css=e.css||{},this.cssFilter=new mu(e.css))}n(In,\"FilterXSS\");In.prototype.process=function(e){if(e=e||\"\",e=e.toString(),!e)return\"\";var t=this,r=t.options,i=r.whiteList,s=r.onTag,a=r.onIgnoreTag,o=r.onTagAttr,l=r.onIgnoreTagAttr,c=r.safeAttrValue,u=r.escapeHtml,p=t.cssFilter;r.stripBlankChar&&(e=se.stripBlankChar(e)),r.allowCommentTag||(e=se.stripCommentTag(e));var d=!1;r.stripIgnoreTagBody&&(d=se.StripTagBody(r.stripIgnoreTagBody,a),a=d.onIgnoreTag);var f=yu(e,function(E,b,y,x,R){var T={sourcePosition:E,position:b,isClosing:R,isWhite:Object.prototype.hasOwnProperty.call(i,y)},w=s(y,x,T);if(!Ct(w))return w;if(T.isWhite){if(T.isClosing)return\"</\"+y+\">\";var q=Au(x),k=i[y],V=bu(q.html,function(D,S){var _=_t.indexOf(k,D)!==-1,I=o(y,D,S,_);return Ct(I)?_?(S=c(y,D,S,p),S?D+'=\"'+S+'\"':D):(I=l(y,D,S,_),Ct(I)?void 0:I):I});return x=\"<\"+y,V&&(x+=\" \"+V),q.closing&&(x+=\" /\"),x+=\">\",x}else return w=a(y,x,T),Ct(w)?u(x):w},u);return d&&(f=d.remove(f)),f};Hn.exports=In});var zn=L((Le,Ot)=>{var Un=Gr(),Fn=jr(),$n=Mn();function Bn(e,t){var r=new $n(t);return r.process(e)}n(Bn,\"filterXSS\");Le=Ot.exports=Bn;Le.filterXSS=Bn;Le.FilterXSS=$n;(function(){for(var e in Un)Le[e]=Un[e];for(var t in Fn)Le[t]=Fn[t]})();typeof window<\"u\"&&(window.filterXSS=Ot.exports);function vu(){return typeof self<\"u\"&&typeof DedicatedWorkerGlobalScope<\"u\"&&self instanceof DedicatedWorkerGlobalScope}n(vu,\"isWorkerEnv\");vu()&&(self.filterXSS=Ot.exports)});var rp={};ti(rp,{Authorizations:()=>Mt,CustomError:()=>N,PrismaAppSync:()=>Gt,_:()=>tp,log:()=>G,queryBuilder:()=>te});module.exports=Sa(rp);var Ta=n(e=>Number.isInteger(e),\"testObject\"),Ca=n(e=>Object.is(e,-0)?\"-0\":String(e),\"serialize\"),_a=n(e=>Oa.test(e),\"testString\"),Oa=/^-?\\d+$/u,Pa=Number,La=n(e=>e,\"normalize\"),Na=n((e,t)=>Object.is(e,t),\"equals\"),fe={name:\"index\",testObject:Ta,serialize:Ca,testString:_a,parse:Pa,normalize:La,equals:Na};var nt=n((e,t)=>typeof e==\"object\"&&e!==null&&e.type===t,\"isTokenObject\");var ii=n((e,t)=>({name:e,testObject:qa.bind(void 0,e),serialize:ka.bind(void 0,t),testString:Da.bind(void 0,t),parse:Ia.bind(void 0,e),normalize:Ha,equals:Ma}),\"createSimpleTokenType\"),qa=n((e,t)=>nt(t,e),\"testObject\"),ka=n(e=>e,\"serialize\"),Da=n((e,t)=>t===e,\"testString\"),Ia=n(e=>({type:e}),\"parse\"),Ha=n(({type:e})=>({type:e}),\"normalize\"),Ma=n(()=>!0,\"equals\"),jt=ii(\"any\",\"*\"),Qt=ii(\"anyDeep\",\"**\");var de=\"\\\\\",at=\" \",si=\"a space\",le=\".\",ni=new Set([de,le,at]),ot=n(e=>e.replace(Ua,`${de}$&`),\"escapeSpecialChars\"),Ua=/[\\\\. ]/gu;var Fa=n(e=>e instanceof RegExp,\"testObject\"),$a=n(e=>{let t=ot(e.source);return`${He}${t}${He}${e.flags}`},\"serialize\"),Ba=n(e=>e[0]===He&&e.lastIndexOf(He)>1,\"testString\"),za=n(e=>{let t=e.lastIndexOf(He),r=e.slice(1,t),i=e.slice(t+1);return new RegExp(r,i)},\"parse\"),He=\"/\",Ga=n(e=>e,\"normalize\"),Va=n((e,t)=>e.source===t.source&&e.flags===t.flags&&e.lastIndex===t.lastIndex,\"equals\"),Kt={name:\"regExp\",testObject:Fa,serialize:$a,testString:Ba,parse:za,normalize:Ga,equals:Va};var ja=n(e=>nt(e,ui)&&ai(e.from)&&ai(e.to),\"testObject\"),ai=n(e=>e===void 0||fe.testObject(e),\"isEdge\"),Qa=n(({from:e,to:t})=>`${oi(e)}${ci}${oi(t)}`,\"serialize\"),oi=n(e=>e===void 0?li:fe.serialize(e),\"serializeEdge\"),Ka=n(e=>Wa.test(e),\"testString\"),Wa=/^(-?\\d+)?:(-?\\d+)?$/u,Ya=n(e=>{let[t,r]=e.split(ci).map(Xa);return{type:ui,from:t,to:r}},\"parse\"),Xa=n(e=>e===li?void 0:fe.parse(e),\"parseEdge\"),li=\"\",ci=\":\",ui=\"slice\",Wt=n(({type:e,from:t=0,to:r})=>Object.is(r,-0)||r===void 0?{type:e,from:t}:{type:e,from:t,to:r},\"normalize\"),Za=n((e,t)=>{let{from:r,to:i}=Wt(e),{from:s,to:a}=Wt(t);return Object.is(r,s)&&Object.is(i,a)},\"equals\"),Yt={name:\"slice\",testObject:ja,serialize:Qa,testString:Ka,parse:Ya,normalize:Wt,equals:Za};var pi=n(e=>Xt.find(t=>t.testString(e)),\"getOtherStringTokenType\"),Xt=[jt,Qt,Kt,Yt,fe],fi=[fe,jt,Qt,Kt,Yt];var Ja=n(e=>typeof e==\"string\",\"testObject\"),eo=n((e,t)=>{if(e===\"\"&&t===0)return le;let r=ot(e);return pi(r)===void 0?r:`${de}${r}`},\"serialize\"),to=n(()=>!0,\"testString\"),ro=n(e=>e,\"parse\"),io=n(e=>e,\"normalize\"),so=n((e,t)=>e===t,\"equals\"),Me={name:\"prop\",testObject:Ja,serialize:eo,testString:to,parse:ro,normalize:io,equals:so};var Ue=n(e=>{let t=Fe(e);return t===void 0?no:t.name},\"getTokenType\"),no=\"unknown\",Fe=n(e=>oo.find(t=>t.testObject(e)),\"getObjectTokenType\"),di=n((e,t)=>t?Me:ao.find(r=>r.testString(e)),\"getStringTokenType\"),ao=[...Xt,Me],oo=[Me,...fi],hi=n(e=>Me.testObject(e)||fe.testObject(e)&&e>=0&&!Object.is(e,-0),\"isPathToken\");var lt=n((e,t,r)=>{re(e,`Invalid token: ${t}\n${r}`)},\"throwTokenError\"),re=n((e,t)=>{throw new Error(`Invalid query: ${e}\n${t}`)},\"throwQueryError\");var gi=n((e,t)=>{e.length!==1&&re(t,\"It must not be a union.\");let[r]=e;return mi(r,t),r},\"normalizeArraysPath\"),ct=n((e,t)=>{Array.isArray(e)||re(t,\"It must be an array.\"),e.some(Array.isArray)&&re(t,\"It must not be a union.\"),mi(e,t)},\"validatePath\"),mi=n((e,t)=>{e.forEach(r=>{lo(r,t)})},\"validatePathTokens\"),lo=n((e,t)=>{hi(e)||lt(t,e,\"It must be a property name or a positive array index.\")},\"validatePathToken\");var yi=n(e=>{ut(e)||re(e,\"It must be a string.\")},\"validateQueryString\"),ut=n(e=>typeof e==\"string\",\"isQueryString\"),bi=n((e,t)=>{e.length===0&&re(t,\"It must not be an empty string.\")},\"validateEmptyQuery\");var Ai=n((e,t)=>{let r=t[e.index+1];if(ni.has(r)){e.index+=1,e.chars+=r;return}e.chars.length!==0&&re(t,`Character \"${de}\" must either be at the start of a token, or be followed by ${si} or ${le} or ${de}`),e.isProp=!0},\"parseEscape\");var Ei=n(e=>{let t=co();for(;t.index<=e.length;t.index+=1){let r=e[t.index];r===de?Ai(t,e):r===at||t.index===e.length?uo(t):r===le?vi(t):t.chars+=r}return t.arrays},\"parseQueryString\"),co=n(()=>{let e={arrays:[],index:0};return xi(e),wi(e),e},\"getInitialState\"),uo=n(e=>{po(e)||(Ri(e)||vi(e),e.arrays.push(e.array),xi(e))},\"addQueryArray\"),po=n(e=>e.firstToken&&e.chars.length===0&&e.array.length===0,\"hasNoQueryArray\"),xi=n(e=>{e.array=[],e.firstToken=!0,e.onlyDots=!0},\"resetQueryArrayState\"),vi=n(e=>{if(fo(e))return;e.onlyDots=Ri(e);let t=di(e.chars,e.isProp),r=t.normalize(t.parse(e.chars));e.array.push(r),wi(e)},\"addToken\"),Ri=n(e=>e.onlyDots&&e.chars.length===0,\"hasOnlyDots\"),fo=n(e=>e.firstToken?(e.firstToken=!1,e.chars.length===0):!1,\"handleLeadingDot\"),wi=n(e=>{e.isProp=!1,e.chars=\"\"},\"resetTokenState\");var Si=n(e=>{let t=Zt(e);return gi(t,e)},\"parsePath\"),Zt=n(e=>{yi(e);let t=Ei(e);return bi(t,e),t},\"parseQuery\");var Ti=n((e,t)=>pt(e,t).normalize(e),\"normalizeToken\"),pt=n((e,t)=>{let r=Fe(e);return ho(r,e,t),r},\"getValidTokenType\"),ho=n((e,t,r)=>{e===void 0&&lt(r,t,`It must be one of the following:\n - a property name string\n - an array index integer, positive or negative\n - a property name regular expression\n - { type: \"any\" }\n - { type: \"slice\", from: integer, to: integer }`)},\"validateToken\");var Ci=n((e,t)=>(go(e,t),(e.every(Array.isArray)&&e.length!==0?e:[e]).map(i=>mo(i,t))),\"normalizeQueryArrays\"),go=n((e,t)=>{Array.isArray(e)||re(t,\"It must be an array.\")},\"validateQueryArrays\"),mo=n((e,t)=>e.map(r=>Ti(r,t)),\"normalizeQueryArray\");var Jt=n(e=>ut(e)?Si(e):(ct(e,e),e),\"normalizePath\"),er=n(e=>ut(e)?Zt(e):Ci(e,e),\"normalizeQuery\");var tr=n((e,t)=>{if(Object.is(e,t))return!0;let r=pt(e),i=pt(t);return r===i&&r.equals(e,t)},\"isSameToken\");var rr=n(e=>(ct(e,e),yo(e)),\"serializePath\"),yo=n(e=>e.every(bo)?le.repeat(e.length+1):e.map(Eo).join(le),\"serializeQueryArray\"),bo=n(e=>e===Ao,\"isEmptyToken\"),Ao=\"\",Eo=n((e,t)=>Fe(e).serialize(e,t),\"serializeToken\");var _i=n(({classes:e,inherited:t})=>{if(t&&!e)throw new Error('The \"classes\" option must be true when the \"inherited\" option is true.')},\"validateInherited\"),Oi=n(({missing:e,entries:t})=>{if(e&&!t)throw new Error('The \"entries\" option must be true when the \"missing\" option is true.')},\"validateMissing\"),Pi=n(({roots:e,leaves:t})=>{if(e&&t)throw new Error('The \"roots\" and \"leaves\" options must not be true at the same time.')},\"validateLeaves\");var Li=n(({childFirst:e=!1,roots:t=!1,leaves:r=!1,sort:i=!1,missing:s=!1,entries:a=!1,shallowArrays:o=!1,classes:l=!1,inherited:c=!1}={})=>{let u={childFirst:e||r,roots:t,leaves:r,sort:i,missing:s,entries:a,shallowArrays:o,classes:l,inherited:c};return _i(u),Pi(u),Oi(u),u},\"getOptions\");var xo=n((e,t,{inherited:r,shallowArrays:i})=>Array.isArray(e)?i?[{value:e,missing:!1}]:e.map((s,a)=>({value:s,prop:a,missing:!1})):ir(e,r).map(s=>({value:e[s],prop:s,missing:!1})),\"iterate\"),ir=n((e,t)=>{if(!t)return Object.keys(e);let r=[];for(let i in e)r.push(i);return r},\"getKeys\"),sr={name:\"any\",valueType:\"objectArray\",iterate:xo};var vo=n((e,t)=>{let r=e.slice(0,t),i=Ni(e,t);return[[...r,...e.slice(i+1)],[...r,{type:\"any\"},...e.slice(i)]]},\"recurse\"),Ni=n((e,t)=>t<=e.length-1&&Ue(e[t])===\"anyDeep\"?Ni(e,t+1):t-1,\"getLastIndex\"),nr={name:\"anyDeep\",array:!1,recurse:vo};var Ro=n((e,t)=>{let r=ar(e,t);return[{value:e[r],prop:r,missing:r>=e.length}]},\"iterate\"),ar=n((e,t)=>t>0||Object.is(t,0)?t:Math.max(e.length+t,0),\"getArrayIndex\"),or={name:\"index\",valueType:\"array\",iterate:Ro};var wo=n((e,t)=>[{value:e[t],prop:t,missing:!(t in e)}],\"iterate\"),lr={name:\"prop\",valueType:\"weakObject\",iterate:wo};var So=n((e,t,{inherited:r})=>ir(e,r).filter(i=>t.test(i)).map(i=>({value:e[i],prop:i,missing:!1})),\"iterate\"),cr={name:\"regExp\",valueType:\"strictObject\",iterate:So};var To=n((e,{from:t,to:r=-0})=>{let i=qi(e,t),s=Math.max(qi(e,r),i);return new Array(s-i).fill().map((a,o)=>({value:e[o+i],prop:o+i,missing:!1}))},\"iterate\"),qi=n((e,t)=>{let r=ar(e,t);return Math.min(r,e.length)},\"getBoundedIndex\"),ur={name:\"slice\",valueType:\"array\",iterate:To};var ft=n(e=>{let t=Ue(e);return Co[t]},\"getTokenType\"),Co={[sr.name]:sr,[nr.name]:nr,[or.name]:or,[lr.name]:lr,[cr.name]:cr,[ur.name]:ur};function pr(e){if(typeof e!=\"object\"||e===null)return!1;let t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)}n(pr,\"isPlainObject\");var fr=n((e,t)=>t?dr(e):pr(e),\"isObject\"),dr=n(e=>{let t=typeof e;return(t===\"object\"||t===\"function\")&&e!==null},\"isWeakObject\");var ki=n((e,t,r)=>{let i=ft(t),{isPresent:s,getDefaultValue:a}=gr[i.valueType],o=!s(e,r),l=o?a():e;return{tokenType:i,missing:o,value:l}},\"handleMissingValue\"),hr=n(()=>({}),\"getDefaultObject\"),_o=n(()=>[],\"getDefaultArray\"),gr={objectArray:{isPresent:(e,t)=>fr(e,t)||Array.isArray(e),getDefaultValue:hr},array:{isPresent:Array.isArray,getDefaultValue:_o},strictObject:{isPresent:(e,t)=>fr(e,t),getDefaultValue:hr},weakObject:{isPresent:dr,getDefaultValue:hr}};var Di=n((e,t,r)=>e.filter(({queryArray:i})=>i.length!==t).flatMap(i=>Oo(i,t,r)),\"expandTokens\"),Oo=n(({queryArray:e,value:t,path:r},i,s)=>{let a=e[i],o=ki(t,a,s.classes);return No(a,o,s).filter(Po).map(({value:c,prop:u,missing:p})=>({queryArray:e,value:c,path:u===void 0?r:[...r,u],missing:o.missing||p}))},\"expandToken\"),Po=n(({prop:e})=>mr(e),\"isAllowedEntry\"),mr=n(e=>!Lo.has(e),\"isAllowedProp\"),Lo=new Set([\"__proto__\",\"prototype\",\"constructor\"]),No=n((e,{tokenType:t,missing:r,value:i},s)=>s.missing?t.iterate(i,e,s):r?[]:t.iterate(i,e,s).filter(qo),\"iterateToken\"),qo=n(({missing:e})=>!e,\"isNotMissing\");var Ii=n((e,t,{missing:r,entries:i})=>{let{value:s,missing:a}=ko(e,t);return a&&!r?{matches:!1}:{entry:i?{value:s,path:t,missing:a}:s,matches:!0}},\"getPathValue\"),ko=n((e,t)=>{for(let r of t){if(!Do(e,r)||!mr(r))return{value:void 0,missing:!0};e=e[r]}return{value:e,missing:!1}},\"getDeepValue\"),Do=n((e,t)=>typeof t==\"string\"?Ho(e)&&t in e:Io(e)&&t<e.length,\"isPresent\"),{array:{isPresent:Io},weakObject:{isPresent:Ho}}=gr;var Hi=n((e,t)=>{let r={};return e.forEach((i,s)=>{Mo(i,s,r,t)}),r},\"groupBy\"),Mo=n((e,t,r,i)=>{let s=i(e,t),a=String(s);if(r[a]===void 0){r[a]=[e];return}r[a].push(e)},\"addGroup\");var Mi=n(function*({entries:e,parentEntry:t,index:r,parents:i,opts:s,iterateLevel:a}){if(!Uo(e,t,s))return!1;let o=!1;for(let l of Fo({entries:e,index:r,parents:i,opts:s,iterateLevel:a}))o=!0,yield l;return o},\"iterateChildEntries\"),Uo=n((e,t,{roots:r})=>t===void 0||e.length!==1&&!r,\"shouldIterateChildren\"),Fo=n(function*({entries:e,index:t,parents:r,opts:i,iterateLevel:s}){let a=Di(e,t,i);if(a.length===0)return;let o=t+1;if(a.length===1){yield*s({entries:a,index:o,parents:r,opts:i});return}let l=$o(a,i);for(let c of l)yield*s({entries:c,index:o,parents:r,opts:i})},\"iterateChildren\"),$o=n((e,{sort:t})=>{let r=Hi(e,Bo);return t?Object.keys(r).sort().map(i=>r[i]):Object.values(r)},\"groupSortChildEntries\"),Bo=n(({path:e})=>e[e.length-1],\"getLastProp\");var Ui=n(e=>e.length===1?e:e.filter(zo),\"removeDuplicates\"),zo=n((e,t,r)=>r.every((i,s)=>t<=s||!Go(e,i)),\"isNotDuplicate\"),Go=n(({queryArray:e,path:t},{queryArray:r})=>e.length===r.length&&e.every((i,s)=>s<t.length||tr(i,r[s])),\"isDuplicate\");var Fi=n((e,t)=>{let r=e.map(i=>Vo(i,t));return r.some(Boolean)?e.flatMap((i,s)=>jo(i,r[s],t)):e},\"expandRecursiveTokens\"),Vo=n((e,t)=>{let r=e.queryArray[t];return r===void 0?void 0:ft(r).recurse},\"getRecurseFunc\"),jo=n((e,t,r)=>t===void 0?e:t(e.queryArray,r).map(s=>({...e,queryArray:s})),\"expandRecursiveToken\");var zi=n(function*(e,t,r){let i=new Set([]),s=Qo(e,t);yield*Gi({entries:s,index:0,parents:i,opts:r})},\"iterateQuery\"),Qo=n((e,t)=>t.map(r=>({queryArray:r,value:e,path:[],missing:!1})),\"getRootEntries\"),Gi=n(function*({entries:e,entries:[{value:t,missing:r}],index:i,parents:s,opts:a}){if(r){yield*$i({entries:e,index:i,parents:s,opts:a});return}s.has(t)||(s.add(t),yield*$i({entries:e,index:i,parents:s,opts:a}),s.delete(t))},\"iterateLevel\"),$i=n(function*({entries:e,index:t,parents:r,opts:i}){let s=Fi(e,t),a=Ui(s),o=Ko(a,t);Wo(o,i)&&(yield Bi(o,i));let l=yield*Mi({entries:a,parentEntry:o,index:t,parents:r,opts:i,iterateLevel:Gi});Yo(o,l,i)&&(yield Bi(o,i))},\"iterateToken\"),Ko=n((e,t)=>e.find(({queryArray:r})=>r.length===t),\"getParentEntry\"),Bi=n(({value:e,path:t,missing:r},{entries:i})=>i?{value:e,path:t,missing:r}:e,\"normalizeEntry\"),Wo=n((e,{childFirst:t})=>e!==void 0&&!t,\"shouldYieldParentFirst\"),Yo=n((e,t,{childFirst:r,leaves:i})=>e!==void 0&&r&&!(i&&t),\"shouldYieldParentLast\");var yr=n((e,t,r)=>{let{opts:i,pathArray:s,queryArrays:a}=Xo(t,r);if(s===void 0)return[...zi(e,a,i)];let{entry:o,matches:l}=Ii(e,s,i);return l?[o]:[]},\"list\");var Xo=n((e,t)=>{let r=Li(t),{pathArray:i,queryArrays:s}=Zo(e);return{opts:r,pathArray:i,queryArrays:s}},\"normalizeArgs\"),Zo=n(e=>{try{return{pathArray:Jt(e)}}catch{return{queryArrays:er(e)}}},\"normalizePathOrQuery\");var dt=n((e,{sort:t,shallowArrays:r,classes:i,inherited:s}={})=>{let a=yr(e,\"**\",{childFirst:!1,roots:!1,leaves:!0,sort:t,missing:!1,entries:!0,shallowArrays:r,classes:i,inherited:s});return Object.fromEntries(a.map(Jo))},\"flatten\"),Jo=n(({path:e,value:t})=>[rr(e),t],\"flattenEntry\");var Gn=Ie(Zs()),Qr=Ie(rn()),Lt=Ie(un()),Vn=Ie(zn());function pe(...e){return Qr.default.all([{},...e])}n(pe,\"merge\");function Re(e){return(0,Qr.default)({},e)}n(Re,\"clone\");function Nt(e){return(0,Lt.decode)(e)}n(Nt,\"decode\");function qt(e){return(0,Lt.encode)(e)}n(qt,\"encode\");function jn(e){return dt(e,{shallowArrays:!0})}n(jn,\"dotate\");function Qn(e){let t=dt(e),r=Object.keys(t).map(a=>a.split(\".\").filter(o=>!!!/\\b(\\d+)\\b/gi.exec(o)).join(\"/\")),i=[],s=new Set;for(let a of r){let o=a.split(\"/\"),l=\"\";for(let c of o)l+=l===\"\"?c:`/${c}`,s.has(l)||(i.push(l),s.add(l))}return i}n(Qn,\"objectToPaths\");function Kn(e,t){let r=Re(e);return(Array.isArray(t)?t:[t]).forEach(s=>delete r?.[s]),r}n(Kn,\"omit\");function We(e,t){return(0,Gn.isMatch)(e,t)}n(We,\"isMatchingGlob\");function kt(e){return(0,Vn.default)(e)}n(kt,\"filterXSS\");function W(e){return e==null||typeof e>\"u\"||typeof e==\"string\"&&e.trim()===\"\"||Array.isArray(e)&&e.length===0||Object.getPrototypeOf(e)===Object.prototype&&Object.keys(e).length===0}n(W,\"isEmpty\");function Ye(e){return e===void 0||typeof e>\"u\"}n(Ye,\"isUndefined\");var Ru=n(e=>Array.isArray(e),\"isArray\");function Dt(e){return e?e.charAt(0).toLowerCase()+e.slice(1):\"\"}n(Dt,\"lowerFirst\");var ve=n(e=>Object.prototype.toString.call(e)===\"[object Object]\",\"isObject\");async function we(e,t){return Array.isArray(e)?await Promise.all(e.map(async r=>await Pt(r,t))):ve(e)?await Pt(e,t):e}n(we,\"walk\");async function Pt(e,t,r=new Ke){let i=Re(e),s={},a=Object.keys(i);for(let o of a){let l=new Ke([...r._path,o]),{key:c,value:u}=await t({key:o,value:i[o]},l);if(u&&ve(u)&&!l._ignoreChildren)u=await Pt(u,t,l);else if(u&&Ru(u)&&!l._ignoreChildren)for(let p=0;p<u.length;p++)u[p]&&ve(u[p])&&(u[p]=await Pt(u[p],t,new Ke([...l._path,p])));s[c]=u}return s}n(Pt,\"walkObj\");var Ke=class{constructor(t=[],r=!1){this._path=t;this._ignoreChildren=r;this._path=t,this._ignoreChildren=r}static{n(this,\"WalkNode\")}ignoreChilds(){this._ignoreChildren=!0}getPath(){return this._path}};function Wn(e,t,r){let i=[],s={};for(let a=0;a<t.length;a++)i.push(t[a].replace(/([-[\\]{}()*+?.\\\\^$|#,])/g,\"\\\\$1\")),s[t[a]]=r[a];return i=i.join(\"|\"),e=e.replace(new RegExp(i,\"g\"),a=>s[a]),e}n(Wn,\"replaceAll\");function Xe(e){return Array.from(new Set(e))}n(Xe,\"uniq\");var ne=require(\"@prisma/client\");var Kr=(w=>(w.get=\"get\",w.list=\"list\",w.count=\"count\",w.createMany=\"createMany\",w.updateMany=\"updateMany\",w.deleteMany=\"deleteMany\",w.create=\"create\",w.update=\"update\",w.upsert=\"upsert\",w.delete=\"delete\",w.onCreatedMany=\"onCreatedMany\",w.onUpdatedMany=\"onUpdatedMany\",w.onDeletedMany=\"onDeletedMany\",w.onMutatedMany=\"onMutatedMany\",w.onCreated=\"onCreated\",w.onUpdated=\"onUpdated\",w.onUpserted=\"onUpserted\",w.onDeleted=\"onDeleted\",w.onMutated=\"onMutated\",w))(Kr||{});var Mt=(a=>(a.API_KEY=\"API_KEY\",a.AWS_IAM=\"AWS_IAM\",a.AMAZON_COGNITO_USER_POOLS=\"AMAZON_COGNITO_USER_POOLS\",a.AWS_LAMBDA=\"AWS_LAMBDA\",a.OPENID_CONNECT=\"OPENID_CONNECT\",a))(Mt||{}),Yn=[\"where\",\"data\",\"select\",\"orderBy\",\"include\",\"distinct\"],wu=[\"create\",\"createMany\",\"set\",\"connect\",\"connectOrCreate\",\"disconnect\",\"update\",\"upsert\",\"delete\",\"updateMany\",\"deleteMany\"],Xn=[\"equals\",\"not\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"contains\",\"search\",\"mode\",\"startsWith\",\"endsWith\",\"AND\",\"OR\",\"NOT\"],Zn=[\"some\",\"every\",\"none\",\"is\",\"isNot\"],Su=[\"set\",\"push\",\"unset\"],Jn=[\"has\",\"hasEvery\",\"hasSome\",\"isEmpty\",\"isSet\",\"equals\"],Tu=[\"set\",\"unset\",\"update\",\"upsert\",\"push\"],ea=[\"equals\",\"is\",\"isNot\",\"isEmpty\",\"every\",\"some\",\"none\"],Cu=[\"increment\",\"decrement\",\"multiply\",\"divide\",\"set\"],ta=[\"path\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_contains\",\"array_starts_with\",\"array_ends_with\"],ra=Xe([...Yn,...Xn,...Zn,...Jn,...ea,...ta]),ug=Xe([...Yn,...wu,...Xn,...Zn,...Su,...Jn,...Tu,...ea,...Cu,...ta]),Ne={access:[\"get\",\"list\",\"count\"],batchAccess:[\"list\",\"count\"],create:[\"create\",\"createMany\"],batchCreate:[\"createMany\"],modify:[\"upsert\",\"update\",\"updateMany\",\"delete\",\"deleteMany\"],batchModify:[\"updateMany\",\"deleteMany\"],delete:[\"delete\",\"deleteMany\"],batchDelete:[\"deleteMany\"],subscribe:[\"onCreatedMany\",\"onUpdatedMany\",\"onDeletedMany\",\"onMutatedMany\",\"onCreated\",\"onUpdated\",\"onUpserted\",\"onDeleted\",\"onMutated\"],batchSubscribe:[\"onCreatedMany\",\"onUpdatedMany\",\"onDeletedMany\",\"onMutatedMany\"]},It=[],Ht=[];for(let e in Ne)e.startsWith(\"batch\")?It=It.concat(Ne[e]):Ht=Ht.concat(Ne[e]);var pg=Ht.filter((e,t)=>Ht.indexOf(e)===t),Ut=It.filter((e,t)=>It.indexOf(e)===t),Ze=\"__prismaAppsync\";var ia=require(\"node:util\");var Wr={FORBIDDEN:401,BAD_USER_INPUT:400,INTERNAL_SERVER_ERROR:500,TOO_MANY_REQUESTS:429},N=class extends Error{static{n(this,\"CustomError\")}constructor(t,r){super(t),this.error=t,this.type=r.type,this.cause=r?.cause?.meta?.cause||r?.cause,this.code=typeof Wr[this.type]<\"u\"?Wr[this.type]:Wr.INTERNAL_SERVER_ERROR,this.message=JSON.stringify({error:this.error,type:this.type,code:this.code});let i=500;this.cause?.message?.length>i&&(this.cause.message=`... ${this.cause.message.slice(this.cause.message.length-i)}`),this.details={error:this.error,type:this.type,code:this.code,...this.cause&&{cause:this.cause}},process?.env?.PRISMA_APPSYNC_TESTING!==\"true\"&&G(t,this.details,\"ERROR\")}};function sa(e){return e instanceof N?e:new N(e.message,{type:\"INTERNAL_SERVER_ERROR\",cause:e})}n(sa,\"parseError\");function G(e,t,r){Ft(r||\"INFO\")&&(_u(e,r||\"INFO\"),t&&console.log((0,ia.inspect)(t,{compact:!1,depth:5,breakLength:80,maxStringLength:800,...!process.env.LAMBDA_TASK_ROOT&&{colors:!0}})))}n(G,\"log\");function _u(e,t){let s=[`\\u25ED ${new Date().toLocaleString(void 0,{day:\"numeric\",month:\"numeric\",year:\"numeric\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\"})} <<${t}>>`,e].join(\" \");t===\"ERROR\"&&Ft(t)?console.error(`\\x1B[31m${s}`):t===\"WARN\"&&Ft(t)?console.warn(`\\x1B[33m${s}`):t===\"INFO\"&&Ft(t)&&console.info(`\\x1B[36m${s}`)}n(_u,\"printLog\");function Ft(e){if(process?.env?.PRISMA_APPSYNC_TESTING===\"true\")return!1;let t=String(process.env.PRISMA_APPSYNC_LOG_LEVEL);return t===\"ERROR\"&&e===\"ERROR\"||t===\"WARN\"&&[\"WARN\",\"ERROR\"].includes(e)||t===\"INFO\"}n(Ft,\"canPrintLog\");var ke=Ie(require(\"assert\"),1);var Je=typeof performance==\"object\"&&performance&&typeof performance.now==\"function\"?performance:Date,aa=new Set,Yr=typeof process==\"object\"&&process?process:{},oa=n((e,t,r,i)=>{typeof Yr.emitWarning==\"function\"?Yr.emitWarning(e,t,r,i):console.error(`[${r}] ${t}: ${e}`)},\"emitWarning\"),$t=globalThis.AbortController,na=globalThis.AbortSignal;if(typeof $t>\"u\"){na=class{static{n(this,\"AbortSignal\")}onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},$t=class{static{n(this,\"AbortController\")}constructor(){t()}signal=new na;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let e=Yr.env?.LRU_CACHE_IGNORE_AC_WARNING!==\"1\",t=n(()=>{e&&(e=!1,oa(\"AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.\",\"NO_ABORT_CONTROLLER\",\"ENOTSUP\",t))},\"warnACPolyfill\")}var Ou=n(e=>!aa.has(e),\"shouldWarn\"),yg=Symbol(\"type\"),ye=n(e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),\"isPosInt\"),la=n(e=>ye(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?qe:null:null,\"getUintArray\"),qe=class extends Array{static{n(this,\"ZeroArray\")}constructor(t){super(t),this.fill(0)}},Xr=class e{static{n(this,\"Stack\")}heap;length;static#l=!1;static create(t){let r=la(t);if(!r)return[];e.#l=!0;let i=new e(t,r);return e.#l=!1,i}constructor(t,r){if(!e.#l)throw new TypeError(\"instantiate Stack using Stack.create(n)\");this.heap=new r(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},Bt=class e{static{n(this,\"LRUCache\")}#l;#p;#b;#h;#O;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#i;#g;#s;#r;#e;#c;#f;#o;#n;#m;#a;#v;#R;#y;#A;#S;#u;static unsafeExposeInternals(t){return{starts:t.#R,ttls:t.#y,sizes:t.#v,keyMap:t.#s,keyList:t.#r,valList:t.#e,next:t.#c,prev:t.#f,get head(){return t.#o},get tail(){return t.#n},free:t.#m,isBackgroundFetch:r=>t.#t(r),backgroundFetch:(r,i,s,a)=>t.#N(r,i,s,a),moveToTail:r=>t.#_(r),indexes:r=>t.#E(r),rindexes:r=>t.#x(r),isStale:r=>t.#d(r)}}get max(){return this.#l}get maxSize(){return this.#p}get calculatedSize(){return this.#g}get size(){return this.#i}get fetchMethod(){return this.#O}get dispose(){return this.#b}get disposeAfter(){return this.#h}constructor(t){let{max:r=0,ttl:i,ttlResolution:s=1,ttlAutopurge:a,updateAgeOnGet:o,updateAgeOnHas:l,allowStale:c,dispose:u,disposeAfter:p,noDisposeOnSet:d,noUpdateTTL:f,maxSize:E=0,maxEntrySize:b=0,sizeCalculation:y,fetchMethod:x,noDeleteOnFetchRejection:R,noDeleteOnStaleGet:T,allowStaleOnFetchRejection:w,allowStaleOnFetchAbort:q,ignoreFetchAbort:k}=t;if(r!==0&&!ye(r))throw new TypeError(\"max option must be a nonnegative integer\");let V=r?la(r):Array;if(!V)throw new Error(\"invalid max value: \"+r);if(this.#l=r,this.#p=E,this.maxEntrySize=b||this.#p,this.sizeCalculation=y,this.sizeCalculation){if(!this.#p&&!this.maxEntrySize)throw new TypeError(\"cannot set sizeCalculation without setting maxSize or maxEntrySize\");if(typeof this.sizeCalculation!=\"function\")throw new TypeError(\"sizeCalculation set to non-function\")}if(x!==void 0&&typeof x!=\"function\")throw new TypeError(\"fetchMethod must be a function if specified\");if(this.#O=x,this.#S=!!x,this.#s=new Map,this.#r=new Array(r).fill(void 0),this.#e=new Array(r).fill(void 0),this.#c=new V(r),this.#f=new V(r),this.#o=0,this.#n=0,this.#m=Xr.create(r),this.#i=0,this.#g=0,typeof u==\"function\"&&(this.#b=u),typeof p==\"function\"?(this.#h=p,this.#a=[]):(this.#h=void 0,this.#a=void 0),this.#A=!!this.#b,this.#u=!!this.#h,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!f,this.noDeleteOnFetchRejection=!!R,this.allowStaleOnFetchRejection=!!w,this.allowStaleOnFetchAbort=!!q,this.ignoreFetchAbort=!!k,this.maxEntrySize!==0){if(this.#p!==0&&!ye(this.#p))throw new TypeError(\"maxSize must be a positive integer if specified\");if(!ye(this.maxEntrySize))throw new TypeError(\"maxEntrySize must be a positive integer if specified\");this.#M()}if(this.allowStale=!!c,this.noDeleteOnStaleGet=!!T,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!l,this.ttlResolution=ye(s)||s===0?s:1,this.ttlAutopurge=!!a,this.ttl=i||0,this.ttl){if(!ye(this.ttl))throw new TypeError(\"ttl must be a positive integer if specified\");this.#q()}if(this.#l===0&&this.ttl===0&&this.#p===0)throw new TypeError(\"At least one of max, maxSize, or ttl is required\");if(!this.ttlAutopurge&&!this.#l&&!this.#p){let D=\"LRU_CACHE_UNBOUNDED\";Ou(D)&&(aa.add(D),oa(\"TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.\",\"UnboundedCacheWarning\",D,e))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#q(){let t=new qe(this.#l),r=new qe(this.#l);this.#y=t,this.#R=r,this.#k=(a,o,l=Je.now())=>{if(r[a]=o!==0?l:0,t[a]=o,o!==0&&this.ttlAutopurge){let c=setTimeout(()=>{this.#d(a)&&this.delete(this.#r[a])},o+1);c.unref&&c.unref()}},this.#T=a=>{r[a]=t[a]!==0?Je.now():0},this.#w=(a,o)=>{if(t[o]){let l=t[o],c=r[o];a.ttl=l,a.start=c,a.now=i||s();let u=a.now-c;a.remainingTTL=l-u}};let i=0,s=n(()=>{let a=Je.now();if(this.ttlResolution>0){i=a;let o=setTimeout(()=>i=0,this.ttlResolution);o.unref&&o.unref()}return a},\"getNow\");this.getRemainingTTL=a=>{let o=this.#s.get(a);if(o===void 0)return 0;let l=t[o],c=r[o];if(l===0||c===0)return 1/0;let u=(i||s())-c;return l-u},this.#d=a=>t[a]!==0&&r[a]!==0&&(i||s())-r[a]>t[a]}#T=()=>{};#w=()=>{};#k=()=>{};#d=()=>!1;#M(){let t=new qe(this.#l);this.#g=0,this.#v=t,this.#C=r=>{this.#g-=t[r],t[r]=0},this.#D=(r,i,s,a)=>{if(this.#t(i))return 0;if(!ye(s))if(a){if(typeof a!=\"function\")throw new TypeError(\"sizeCalculation must be a function\");if(s=a(i,r),!ye(s))throw new TypeError(\"sizeCalculation return invalid (expect positive integer)\")}else throw new TypeError(\"invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.\");return s},this.#P=(r,i,s)=>{if(t[r]=i,this.#p){let a=this.#p-t[r];for(;this.#g>a;)this.#L(!0)}this.#g+=t[r],s&&(s.entrySize=i,s.totalCalculatedSize=this.#g)}}#C=t=>{};#P=(t,r,i)=>{};#D=(t,r,i,s)=>{if(i||s)throw new TypeError(\"cannot set size without setting maxSize or maxEntrySize on cache\");return 0};*#E({allowStale:t=this.allowStale}={}){if(this.#i)for(let r=this.#n;!(!this.#I(r)||((t||!this.#d(r))&&(yield r),r===this.#o));)r=this.#f[r]}*#x({allowStale:t=this.allowStale}={}){if(this.#i)for(let r=this.#o;!(!this.#I(r)||((t||!this.#d(r))&&(yield r),r===this.#n));)r=this.#c[r]}#I(t){return t!==void 0&&this.#s.get(this.#r[t])===t}*entries(){for(let t of this.#E())this.#e[t]!==void 0&&this.#r[t]!==void 0&&!this.#t(this.#e[t])&&(yield[this.#r[t],this.#e[t]])}*rentries(){for(let t of this.#x())this.#e[t]!==void 0&&this.#r[t]!==void 0&&!this.#t(this.#e[t])&&(yield[this.#r[t],this.#e[t]])}*keys(){for(let t of this.#E()){let r=this.#r[t];r!==void 0&&!this.#t(this.#e[t])&&(yield r)}}*rkeys(){for(let t of this.#x()){let r=this.#r[t];r!==void 0&&!this.#t(this.#e[t])&&(yield r)}}*values(){for(let t of this.#E())this.#e[t]!==void 0&&!this.#t(this.#e[t])&&(yield this.#e[t])}*rvalues(){for(let t of this.#x())this.#e[t]!==void 0&&!this.#t(this.#e[t])&&(yield this.#e[t])}[Symbol.iterator](){return this.entries()}find(t,r={}){for(let i of this.#E()){let s=this.#e[i],a=this.#t(s)?s.__staleWhileFetching:s;if(a!==void 0&&t(a,this.#r[i],this))return this.get(this.#r[i],r)}}forEach(t,r=this){for(let i of this.#E()){let s=this.#e[i],a=this.#t(s)?s.__staleWhileFetching:s;a!==void 0&&t.call(r,a,this.#r[i],this)}}rforEach(t,r=this){for(let i of this.#x()){let s=this.#e[i],a=this.#t(s)?s.__staleWhileFetching:s;a!==void 0&&t.call(r,a,this.#r[i],this)}}purgeStale(){let t=!1;for(let r of this.#x({allowStale:!0}))this.#d(r)&&(this.delete(this.#r[r]),t=!0);return t}dump(){let t=[];for(let r of this.#E({allowStale:!0})){let i=this.#r[r],s=this.#e[r],a=this.#t(s)?s.__staleWhileFetching:s;if(a===void 0||i===void 0)continue;let o={value:a};if(this.#y&&this.#R){o.ttl=this.#y[r];let l=Je.now()-this.#R[r];o.start=Math.floor(Date.now()-l)}this.#v&&(o.size=this.#v[r]),t.unshift([i,o])}return t}load(t){this.clear();for(let[r,i]of t){if(i.start){let s=Date.now()-i.start;i.start=Je.now()-s}this.set(r,i.value,i)}}set(t,r,i={}){if(r===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:a,noDisposeOnSet:o=this.noDisposeOnSet,sizeCalculation:l=this.sizeCalculation,status:c}=i,{noUpdateTTL:u=this.noUpdateTTL}=i,p=this.#D(t,r,i.size||0,l);if(this.maxEntrySize&&p>this.maxEntrySize)return c&&(c.set=\"miss\",c.maxEntrySizeExceeded=!0),this.delete(t),this;let d=this.#i===0?void 0:this.#s.get(t);if(d===void 0)d=this.#i===0?this.#n:this.#m.length!==0?this.#m.pop():this.#i===this.#l?this.#L(!1):this.#i,this.#r[d]=t,this.#e[d]=r,this.#s.set(t,d),this.#c[this.#n]=d,this.#f[d]=this.#n,this.#n=d,this.#i++,this.#P(d,p,c),c&&(c.set=\"add\"),u=!1;else{this.#_(d);let f=this.#e[d];if(r!==f){if(this.#S&&this.#t(f)?f.__abortController.abort(new Error(\"replaced\")):o||(this.#A&&this.#b?.(f,t,\"set\"),this.#u&&this.#a?.push([f,t,\"set\"])),this.#C(d),this.#P(d,p,c),this.#e[d]=r,c){c.set=\"replace\";let E=f&&this.#t(f)?f.__staleWhileFetching:f;E!==void 0&&(c.oldValue=E)}}else c&&(c.set=\"update\")}if(s!==0&&!this.#y&&this.#q(),this.#y&&(u||this.#k(d,s,a),c&&this.#w(c,d)),!o&&this.#u&&this.#a){let f=this.#a,E;for(;E=f?.shift();)this.#h?.(...E)}return this}pop(){try{for(;this.#i;){let t=this.#e[this.#o];if(this.#L(!0),this.#t(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#u&&this.#a){let t=this.#a,r;for(;r=t?.shift();)this.#h?.(...r)}}}#L(t){let r=this.#o,i=this.#r[r],s=this.#e[r];return this.#S&&this.#t(s)?s.__abortController.abort(new Error(\"evicted\")):(this.#A||this.#u)&&(this.#A&&this.#b?.(s,i,\"evict\"),this.#u&&this.#a?.push([s,i,\"evict\"])),this.#C(r),t&&(this.#r[r]=void 0,this.#e[r]=void 0,this.#m.push(r)),this.#i===1?(this.#o=this.#n=0,this.#m.length=0):this.#o=this.#c[r],this.#s.delete(i),this.#i--,r}has(t,r={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=r,a=this.#s.get(t);if(a!==void 0){let o=this.#e[a];if(this.#t(o)&&o.__staleWhileFetching===void 0)return!1;if(this.#d(a))s&&(s.has=\"stale\",this.#w(s,a));else return i&&this.#T(a),s&&(s.has=\"hit\",this.#w(s,a)),!0}else s&&(s.has=\"miss\");return!1}peek(t,r={}){let{allowStale:i=this.allowStale}=r,s=this.#s.get(t);if(s!==void 0&&(i||!this.#d(s))){let a=this.#e[s];return this.#t(a)?a.__staleWhileFetching:a}}#N(t,r,i,s){let a=r===void 0?void 0:this.#e[r];if(this.#t(a))return a;let o=new $t,{signal:l}=i;l?.addEventListener(\"abort\",()=>o.abort(l.reason),{signal:o.signal});let c={signal:o.signal,options:i,context:s},u=n((y,x=!1)=>{let{aborted:R}=o.signal,T=i.ignoreFetchAbort&&y!==void 0;if(i.status&&(R&&!x?(i.status.fetchAborted=!0,i.status.fetchError=o.signal.reason,T&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),R&&!T&&!x)return d(o.signal.reason);let w=E;return this.#e[r]===E&&(y===void 0?w.__staleWhileFetching?this.#e[r]=w.__staleWhileFetching:this.delete(t):(i.status&&(i.status.fetchUpdated=!0),this.set(t,y,c.options))),y},\"cb\"),p=n(y=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=y),d(y)),\"eb\"),d=n(y=>{let{aborted:x}=o.signal,R=x&&i.allowStaleOnFetchAbort,T=R||i.allowStaleOnFetchRejection,w=T||i.noDeleteOnFetchRejection,q=E;if(this.#e[r]===E&&(!w||q.__staleWhileFetching===void 0?this.delete(t):R||(this.#e[r]=q.__staleWhileFetching)),T)return i.status&&q.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),q.__staleWhileFetching;if(q.__returned===q)throw y},\"fetchFail\"),f=n((y,x)=>{let R=this.#O?.(t,a,c);R&&R instanceof Promise&&R.then(T=>y(T===void 0?void 0:T),x),o.signal.addEventListener(\"abort\",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(y(void 0),i.allowStaleOnFetchAbort&&(y=n(T=>u(T,!0),\"res\")))})},\"pcall\");i.status&&(i.status.fetchDispatched=!0);let E=new Promise(f).then(u,p),b=Object.assign(E,{__abortController:o,__staleWhileFetching:a,__returned:void 0});return r===void 0?(this.set(t,b,{...c.options,status:void 0}),r=this.#s.get(t)):this.#e[r]=b,b}#t(t){if(!this.#S)return!1;let r=t;return!!r&&r instanceof Promise&&r.hasOwnProperty(\"__staleWhileFetching\")&&r.__abortController instanceof $t}async fetch(t,r={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:a=this.noDeleteOnStaleGet,ttl:o=this.ttl,noDisposeOnSet:l=this.noDisposeOnSet,size:c=0,sizeCalculation:u=this.sizeCalculation,noUpdateTTL:p=this.noUpdateTTL,noDeleteOnFetchRejection:d=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:f=this.allowStaleOnFetchRejection,ignoreFetchAbort:E=this.ignoreFetchAbort,allowStaleOnFetchAbort:b=this.allowStaleOnFetchAbort,context:y,forceRefresh:x=!1,status:R,signal:T}=r;if(!this.#S)return R&&(R.fetch=\"get\"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:a,status:R});let w={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:a,ttl:o,noDisposeOnSet:l,size:c,sizeCalculation:u,noUpdateTTL:p,noDeleteOnFetchRejection:d,allowStaleOnFetchRejection:f,allowStaleOnFetchAbort:b,ignoreFetchAbort:E,status:R,signal:T},q=this.#s.get(t);if(q===void 0){R&&(R.fetch=\"miss\");let k=this.#N(t,q,w,y);return k.__returned=k}else{let k=this.#e[q];if(this.#t(k)){let I=i&&k.__staleWhileFetching!==void 0;return R&&(R.fetch=\"inflight\",I&&(R.returnedStale=!0)),I?k.__staleWhileFetching:k.__returned=k}let V=this.#d(q);if(!x&&!V)return R&&(R.fetch=\"hit\"),this.#_(q),s&&this.#T(q),R&&this.#w(R,q),k;let D=this.#N(t,q,w,y),_=D.__staleWhileFetching!==void 0&&i;return R&&(R.fetch=V?\"stale\":\"refresh\",_&&V&&(R.returnedStale=!0)),_?D.__staleWhileFetching:D.__returned=D}}get(t,r={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:a=this.noDeleteOnStaleGet,status:o}=r,l=this.#s.get(t);if(l!==void 0){let c=this.#e[l],u=this.#t(c);return o&&this.#w(o,l),this.#d(l)?(o&&(o.get=\"stale\"),u?(o&&i&&c.__staleWhileFetching!==void 0&&(o.returnedStale=!0),i?c.__staleWhileFetching:void 0):(a||this.delete(t),o&&i&&(o.returnedStale=!0),i?c:void 0)):(o&&(o.get=\"hit\"),u?c.__staleWhileFetching:(this.#_(l),s&&this.#T(l),c))}else o&&(o.get=\"miss\")}#H(t,r){this.#f[r]=t,this.#c[t]=r}#_(t){t!==this.#n&&(t===this.#o?this.#o=this.#c[t]:this.#H(this.#f[t],this.#c[t]),this.#H(this.#n,t),this.#n=t)}delete(t){let r=!1;if(this.#i!==0){let i=this.#s.get(t);if(i!==void 0)if(r=!0,this.#i===1)this.clear();else{this.#C(i);let s=this.#e[i];this.#t(s)?s.__abortController.abort(new Error(\"deleted\")):(this.#A||this.#u)&&(this.#A&&this.#b?.(s,t,\"delete\"),this.#u&&this.#a?.push([s,t,\"delete\"])),this.#s.delete(t),this.#r[i]=void 0,this.#e[i]=void 0,i===this.#n?this.#n=this.#f[i]:i===this.#o?this.#o=this.#c[i]:(this.#c[this.#f[i]]=this.#c[i],this.#f[this.#c[i]]=this.#f[i]),this.#i--,this.#m.push(i)}}if(this.#u&&this.#a?.length){let i=this.#a,s;for(;s=i?.shift();)this.#h?.(...s)}return r}clear(){for(let t of this.#x({allowStale:!0})){let r=this.#e[t];if(this.#t(r))r.__abortController.abort(new Error(\"deleted\"));else{let i=this.#r[t];this.#A&&this.#b?.(r,i,\"delete\"),this.#u&&this.#a?.push([r,i,\"delete\"])}}if(this.#s.clear(),this.#e.fill(void 0),this.#r.fill(void 0),this.#y&&this.#R&&(this.#y.fill(0),this.#R.fill(0)),this.#v&&this.#v.fill(0),this.#o=0,this.#n=0,this.#m.length=0,this.#g=0,this.#i=0,this.#u&&this.#a){let t=this.#a,r;for(;r=t?.shift();)this.#h?.(...r)}}};var et=class extends Bt{static{n(this,\"LRUe\")}constructor({cacheNull:t=!0,...r}){super(r),(0,ke.default)(!(\"maxAge\"in r),'Please use \"ttl\" instead of \"maxAge\"'),(0,ke.default)(\"max\"in r,'Please add a \"max\" value'),this.cacheNull=t}async memoize(t,r){(0,ke.default)(typeof r==\"function\"),this.has(t)||this.set(t,r());try{let i=await this.peek(t);return i===null&&this.cacheNull!==!0&&this.delete(t),i}catch(i){throw this.delete(t),i}}memoizeSync(t,r){if((0,ke.default)(typeof r==\"function\"),!this.has(t)){let s=r();(0,ke.default)(!(s instanceof Promise),\"Use memoize() instead\"),this.set(t,s)}let i=this.peek(t);return i===null&&this.cacheNull!==!0&&this.delete(t),i}};var ca=n(e=>{let t=new et({max:parseInt(e.uniqueTokenPerInterval||500,10),ttl:parseInt(e.interval||6e4,10)});return{check:(r,i)=>new Promise((s,a)=>{let o=t.get(i)||[0];o[0]===0&&t.set(i,o),o[0]+=1,(o[0]<=parseInt(r,10)?s:a)(o[0])})}},\"default\");var Pu=ca({interval:60*1e3,uniqueTokenPerInterval:1e3});async function ua(e){return await we(e,async({key:t,value:r},i)=>(typeof t==\"string\"&&t===Ze&&i.ignoreChilds(),typeof r==\"string\"&&(r=qt(kt(r))),{key:t,value:r}))}n(ua,\"sanitize\");async function pa(e){return await we(e,async({key:t,value:r},i)=>(typeof t==\"string\"&&t===Ze&&i.ignoreChilds(),typeof r==\"string\"&&(r=Nt(r)),{key:t,value:r}))}n(pa,\"clarify\");async function Lu({shield:e,shieldRule:t,globPattern:r,matcher:i,context:s}){let a={canAccess:!0,reason:\"\",prismaFilter:{},matcher:\"\",globPattern:\"\"};if(typeof t==\"boolean\")a.canAccess=e[i];else{if(typeof t.rule>\"u\")throw new Error(\"Badly formed shield rule.\");if(typeof t.rule==\"boolean\")a.canAccess=t.rule;else if(typeof t.rule==\"function\"){let c=t.rule(s);if(c instanceof Promise)a.canAccess=await c;else if(typeof c==\"boolean\")a.canAccess=c;else throw new Error(\"Shield rule must return a boolean.\")}else a.canAccess=!0,a.prismaFilter||(a.prismaFilter={}),a.prismaFilter=pe(a.prismaFilter,t.rule)}a.matcher=i,a.globPattern=r;let o=typeof t!=\"boolean\"&&typeof t.reason<\"u\",l=`Matcher: ${a.matcher}`;return o&&typeof t.reason==\"function\"?l=t.reason({action:s.action,model:s.model?.singular||s.action}):o&&typeof t.reason==\"string\"&&(l=t.reason),a.reason=l,a}n(Lu,\"getFieldAuthorization\");async function fa({shield:e,paths:t,context:r}){let i={canAccess:!0,reason:\"\",prismaFilter:{},matcher:\"\",globPattern:\"\"};for(let s in e){let a=[],o=s;for(let c=t.length-1;c>=0;c--){let u=t[c];if(We(u,o)){let p=e[s];a.push(Lu({shield:e,shieldRule:p,globPattern:o,matcher:s,context:r}))}}let l=await Promise.allSettled(a);for(let c=0;c<l.length;c++){let u=l[c];if(u.status===\"rejected\")throw new N(u.reason,{type:\"INTERNAL_SERVER_ERROR\"});if(i=u.value,!u.value.canAccess)break}}return i}n(fa,\"getShieldAuthorization\");function da({paths:e,context:t,fieldsMapping:r}){let i=0,s=[];if(!W(r))for(let a in r)r[a].type.toLowerCase()===\"json\"&&s.push(String(a));return e.forEach(a=>{let o=s.find(p=>a.includes(p)),l=o?o.split(\"/\").length-1:void 0,u=a.split(\"/\").filter(Boolean).slice(1,l?l+1:void 0).length;u>i&&(i=u)}),t.model===null&&(i+=1),i}n(da,\"getDepth\");async function Zr({when:e,hooks:t,prismaClient:r,QueryParams:i,result:s}){let a=Object.keys(t).filter(l=>{let c=l.split(\":\"),u=c[0],p=c[1],d=i.operation;return u===e&&We(d,p)}),o=e===\"after\"?{...i,result:s}:i;if(a.length>0)for(let l=0;l<a.length;l++){let c=a[l];Object.prototype.hasOwnProperty.call(t,c)&&(o=await t[c]({...i,...typeof s<\"u\"&&e===\"after\"&&{result:s},prismaClient:r}))}return o}n(Zr,\"runHooks\");async function ha({callerUuid:e,maxReqPerMinute:t}){let r=!1,i=-1;try{i=await Pu.check(t,e)}catch{r=!0,i=t}return{limitExceeded:r,count:i}}n(ha,\"preventDOS\");async function ma(e,t,r){if(W(e?.info?.fieldName)||Ye(e?.info?.selectionSetList)||W(e?.info?.parentTypeName)||Ye(e?.arguments))throw new N(\"Error reading required parameters from appsyncEvent.\",{type:\"INTERNAL_SERVER_ERROR\"});let i=ku({fieldName:e.info.fieldName}),s=qu({customResolvers:r,options:t,operation:i}),{identity:a,authorization:o}=Nu({appsyncEvent:e}),l=Mu({_selectionSetList:e.info.selectionSetList}),c=t.sanitize?await ua(await ga(e.arguments)):await ga(e.arguments),u=Re(c),p=Fu({action:s.action,defaultPagination:t.defaultPagination,_arguments:Re(c),_selectionSetList:e.info.selectionSetList}),d=Uu({_parentTypeName:e.info.parentTypeName}),f=Gu({operation:i,context:s,prismaArgs:p}),E=e?.request?.headers||{};return{operation:i,context:s,fields:l,args:u,prismaArgs:p,type:d,authorization:o,identity:a,paths:f,headers:E}}n(ma,\"parseEvent\");async function ga(e){return await we(e,async({key:t,value:r},i)=>{if(t===\"is\"||t===\"isNot\")r=r===\"NULL\"?null:void 0,i.ignoreChilds();else if(r&&ve(r)&&Object.keys(r).includes(\"isNull\")){let{isNull:s,...a}=r;s===!0?r={...a,equals:null}:r={...a,not:null},i.ignoreChilds()}return{key:t,value:r}})}n(ga,\"addNullables\");function Nu({appsyncEvent:e}){let t=null,r=null;if(W(e?.identity))t=\"API_KEY\",r={...e?.request?.headers&&typeof e.request.headers[\"x-api-key\"]<\"u\"&&{requestApiKey:e.request.headers[\"x-api-key\"]},...e?.request?.headers&&typeof e.request.headers[\"user-agent\"]<\"u\"&&{requestUserAgent:e.request.headers[\"user-agent\"]}};else if(e?.identity&&typeof e.identity.resolverContext<\"u\")t=\"AWS_LAMBDA\",r=e.identity;else if(e?.identity&&typeof e.identity.cognitoIdentityAuthType<\"u\"&&typeof e.identity.cognitoIdentityAuthProvider<\"u\"&&typeof e.identity.cognitoIdentityPoolId<\"u\"&&typeof e.identity.cognitoIdentityId<\"u\")t=\"AWS_IAM\",r=e.identity;else if(e?.identity&&typeof e.identity.sub<\"u\"&&typeof e.identity.issuer<\"u\"&&typeof e.identity.username<\"u\"&&typeof e.identity.claims<\"u\"&&typeof e.identity.sourceIp<\"u\")t=\"AMAZON_COGNITO_USER_POOLS\",r=e.identity;else if(e?.identity&&typeof e.identity.sub<\"u\"&&typeof e.identity.issuer<\"u\"&&typeof e.identity.claims<\"u\")t=\"OPENID_CONNECT\",r=e.identity;else throw new N(\"Couldn't detect caller identity.\",{type:\"INTERNAL_SERVER_ERROR\"});return{authorization:t,identity:r}}n(Nu,\"getAuthIdentity\");function qu({customResolvers:e,operation:t,options:r}){let i={action:\"\",alias:null,model:null};return e&&typeof e[t]<\"u\"?(i.action=t,i.alias=\"custom\",i.model=null):(i.action=Du({operation:t}),i.model=Hu({operation:t,action:i.action,options:r}),i.alias=Iu({action:i.action})),i}n(qu,\"getContext\");function ku({fieldName:e}){let t=e;if(!(t.length>0))throw new N(\"Error parsing 'operation' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});return t}n(ku,\"getOperation\");function Du({operation:e}){let r=Object.keys(Kr).sort().reverse().find(i=>e.toLowerCase().startsWith(String(i).toLowerCase()));if(!(typeof r<\"u\"&&String(r).length>0))throw new N(\"Error parsing 'action' from input event. If you are trying to query a custom resolver, make sure it is properly declared inside 'prismaAppSync.resolve({ event, resolvers: { /* HERE */ } })'.\",{type:\"INTERNAL_SERVER_ERROR\"});return r}n(Du,\"getAction\");function Iu({action:e}){let t=null;for(let r in Ne)if(Ne[r].includes(e)){t=r;break}if(!(typeof e<\"u\"&&String(e).length>0))throw new N(\"Error parsing 'actionAlias' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});return t}n(Iu,\"getActionAlias\");function Hu({operation:e,action:t,options:r}){let i=e.replace(String(t),\"\");if(!(i.length>0))throw new N(\"Error parsing 'model' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});let s=r?.modelsMapping?.[i];if(!s)throw new N(`Resolver \"${i}\" not found. If it's a custom resolver, please ensure it's available within your Lambda function.`,{type:\"INTERNAL_SERVER_ERROR\"});return s}n(Hu,\"getModel\");function Mu({_selectionSetList:e}){let t=[];return e.forEach(r=>{let i=r.split(\"/\")[0];!t.includes(i)&&!i.startsWith(\"__\")&&t.push(r)}),t}n(Mu,\"getFields\");function Uu({_parentTypeName:e}){let t=e;if(![\"Query\",\"Mutation\",\"Subscription\"].includes(t))throw new N(\"Error parsing 'type' from input event.\",{type:\"INTERNAL_SERVER_ERROR\"});return t}n(Uu,\"getType\");function Fu({action:e,defaultPagination:t,_arguments:r,_selectionSetList:i}){let s={};if(typeof r.data<\"u\"&&typeof r.operation<\"u\")throw new N(\"Using 'data' and 'operation' together is not possible.\",{type:\"BAD_USER_INPUT\"});return typeof r.data<\"u\"?s.data=r.data:typeof r.operation<\"u\"&&(s.data=r.operation),typeof r.create<\"u\"&&(s.create=r.create),typeof r.update<\"u\"&&(s.update=r.update),typeof r.where<\"u\"&&(s.where=r.where),typeof r.orderBy<\"u\"&&(s.orderBy=$u(r.orderBy)),typeof r.skipDuplicates<\"u\"&&(s.skipDuplicates=r.skipDuplicates),typeof i<\"u\"&&(s.select=zu(i)),W(s.select)&&delete s.select,typeof r.skip<\"u\"?s.skip=Number.parseInt(r.skip):t!==!1&&e===\"list\"&&(s.skip=0),typeof r.take<\"u\"?s.take=Number.parseInt(r.take):t!==!1&&e===\"list\"&&(s.take=t),s}n(Fu,\"getPrismaArgs\");function ya(e){if(Object.keys(e).length>1)throw new N(\"Wrong 'orderBy' input format.\",{type:\"BAD_USER_INPUT\"});let t=Object.keys(e)[0],r=typeof e[t]==\"object\"?ya(e[t]):e[t].toLowerCase();return{[t]:r}}n(ya,\"getOrderBy\");function $u(e){let t=[];return(Array.isArray(e)?e:[e]).forEach(i=>{t.push(ya(i))}),t}n($u,\"parseOrderBy\");function Bu(e){let t=e[0],r=e.length>1?Jr(e.splice(1)):!0;return{include:{[t]:r}}}n(Bu,\"getInclude\");function Jr(e){let t=e[0],r=e.length>1?Jr(e.splice(1)):!0;return{select:{[t]:r}}}n(Jr,\"getSelect\");function zu(e){let t={select:{}};for(let r=0;r<e.length;r++){let s=e[r].split(\"/\");s.includes(\"__typename\")||(s.length>1?t=pe(t,Bu(s)):t=pe(t,Jr(s)))}if(t.include){for(let r in t.include)typeof t.select[r]<\"u\"&&delete t.select[r];t.select=pe(t.select,t.include),delete t.include}return typeof t.select<\"u\"?t.select:{}}n(zu,\"parseSelectionList\");function Gu({operation:e,context:t,prismaArgs:r}){let i=[e,...Qn({...r?.data&&{data:r.data},...r?.select&&{select:r.select}})];return i.forEach((s,a)=>{if(s.startsWith(\"data\"))i[a]=s.replace(\"data\",e);else if(s.startsWith(\"select\")){let o=Ut.includes(t.action)?\"list\":\"get\";if(t.model!==null){let l=o===\"list\"?t.model.plural:t.model.singular;i[a]=s.replace(\"select\",`${Dt(o)}${l}`)}else i[a]=s.replace(\"select\",e)}}),Xe(i.map(s=>s.split(\"/\").filter(a=>!ra.includes(a)).join(\"/\")).filter(Boolean))}n(Gu,\"getPaths\");var ei={};ti(ei,{countQuery:()=>Qu,createManyQuery:()=>Wu,createQuery:()=>Ku,deleteManyQuery:()=>ep,deleteQuery:()=>Ju,getQuery:()=>Vu,listQuery:()=>ju,prismaQueryJoin:()=>ee,queryBuilder:()=>te,updateManyQuery:()=>Xu,updateQuery:()=>Yu,upsertQuery:()=>Zu});function ee(e,t){let r={};return t.forEach(i=>{e.forEach(s=>{s?.[i]&&(i===\"where\"?r.where?.AND?r.where.AND.push(s.where):r.where?r.where={...r.where,AND:[s.where]}:r.where=s.where:r?.[i]?r[i]=pe(r[i],s[i]):r[i]=s[i])})}),r}n(ee,\"prismaQueryJoin\");var te={prismaGet:(...e)=>ee(e,[\"where\",\"select\"]),prismaList:(...e)=>ee(e,[\"where\",\"orderBy\",\"select\",\"skip\",\"take\"]),prismaCount:(...e)=>ee(e,[\"where\",\"orderBy\",\"select\",\"skip\",\"take\"]),prismaCreate:(...e)=>ee(e,[\"data\",\"select\"]),prismaCreateMany:(...e)=>ee(e,[\"data\",\"skipDuplicates\"]),prismaUpdate:(...e)=>ee(e,[\"data\",\"where\",\"select\"]),prismaUpdateMany:(...e)=>ee(e,[\"data\",\"where\"]),prismaUpsert:(...e)=>ee(e,[\"where\",\"create\",\"update\",\"select\"]),prismaDelete:(...e)=>ee(e,[\"where\",\"select\"]),prismaDeleteMany:(...e)=>ee(e,[\"where\"])};async function Vu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].findUnique(te.prismaGet(t.prismaArgs))}n(Vu,\"getQuery\");async function ju(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].findMany(te.prismaList(t.prismaArgs))}n(ju,\"listQuery\");async function Qu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].count(te.prismaCount(t.prismaArgs))}n(Qu,\"countQuery\");async function Ku(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].create(te.prismaCreate(t.prismaArgs))}n(Ku,\"createQuery\");async function Wu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].createMany(te.prismaCreateMany(t.prismaArgs))}n(Wu,\"createManyQuery\");async function Yu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].update(te.prismaUpdate(t.prismaArgs))}n(Yu,\"updateQuery\");async function Xu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].updateMany(te.prismaUpdateMany(t.prismaArgs))}n(Xu,\"updateManyQuery\");async function Zu(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].upsert(te.prismaUpsert(t.prismaArgs))}n(Zu,\"upsertQuery\");async function Ju(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].delete(te.prismaDelete(t.prismaArgs))}n(Ju,\"deleteQuery\");async function ep(e,t){return t.context.model===null?void 0:await e[t.context.model.prismaRef].deleteMany(te.prismaDeleteMany(t.prismaArgs))}n(ep,\"deleteManyQuery\");var zt={\"modelsMapping\":{\"Users\":{\"prismaRef\":\"user\",\"singular\":\"User\",\"plural\":\"Users\"},\"User\":{\"prismaRef\":\"user\",\"singular\":\"User\",\"plural\":\"Users\"},\"Profiles\":{\"prismaRef\":\"profile\",\"singular\":\"Profile\",\"plural\":\"Profiles\"},\"Profile\":{\"prismaRef\":\"profile\",\"singular\":\"Profile\",\"plural\":\"Profiles\"},\"Posts\":{\"prismaRef\":\"post\",\"singular\":\"Post\",\"plural\":\"Posts\"},\"Post\":{\"prismaRef\":\"post\",\"singular\":\"Post\",\"plural\":\"Posts\"},\"Comments\":{\"prismaRef\":\"comment\",\"singular\":\"Comment\",\"plural\":\"Comments\"},\"Comment\":{\"prismaRef\":\"comment\",\"singular\":\"Comment\",\"plural\":\"Comments\"},\"Likes\":{\"prismaRef\":\"like\",\"singular\":\"Like\",\"plural\":\"Likes\"},\"Like\":{\"prismaRef\":\"like\",\"singular\":\"Like\",\"plural\":\"Likes\"}},\"fieldsMapping\":{\"getUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"listUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"countUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"createUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"createManyUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"updateUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"updateManyUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"upsertUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedUser/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyUsers/uuid\":{\"type\":\"String\",\"isRelation\":false},\"getUser/username\":{\"type\":\"String\",\"isRelation\":false},\"listUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"countUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"createUser/username\":{\"type\":\"String\",\"isRelation\":false},\"createManyUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"updateUser/username\":{\"type\":\"String\",\"isRelation\":false},\"updateManyUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"upsertUser/username\":{\"type\":\"String\",\"isRelation\":false},\"deleteUser/username\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedUser/username\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedUser/username\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedUser/username\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedUser/username\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedUser/username\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyUsers/username\":{\"type\":\"String\",\"isRelation\":false},\"getUser/email\":{\"type\":\"String\",\"isRelation\":false},\"listUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"countUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"createUser/email\":{\"type\":\"String\",\"isRelation\":false},\"createManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"updateUser/email\":{\"type\":\"String\",\"isRelation\":false},\"updateManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"upsertUser/email\":{\"type\":\"String\",\"isRelation\":false},\"deleteUser/email\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedUser/email\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedUser/email\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedUser/email\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedUser/email\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedUser/email\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyUsers/email\":{\"type\":\"String\",\"isRelation\":false},\"getUser/website\":{\"type\":\"String\",\"isRelation\":false},\"listUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"countUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"createUser/website\":{\"type\":\"String\",\"isRelation\":false},\"createManyUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"updateUser/website\":{\"type\":\"String\",\"isRelation\":false},\"updateManyUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"upsertUser/website\":{\"type\":\"String\",\"isRelation\":false},\"deleteUser/website\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedUser/website\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedUser/website\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedUser/website\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedUser/website\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedUser/website\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyUsers/website\":{\"type\":\"String\",\"isRelation\":false},\"getUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"listUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"countUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"createUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"createManyUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"updateUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"updateManyUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"upsertUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"deleteUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedUser/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyUsers/hiddenField\":{\"type\":\"String\",\"isRelation\":false},\"getUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"listUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"countUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"createUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"createManyUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"updateUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"updateManyUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"upsertUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"deleteUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"deleteManyUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"onCreatedUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"onUpdatedUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"onUpsertedUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"onDeletedUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"onMutatedUser/role\":{\"type\":\"Role\",\"isRelation\":false},\"onCreatedManyUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"onUpdatedManyUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"onDeletedManyUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"onMutatedManyUsers/role\":{\"type\":\"Role\",\"isRelation\":false},\"getUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"listUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"countUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"createUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"createManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"updateUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"updateManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"upsertUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"deleteUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"deleteManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onCreatedUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onUpdatedUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onUpsertedUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onDeletedUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onMutatedUser/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onCreatedManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onUpdatedManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onDeletedManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"onMutatedManyUsers/posts\":{\"type\":\"Post\",\"isRelation\":true},\"getUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"listUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"countUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"createUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"createManyUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"updateUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"updateManyUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"upsertUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"deleteUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"deleteManyUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onCreatedUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onUpdatedUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onUpsertedUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onDeletedUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onMutatedUser/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onCreatedManyUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onUpdatedManyUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onDeletedManyUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"onMutatedManyUsers/profile\":{\"type\":\"Profile\",\"isRelation\":true},\"getUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"listUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"countUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"createUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"createManyUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"updateUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"updateManyUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"upsertUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"deleteUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"deleteManyUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onCreatedUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onUpdatedUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onUpsertedUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onDeletedUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onMutatedUser/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onCreatedManyUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onUpdatedManyUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onDeletedManyUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onMutatedManyUsers/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"getProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"listProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"countProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"createProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"createManyProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"updateProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"updateManyProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"upsertProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedProfile/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyProfiles/uuid\":{\"type\":\"String\",\"isRelation\":false},\"getProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"listProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"countProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"createProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"createManyProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"updateProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"updateManyProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"upsertProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"deleteProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"deleteManyProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"onCreatedProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"onUpdatedProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"onUpsertedProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"onDeletedProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"onMutatedProfile/owner\":{\"type\":\"User\",\"isRelation\":true},\"onCreatedManyProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"onUpdatedManyProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"onDeletedManyProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"onMutatedManyProfiles/owner\":{\"type\":\"User\",\"isRelation\":true},\"getProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"listProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"countProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"createProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"createManyProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"updateProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"updateManyProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"upsertProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedProfile/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyProfiles/ownerUuid\":{\"type\":\"String\",\"isRelation\":false},\"getProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"listProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"countProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"createProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"createManyProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"updateProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"updateManyProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"upsertProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"deleteProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedProfile/bio\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyProfiles/bio\":{\"type\":\"String\",\"isRelation\":false},\"getPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"listPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"countPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"createPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"createManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"updatePost/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"upsertPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"deletePost/id\":{\"type\":\"Int\",\"isRelation\":false},\"deleteManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpsertedPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedPost/id\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedManyPosts/id\":{\"type\":\"Int\",\"isRelation\":false},\"getPost/title\":{\"type\":\"String\",\"isRelation\":false},\"listPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"countPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"createPost/title\":{\"type\":\"String\",\"isRelation\":false},\"createManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"updatePost/title\":{\"type\":\"String\",\"isRelation\":false},\"updateManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"upsertPost/title\":{\"type\":\"String\",\"isRelation\":false},\"deletePost/title\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedPost/title\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedPost/title\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedPost/title\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedPost/title\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedPost/title\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyPosts/title\":{\"type\":\"String\",\"isRelation\":false},\"getPost/author\":{\"type\":\"User\",\"isRelation\":true},\"listPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"countPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"createPost/author\":{\"type\":\"User\",\"isRelation\":true},\"createManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"updatePost/author\":{\"type\":\"User\",\"isRelation\":true},\"updateManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"upsertPost/author\":{\"type\":\"User\",\"isRelation\":true},\"deletePost/author\":{\"type\":\"User\",\"isRelation\":true},\"deleteManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"onCreatedPost/author\":{\"type\":\"User\",\"isRelation\":true},\"onUpdatedPost/author\":{\"type\":\"User\",\"isRelation\":true},\"onUpsertedPost/author\":{\"type\":\"User\",\"isRelation\":true},\"onDeletedPost/author\":{\"type\":\"User\",\"isRelation\":true},\"onMutatedPost/author\":{\"type\":\"User\",\"isRelation\":true},\"onCreatedManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"onUpdatedManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"onDeletedManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"onMutatedManyPosts/author\":{\"type\":\"User\",\"isRelation\":true},\"getPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"listPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"countPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"createPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"createManyPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"updatePost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"updateManyPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"upsertPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"deletePost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedPost/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyPosts/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"getPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"listPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"countPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"createPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"createManyPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"updatePost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"updateManyPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"upsertPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"deletePost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"deleteManyPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onCreatedPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onUpdatedPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onUpsertedPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onDeletedPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onMutatedPost/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onCreatedManyPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onUpdatedManyPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onDeletedManyPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"onMutatedManyPosts/published\":{\"type\":\"Boolean\",\"isRelation\":false},\"getPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"listPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"countPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"createPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"createManyPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"updatePost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"updateManyPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"upsertPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"deletePost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"deleteManyPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onCreatedPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onUpdatedPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onUpsertedPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onDeletedPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onMutatedPost/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onCreatedManyPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onUpdatedManyPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onDeletedManyPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"onMutatedManyPosts/comments\":{\"type\":\"Comment\",\"isRelation\":true},\"getPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"listPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"countPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"createPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"createManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"updatePost/views\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"upsertPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"deletePost/views\":{\"type\":\"Int\",\"isRelation\":false},\"deleteManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"onUpsertedPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedPost/views\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedManyPosts/views\":{\"type\":\"Int\",\"isRelation\":false},\"getPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"listPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"countPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createManyPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updatePost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updateManyPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"upsertPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"deletePost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"deleteManyPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onCreatedPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onUpdatedPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onUpsertedPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onDeletedPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onMutatedPost/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onCreatedManyPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onUpdatedManyPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onDeletedManyPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onMutatedManyPosts/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"getComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"listComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"countComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"createComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"createManyComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"upsertComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"deleteComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"deleteManyComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpsertedComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedComment/id\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedManyComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedManyComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedManyComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedManyComments/id\":{\"type\":\"Int\",\"isRelation\":false},\"getComment/author\":{\"type\":\"User\",\"isRelation\":true},\"listComments/author\":{\"type\":\"User\",\"isRelation\":true},\"countComments/author\":{\"type\":\"User\",\"isRelation\":true},\"createComment/author\":{\"type\":\"User\",\"isRelation\":true},\"createManyComments/author\":{\"type\":\"User\",\"isRelation\":true},\"updateComment/author\":{\"type\":\"User\",\"isRelation\":true},\"updateManyComments/author\":{\"type\":\"User\",\"isRelation\":true},\"upsertComment/author\":{\"type\":\"User\",\"isRelation\":true},\"deleteComment/author\":{\"type\":\"User\",\"isRelation\":true},\"deleteManyComments/author\":{\"type\":\"User\",\"isRelation\":true},\"onCreatedComment/author\":{\"type\":\"User\",\"isRelation\":true},\"onUpdatedComment/author\":{\"type\":\"User\",\"isRelation\":true},\"onUpsertedComment/author\":{\"type\":\"User\",\"isRelation\":true},\"onDeletedComment/author\":{\"type\":\"User\",\"isRelation\":true},\"onMutatedComment/author\":{\"type\":\"User\",\"isRelation\":true},\"onCreatedManyComments/author\":{\"type\":\"User\",\"isRelation\":true},\"onUpdatedManyComments/author\":{\"type\":\"User\",\"isRelation\":true},\"onDeletedManyComments/author\":{\"type\":\"User\",\"isRelation\":true},\"onMutatedManyComments/author\":{\"type\":\"User\",\"isRelation\":true},\"getComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"listComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"countComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"createComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"createManyComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"updateComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"updateManyComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"upsertComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedComment/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyComments/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"getComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"listComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"countComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"createComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"createManyComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"updateComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"updateManyComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"upsertComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"deleteComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"deleteManyComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"onCreatedComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"onUpdatedComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"onUpsertedComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"onDeletedComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"onMutatedComment/post\":{\"type\":\"Post\",\"isRelation\":true},\"onCreatedManyComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"onUpdatedManyComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"onDeletedManyComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"onMutatedManyComments/post\":{\"type\":\"Post\",\"isRelation\":true},\"getComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"listComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"countComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"createComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"createManyComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"updateComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"upsertComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"deleteComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"deleteManyComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onUpsertedComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedComment/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedManyComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedManyComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedManyComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedManyComments/postId\":{\"type\":\"Int\",\"isRelation\":false},\"getComment/message\":{\"type\":\"String\",\"isRelation\":false},\"listComments/message\":{\"type\":\"String\",\"isRelation\":false},\"countComments/message\":{\"type\":\"String\",\"isRelation\":false},\"createComment/message\":{\"type\":\"String\",\"isRelation\":false},\"createManyComments/message\":{\"type\":\"String\",\"isRelation\":false},\"updateComment/message\":{\"type\":\"String\",\"isRelation\":false},\"updateManyComments/message\":{\"type\":\"String\",\"isRelation\":false},\"upsertComment/message\":{\"type\":\"String\",\"isRelation\":false},\"deleteComment/message\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyComments/message\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedComment/message\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedComment/message\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedComment/message\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedComment/message\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedComment/message\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyComments/message\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyComments/message\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyComments/message\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyComments/message\":{\"type\":\"String\",\"isRelation\":false},\"getComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"listComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"countComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"createManyComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updateComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"updateManyComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"upsertComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"deleteComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"deleteManyComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onCreatedComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onUpdatedComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onUpsertedComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onDeletedComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onMutatedComment/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onCreatedManyComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onUpdatedManyComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onDeletedManyComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"onMutatedManyComments/lastSavedAt\":{\"type\":\"DateTime\",\"isRelation\":false},\"getLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"listLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"countLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"createLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"createManyLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"upsertLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"deleteLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"deleteManyLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpsertedLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedLike/id\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedManyLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedManyLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedManyLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedManyLikes/id\":{\"type\":\"Int\",\"isRelation\":false},\"getLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"listLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"countLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"createLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"createManyLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"updateLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"updateManyLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"upsertLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"deleteManyLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpsertedLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedLike/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onCreatedManyLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onUpdatedManyLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onDeletedManyLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"onMutatedManyLikes/authorUuid\":{\"type\":\"String\",\"isRelation\":false},\"getLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"listLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"countLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"createLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"createManyLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"updateLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"updateManyLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"upsertLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"deleteLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"deleteManyLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onUpsertedLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedLike/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onCreatedManyLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onUpdatedManyLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onDeletedManyLikes/postId\":{\"type\":\"Int\",\"isRelation\":false},\"onMutatedManyLikes/postId\":{\"type\":\"Int\",\"isRelation\":false}},\"operations\":[\"getUser\",\"listUsers\",\"countUsers\",\"createUser\",\"createManyUsers\",\"updateUser\",\"updateManyUsers\",\"upsertUser\",\"deleteUser\",\"deleteManyUsers\",\"onCreatedUser\",\"onUpdatedUser\",\"onUpsertedUser\",\"onDeletedUser\",\"onMutatedUser\",\"onCreatedManyUsers\",\"onUpdatedManyUsers\",\"onDeletedManyUsers\",\"onMutatedManyUsers\",\"getProfile\",\"listProfiles\",\"countProfiles\",\"createProfile\",\"createManyProfiles\",\"updateProfile\",\"updateManyProfiles\",\"upsertProfile\",\"deleteProfile\",\"deleteManyProfiles\",\"onCreatedProfile\",\"onUpdatedProfile\",\"onUpsertedProfile\",\"onDeletedProfile\",\"onMutatedProfile\",\"onCreatedManyProfiles\",\"onUpdatedManyProfiles\",\"onDeletedManyProfiles\",\"onMutatedManyProfiles\",\"getPost\",\"listPosts\",\"countPosts\",\"createPost\",\"createManyPosts\",\"updatePost\",\"updateManyPosts\",\"upsertPost\",\"deletePost\",\"deleteManyPosts\",\"onCreatedPost\",\"onUpdatedPost\",\"onUpsertedPost\",\"onDeletedPost\",\"onMutatedPost\",\"onCreatedManyPosts\",\"onUpdatedManyPosts\",\"onDeletedManyPosts\",\"onMutatedManyPosts\",\"getComment\",\"listComments\",\"countComments\",\"createComment\",\"createManyComments\",\"updateComment\",\"updateManyComments\",\"upsertComment\",\"deleteComment\",\"deleteManyComments\",\"onCreatedComment\",\"onUpdatedComment\",\"onUpsertedComment\",\"onDeletedComment\",\"onMutatedComment\",\"onCreatedManyComments\",\"onUpdatedManyComments\",\"onDeletedManyComments\",\"onMutatedManyComments\",\"getLike\",\"listLikes\",\"countLikes\",\"createLike\",\"createManyLikes\",\"updateLike\",\"updateManyLikes\",\"upsertLike\",\"deleteLike\",\"deleteManyLikes\",\"onCreatedLike\",\"onUpdatedLike\",\"onUpsertedLike\",\"onDeletedLike\",\"onMutatedLike\",\"onCreatedManyLikes\",\"onUpdatedManyLikes\",\"onDeletedManyLikes\",\"onMutatedManyLikes\"]}\nvar Gt=class{static{n(this,\"PrismaAppSync\")}constructor(t){if(typeof t?.connectionString<\"u\"&&(process.env.DATABASE_URL=t.connectionString),this.options={modelsMapping:{},fieldsMapping:{},connectionString:String(process.env.DATABASE_URL),sanitize:typeof t?.sanitize<\"u\"?t.sanitize:!0,logLevel:typeof t?.logLevel<\"u\"?t.logLevel:\"INFO\",defaultPagination:typeof t?.defaultPagination<\"u\"?t.defaultPagination:50,maxDepth:typeof t?.maxDepth<\"u\"?t.maxDepth:4,maxReqPerUserMinute:typeof t?.maxReqPerUserMinute<\"u\"?t.maxReqPerUserMinute:200},this.options.modelsMapping={},zt?.modelsMapping)this.options.modelsMapping=zt.modelsMapping;else if(process?.env?.PRISMA_APPSYNC_INJECTED_CONFIG)try{this.options.modelsMapping=JSON.parse(process.env.PRISMA_APPSYNC_INJECTED_CONFIG).modelsMapping}catch{}if(zt?.fieldsMapping)this.options.fieldsMapping=zt.fieldsMapping;else if(process?.env?.PRISMA_APPSYNC_INJECTED_CONFIG)try{this.options.fieldsMapping=JSON.parse(process.env.PRISMA_APPSYNC_INJECTED_CONFIG).fieldsMapping}catch{}if(Object.keys(this.options.modelsMapping).length===0)throw new N(\"Issue with auto-injected models mapping config.\",{type:\"INTERNAL_SERVER_ERROR\"});process.env.PRISMA_APPSYNC_LOG_LEVEL=this.options.logLevel;let{fieldsMapping:r,...i}=this.options;G(\"New Prisma-AppSync instance created:\",i);let s=[{emit:\"event\",level:\"query\"},{emit:\"event\",level:\"error\"},{emit:\"event\",level:\"info\"},{emit:\"event\",level:\"warn\"}];process?.env?.PRISMA_APPSYNC_TESTING===\"true\"?(global.prisma||(global.prisma=new ne.PrismaClient({log:s})),this.prismaClient=global.prisma):this.prismaClient=new ne.PrismaClient({log:s}),process?.env?.PRISMA_APPSYNC_TESTING!==\"true\"&&(this.prismaClient.$on(\"query\",a=>G(\"Prisma Client query:\",a,\"INFO\")),this.prismaClient.$on(\"info\",a=>G(\"Prisma Client info:\",a,\"INFO\")),this.prismaClient.$on(\"warn\",a=>G(\"Prisma Client warn:\",a,\"WARN\")),this.prismaClient.$on(\"error\",a=>G(\"Prisma Client error:\",a,\"ERROR\")))}async resolve(t){let r=null;try{G(\"Resolving API request w/ event (truncated):\",{arguments:t.event.arguments,identity:t.event.identity,info:Kn(t.event.info,\"selectionSetGraphQL\")});let s=await ma(t.event,this.options,t.resolvers);G(\"Parsed event:\",s);let a=s.identity?.sourceIp?.[0]||s.identity?.sourceIp||s.identity?.sub||JSON.stringify(s.identity);if(this.options.maxReqPerUserMinute&&a){let{limitExceeded:u,count:p}=await ha({callerUuid:a,maxReqPerMinute:this.options.maxReqPerUserMinute});if(u)throw new N(`Rate limit (maxReqPerUserMinute=${this.options.maxReqPerUserMinute}) exceeded for caller \"${a}\".`,{type:\"TOO_MANY_REQUESTS\"});G(`Rate limit check for caller \"${a}\" returned ${p}/${this.options.maxReqPerUserMinute} (last minute).`)}let o=da({paths:s.paths,context:s.context,fieldsMapping:this.options.fieldsMapping});if(o>this.options.maxDepth)throw new N(`Query has depth of ${o}, which exceeds max depth of ${this.options.maxDepth}.`,{type:\"FORBIDDEN\"});G(`Query has depth of ${o} (max allowed is ${this.options.maxDepth}).`);let l=t?.shield?await t.shield(s):{},c=await fa({shield:l,paths:s.paths,context:s.context});if(Object.keys(l).length===0?G(\"Query shield authorization: No Shield setup detected.\",null,\"WARN\"):G(\"Query shield authorization:\",c),!c.canAccess){let u=typeof c.reason==\"string\"?c.reason:c.reason({action:s.context.action,model:s.context.model?.singular||s.context.action});throw new N(u,{type:\"FORBIDDEN\"})}if(W(c.prismaFilter)||(G(\"QueryParams before adding Shield filters:\",s),s.prismaArgs=ee([s.prismaArgs,{where:c.prismaFilter}],[\"where\",\"data\",\"orderBy\",\"skip\",\"take\",\"skipDuplicates\",\"select\"]),G(\"QueryParams after adding Shield filters:\",s)),W(t?.hooks)||(s=await Zr({when:\"before\",hooks:t.hooks,prismaClient:this.prismaClient,QueryParams:s})),process?.env?.PRISMA_APPSYNC_TESTING===\"true\"){G(\"Resolving query for UNIT TESTS.\");let u=Ut.includes(s?.context?.action),p=n(()=>({...s.fields.reduce((d,f)=>{let E=W(s?.prismaArgs?.data?.[f])?(Math.random()+1).toString(36).substring(7):s.prismaArgs.data[f];return{...d,[f]:String(E)}},{}),[Ze]:{QueryParams:s}}),\"getTestResult\");u?r=[p(),p()]:r=p()}else{if(t?.resolvers&&typeof t.resolvers[s.operation]==\"boolean\"&&t.resolvers[s.operation]===!1)throw new N(`Query resolver for ${s.operation} is disabled.`,{type:\"FORBIDDEN\"});if(typeof t?.resolvers?.[s.operation]==\"function\"){G(`Resolving query for Custom Resolver \"${s.operation}\".`);let u=t.resolvers[s.operation];r=await u({...s,prismaClient:this.prismaClient})}else{if(W(s?.context?.model))throw new N(`Query resolver for ${s.operation} could not be found.`,{type:\"INTERNAL_SERVER_ERROR\"});G(`Resolving query for built-in CRUD operation \"${s.operation}\".`);try{r=await ei[`${s.context.action}Query`](this.prismaClient,s)}catch(u){throw u instanceof ne.Prisma.PrismaClientKnownRequestError?new N(`Prisma Client known request error${u?.code?` (code ${u.code})`:\"\"}. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientknownrequesterror`,{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientUnknownRequestError?new N(\"Prisma Client unknown request error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientunknownrequesterror\",{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientRustPanicError?new N(\"Prisma Client Rust panic error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientrustpanicerror\",{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientInitializationError?new N(`Prisma Client initialization error${u?.errorCode?` (errorCode ${u.errorCode})`:\"\"}. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientinitializationerror`,{type:\"INTERNAL_SERVER_ERROR\",cause:u}):u instanceof ne.Prisma.PrismaClientValidationError?new N(\"Prisma Client validation error. https://www.prisma.io/docs/reference/api-reference/error-reference#prismaclientvalidationerror\",{type:\"INTERNAL_SERVER_ERROR\",cause:u}):new N(u?.message?.split(`\n`)?.pop()||\"Unknown error during query.\",{type:\"INTERNAL_SERVER_ERROR\",cause:u})}}}W(t?.hooks)||(r=(await Zr({when:\"after\",hooks:t.hooks,prismaClient:this.prismaClient,QueryParams:s,result:r})).result)}catch(s){return Promise.reject(sa(s))}let i=this.options.sanitize?await pa(r):r;return G(\"Returning response to API request w/ result:\",i),i}};var tp={merge:pe,clone:Re,decode:Nt,encode:qt,dotate:jn,isMatchingGlob:We,filterXSS:kt,isEmpty:W,isUndefined:Ye,lowerFirst:Dt,isObject:ve,walk:we,replaceAll:Wn};0&&(module.exports={Authorizations,CustomError,PrismaAppSync,_,log,queryBuilder});\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/inspector.d.ts",
    "content": "import type { logLevel } from './types';\ndeclare const errorCodes: {\n    FORBIDDEN: number;\n    BAD_USER_INPUT: number;\n    INTERNAL_SERVER_ERROR: number;\n    TOO_MANY_REQUESTS: number;\n};\nexport type ErrorExtensions = {\n    type: keyof typeof errorCodes;\n    cause?: any;\n};\nexport type ErrorDetails = {\n    error: string;\n    type: ErrorExtensions['type'];\n    code: number;\n    cause?: ErrorExtensions['cause'];\n};\nexport declare class CustomError extends Error {\n    error: ErrorDetails['error'];\n    type: ErrorDetails['type'];\n    code: ErrorDetails['code'];\n    cause: ErrorDetails['cause'];\n    details: ErrorDetails;\n    constructor(message: string, extensions: ErrorExtensions);\n}\nexport declare function parseError(error: Error): CustomError;\nexport declare function log(message: string, obj?: any, level?: logLevel): void;\nexport declare function printLog(message: any, level: logLevel): void;\nexport {};\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/resolver.d.ts",
    "content": "import type { PrismaArgs, PrismaClient, PrismaOperator, QueryBuilder, QueryParams } from './types';\n/**\n *  #### Query Builder\n */\nexport declare function prismaQueryJoin<T>(queries: PrismaArgs[], operators: PrismaOperator[]): T;\nexport declare const queryBuilder: QueryBuilder;\n/**\n *  #### Query :: Find Unique\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findunique\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function getQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Query :: Find Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findmany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function listQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Query :: Count\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#count\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function countQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Create\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#create\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function createQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Create Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#createmany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function createManyQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Update\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#update\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function updateQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Update Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#updatemany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function updateManyQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Upsert\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#upsert\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function upsertQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Delete\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#delete\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function deleteQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n/**\n * #### Mutation :: Delete Many\n *\n * https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#deletemany\n * @param  {PrismaClient} prismaClient\n * @param  {QueryParams} query\n */\nexport declare function deleteManyQuery(prismaClient: PrismaClient, query: QueryParams): Promise<any>;\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/types.d.ts",
    "content": "import { Prisma, PrismaClient } from '@prisma/client';\nimport type { AppSyncIdentity, AppSyncIdentityCognito, AppSyncIdentityIAM, AppSyncIdentityLambda, AppSyncIdentityOIDC, AppSyncResolverEvent, AppSyncResolverHandler } from 'aws-lambda';\nimport type { Actions, ActionsAliases, Authorizations } from './consts';\nexport type logLevel = 'INFO' | 'WARN' | 'ERROR';\nexport type PrismaAppSyncOptionsType = {\n    connectionString?: string;\n    sanitize?: boolean;\n    logLevel?: logLevel;\n    defaultPagination?: number | false;\n    maxDepth?: number;\n    maxReqPerUserMinute?: number | false;\n};\nexport type Options = Required<PrismaAppSyncOptionsType> & {\n    modelsMapping: any;\n    fieldsMapping: any;\n};\nexport type InjectedConfig = {\n    modelsMapping?: {\n        [modelVariant: string]: {\n            prismaRef: string;\n            singular: string;\n            plural: string;\n        };\n    };\n    fieldsMapping?: {\n        [fieldPath: string]: {\n            type: string;\n            isRelation: boolean;\n        };\n    };\n    operations?: string;\n};\nexport type RuntimeConfig = {\n    modelsMapping: {\n        [modelVariant: string]: {\n            prismaRef: string;\n            singular: string;\n            plural: string;\n        };\n    };\n    fieldsMapping: {\n        [fieldPath: string]: {\n            type: string;\n            isRelation: boolean;\n        };\n    };\n    operations: string[];\n};\nexport type Action = typeof Actions[keyof typeof Actions] | string;\nexport type ActionsAlias = typeof ActionsAliases[keyof typeof ActionsAliases] | 'custom' | null;\nexport type ActionsAliasStr = keyof typeof ActionsAliases;\nexport type Context = {\n    action: Action;\n    alias: ActionsAlias;\n    model: Model;\n};\nexport type Model = {\n    prismaRef: string;\n    singular: string;\n    plural: string;\n} | null;\nexport type { AppSyncResolverHandler, AppSyncResolverEvent, AppSyncIdentity };\n/**\n * ### QueryParams\n *\n * @example\n * ```\n * {\n *     type: 'Query',\n *     operation: 'getPost',\n *     context: { action: 'get', alias: 'access', model: 'Post' },\n *     fields: ['title', 'status'],\n *     paths: ['get/post/title', 'get/post/status'],\n *     args: { where: { id: 5 } },\n *     prismaArgs: {\n *         where: { id: 5 },\n *         select: { title: true, status: true },\n *     },\n *     authorization: 'API_KEY',\n *     identity: { ... },\n * }\n * ```\n */\nexport type QueryParams<T = any> = {\n    type: GraphQLType;\n    operation: string;\n    context: Context;\n    fields: string[];\n    paths: string[];\n    args: T;\n    prismaArgs: PrismaArgs;\n    authorization: Authorization;\n    identity: Identity;\n    headers: any;\n};\nexport type Authorization = typeof Authorizations[keyof typeof Authorizations] | null;\nexport type PrismaGet = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaList = Pick<PrismaArgs, 'where' | 'orderBy' | 'select' | 'skip' | 'take'>;\nexport type PrismaCount = Pick<PrismaArgs, 'where' | 'orderBy' | 'select' | 'skip' | 'take'>;\nexport type PrismaCreate = Pick<Required<PrismaArgs>, 'data'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaCreateMany = Pick<Required<PrismaArgs>, 'data'> & Pick<PrismaArgs, 'skipDuplicates'>;\nexport type PrismaUpdate = Pick<Required<PrismaArgs>, 'data' | 'where'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaUpdateMany = Pick<Required<PrismaArgs>, 'data' | 'where'>;\nexport type PrismaUpsert = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'> & Pick<PrismaArgs, 'update'> & Pick<PrismaArgs, 'create'>;\nexport type PrismaDelete = Pick<Required<PrismaArgs>, 'where'> & Pick<PrismaArgs, 'select'>;\nexport type PrismaDeleteMany = Pick<Required<PrismaArgs>, 'where'>;\nexport type QueryBuilder = {\n    prismaGet: (...prismaArgs: PrismaArgs[]) => PrismaGet;\n    prismaList: (...prismaArgs: PrismaArgs[]) => PrismaList;\n    prismaCount: (...prismaArgs: PrismaArgs[]) => PrismaCount;\n    prismaCreate: (...prismaArgs: PrismaArgs[]) => PrismaCreate;\n    prismaCreateMany: (...prismaArgs: PrismaArgs[]) => PrismaCreateMany;\n    prismaUpdate: (...prismaArgs: PrismaArgs[]) => PrismaUpdate;\n    prismaUpdateMany: (...prismaArgs: PrismaArgs[]) => PrismaUpdateMany;\n    prismaUpsert: (...prismaArgs: PrismaArgs[]) => PrismaUpsert;\n    prismaDelete: (...prismaArgs: PrismaArgs[]) => PrismaDelete;\n    prismaDeleteMany: (...prismaArgs: PrismaArgs[]) => PrismaDeleteMany;\n};\nexport type QueryParamsCustom<T = any> = QueryParams<T> & {\n    prismaClient: PrismaClient;\n};\nexport type BeforeHookParams = QueryParams & {\n    prismaClient: PrismaClient;\n};\n/**\n * ### AfterHookParams\n *\n * @example\n * ```\n * {\n *     type: 'Query',\n *     operation: 'getPost',\n *     context: { action: 'get', alias: 'access', model: 'Post' },\n *     fields: ['title', 'status'],\n *     paths: ['get/post/title', 'get/post/status'],\n *     args: { where: { id: 5 } },\n *     prismaArgs: {\n *         where: { id: 5 },\n *         select: { title: true, status: true },\n *     },\n *     authorization: 'API_KEY',\n *     identity: { ... },\n *     result: { title: 'Hello World', status: 'PUBLISHED' }\n * }\n * ```\n */\nexport type AfterHookParams = QueryParams & {\n    prismaClient: PrismaClient;\n    result: any | any[];\n};\nexport type ShieldContext = {\n    action: Action;\n    model: string;\n};\nexport type Reason = string | ((context: ShieldContext) => string);\nexport type ShieldRule = boolean | ((context: ShieldContext) => boolean | Promise<boolean>) | any;\nexport type Shield = {\n    [matcher: string]: boolean | {\n        rule: ShieldRule;\n        reason?: Reason;\n    };\n};\nexport type HooksProps = {\n    before: BeforeHookParams;\n    after: AfterHookParams;\n};\nexport type HooksReturn = {\n    before: Promise<BeforeHookParams>;\n    after: Promise<AfterHookParams>;\n};\nexport type HookPath<Operations extends string, CustomResolvers> = Operations | CustomResolvers;\nexport type HooksParameter<HookType extends 'before' | 'after', Operations extends string, CustomResolvers extends string> = `${HookType}:${HookPath<Operations, CustomResolvers>}` | `${HookType}:**`;\nexport type HooksParameters<HookType extends 'before' | 'after', Operations extends string, CustomResolvers extends string> = {\n    [matcher in HooksParameter<HookType, Operations, CustomResolvers>]?: (props: HooksProps[HookType]) => HooksReturn[HookType];\n};\nexport type Hooks<Operations extends string, CustomResolvers extends string> = HooksParameters<'before', Operations, CustomResolvers> | HooksParameters<'after', Operations, CustomResolvers>;\nexport type ShieldAuthorization = {\n    canAccess: boolean;\n    reason: Reason;\n    prismaFilter: any;\n    matcher: string;\n    globPattern: string;\n};\nexport type ResolveParams<Operations extends string, CustomResolvers extends string> = {\n    event: AppSyncEvent;\n    resolvers?: {\n        [resolver in CustomResolvers]: ((props: QueryParamsCustom) => Promise<any>) | boolean;\n    };\n    shield?: (props: QueryParams) => Shield;\n    hooks?: Hooks<Operations, CustomResolvers>;\n};\nexport { PrismaClient, Prisma };\nexport type PrismaArgs = {\n    where?: any;\n    create?: any;\n    update?: any;\n    data?: any;\n    select?: any;\n    orderBy?: any;\n    skip?: number | undefined;\n    take?: number | undefined;\n    skipDuplicates?: boolean | undefined;\n};\nexport type PrismaOperator = keyof Required<PrismaArgs>;\nexport type AppSyncEvent = AppSyncResolverEvent<any>;\nexport type GraphQLType = 'Query' | 'Mutation' | 'Subscription';\nexport type API_KEY = null | {\n    [key: string]: any;\n};\nexport type AWS_LAMBDA = AppSyncIdentityLambda;\nexport type AWS_IAM = AppSyncIdentityIAM;\nexport type AMAZON_COGNITO_USER_POOLS = AppSyncIdentityCognito;\nexport type OPENID_CONNECT = AppSyncIdentityOIDC;\nexport type Identity = API_KEY | AWS_LAMBDA | AWS_IAM | AMAZON_COGNITO_USER_POOLS | OPENID_CONNECT;\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/client/utils.d.ts",
    "content": "/**\n * #### Deep merge objects (without mutating the target object).\n *\n * @example const newObj = merge(obj1, obj2, obj3)\n *\n * @param {any[]} sources\n * @returns any\n */\nexport declare function merge(...sources: any[]): any;\n/**\n * #### Deep clone object.\n *\n * @example const newObj = clone(sourceObj)\n *\n * @param {any} source\n * @returns any\n */\nexport declare function clone(source: any): any;\n/**\n * #### Returns decoded text, replacing HTML special characters.\n *\n * @example decode('&lt; &gt; &quot; &apos; &amp; &#169; &#8710;')\n * // returns '< > \" \\' & © ∆'\n *\n * @param {string} str\n * @returns string\n */\nexport declare function decode(str: string): string;\n/**\n * #### Returns encoded text, version of string.\n *\n * @example encode('<script>alert(\"xss\");</scr' + \"ipt>\")\n *\n * @param {string} str\n * @returns string\n */\nexport declare function encode(str: string): string;\n/**\n * #### Transform an object to a dotted-key/value pair.\n *\n * @example dotate({ data: { title: \"glut\" } })\n * // returns { 'data.title': 'glut' }\n *\n * @param {any} source\n * @returns any\n */\nexport declare function dotate(source: any): any;\n/**\n * #### Transform an object to an array of paths.\n *\n * @example objectToPaths({ data: { title: \"glut\" } })\n * // returns [ 'data', 'data/title']\n *\n * @param {any} source\n * @returns any\n */\nexport declare function objectToPaths(source: any): string[];\n/**\n * #### Return an object ommitting one to multiple keys.\n *\n * @example omit({ foo: 'foo', bar: 'bar' }, 'foo')\n * // returns { foo: 'foo' }\n *\n * @param {any} obj\n * @param {string | string[]} omitKey\n * @returns any\n */\nexport declare function omit(obj: any, omitKey: string | string[]): any;\n/**\n * #### Returns true if specified path matches any of the glob patterns.\n *\n * @example isMatchingGlob('get/post/title', ['get/post{,/**}'])\n *\n * @param {string} path\n * @param {string|string[]} globPatterns\n * @returns boolean\n */\nexport declare function isMatchingGlob(path: string, globPatterns: string | string[]): boolean;\n/**\n * #### Sanitize untrusted HTML to prevent XSS.\n *\n * @example filterXSS('<script>alert(\"xss\");</scr' + \"ipt>\")\n *\n * @param {string} str\n * @returns string\n */\nexport declare function filterXSS(str: string): string;\n/**\n * #### Return true if element is Empty.\n *\n * @example isEmpty(prismaArgs?.data?.title)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare function isEmpty(element: any): boolean;\n/**\n * #### Return true if element is Undefined.\n *\n * @example isUndefined(prismaArgs?.data?.title)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare function isUndefined(element: any): boolean;\n/**\n * #### Return true if element is an Array\n *\n * @example isArray(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare const isArray: (val: any) => val is any[];\n/**\n * #### Return string with first letter lowercase.\n *\n * @example lowerFirst(\"PostOffice\")\n * // returns 'postOffice'\n *\n * @param {string} str\n * @returns string\n */\nexport declare function lowerFirst(str: string): string;\n/**\n * #### Return string with first letter uppercase.\n *\n * @example upperFirst(\"postOffice\")\n * // returns 'PostOffice'\n *\n * @param {string} str\n * @returns string\n */\nexport declare function upperFirst(str: string): string;\n/**\n * #### Return true if element is an object\n *\n * @example isObject(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare const isObject: (val: any) => val is object;\n/**\n * #### Return true if element is a function\n *\n * @example isFunction(element)\n *\n * @param {any} element\n * @returns boolean\n */\nexport declare const isFunction: <T extends Function>(val: any) => val is T;\n/**\n * Applies a mutation function to each key and value of an object recursively.\n * Ensures immutability of the original object by returning a new, deeply-copied and mutated object.\n *\n * @param {Object} obj - Original object.\n * @param {Function} fn - Async mutator function, should return an object with potentially new key-value pair.\n * @return {Object} - A new mutated object.\n */\nexport declare function walk(jsonObj: any, fn: (arg: {\n    key: string;\n    value: any;\n}, node: WalkNode) => Promise<{\n    key: string;\n    value: any;\n}>): Promise<any>;\ndeclare class WalkNode {\n    _path: (string | number)[];\n    _ignoreChildren: boolean;\n    constructor(_path?: (string | number)[], _ignoreChildren?: boolean);\n    ignoreChilds(): void;\n    getPath(): (string | number)[];\n}\n/**\n * #### Replace all from findArray with replaceArray\n *\n * @example replaceAll('you & me', ['you','me'], ['me','you'])\n *\n * @param {string} str\n * @param {string[]} findArray\n * @param {string[]} replaceArray\n * @returns string\n */\nexport declare function replaceAll(str: string, findArray: string[], replaceArray: string[]): string;\n/**\n * #### Creates a duplicate-free version of an array\n *\n * @example uniq(['a', 'b', 'a'])\n *\n * @param {any[]} array\n * @returns any[]\n */\nexport declare function uniq<T>(array: readonly T[]): T[];\n/**\n * #### Creates a duplicate-free version of an array using iteratee\n *\n * @category Array\n */\nexport declare function uniqBy<T>(array: readonly T[], iteratee: keyof T | ((a: any) => any)): T[];\nexport {};\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/resolvers.yaml",
    "content": "- typeName: Query\n  fieldName: getUser\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: listUsers\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: countUsers\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createManyUsers\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateManyUsers\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: upsertUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteUser\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteManyUsers\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedUser\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedUser\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpsertedUser\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedUser\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedUser\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedManyUsers\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedManyUsers\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedManyUsers\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedManyUsers\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: getProfile\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: listProfiles\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: countProfiles\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createProfile\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createManyProfiles\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateProfile\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateManyProfiles\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: upsertProfile\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteProfile\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteManyProfiles\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedProfile\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedProfile\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpsertedProfile\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedProfile\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedProfile\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedManyProfiles\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedManyProfiles\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedManyProfiles\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedManyProfiles\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: getPost\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: listPosts\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: countPosts\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createPost\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createManyPosts\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updatePost\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateManyPosts\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: upsertPost\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deletePost\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteManyPosts\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedPost\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedPost\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpsertedPost\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedPost\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedPost\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedManyPosts\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedManyPosts\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedManyPosts\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedManyPosts\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: getComment\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: listComments\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: countComments\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createComment\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createManyComments\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateComment\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateManyComments\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: upsertComment\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteComment\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteManyComments\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedComment\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedComment\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpsertedComment\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedComment\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedComment\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedManyComments\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedManyComments\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedManyComments\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedManyComments\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: getLike\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: listLikes\n  dataSource: prisma-appsync\n- typeName: Query\n  fieldName: countLikes\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createLike\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: createManyLikes\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateLike\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: updateManyLikes\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: upsertLike\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteLike\n  dataSource: prisma-appsync\n- typeName: Mutation\n  fieldName: deleteManyLikes\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedLike\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedLike\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpsertedLike\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedLike\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedLike\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onCreatedManyLikes\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onUpdatedManyLikes\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onDeletedManyLikes\n  dataSource: prisma-appsync\n- typeName: Subscription\n  fieldName: onMutatedManyLikes\n  dataSource: prisma-appsync\n"
  },
  {
    "path": "tests/generator/schemas/generated/crud/schema.gql",
    "content": "type BatchPayload {\n    count: Int!\n}\n\ntype User {\n    uuid: String!\n    username: String!\n    email: AWSEmail!\n    website: String\n    hiddenField: String\n    role: Role\n    posts: [Post!]!\n    profile: Profile\n    comments: [Comment!]!\n}\n\ntype Profile {\n    uuid: String!\n    owner: User\n    ownerUuid: String\n    bio: String\n}\n\ntype Post {\n    id: Int!\n    title: String!\n    author: User\n    authorUuid: String\n    published: Boolean\n    comments: [Comment!]!\n    views: Int\n    lastSavedAt: AWSDateTime\n}\n\ntype Comment {\n    id: Int!\n    author: User\n    authorUuid: String\n    post: Post!\n    postId: Int!\n    message: String!\n    lastSavedAt: AWSDateTime\n}\n\ntype Like {\n    id: Int!\n    authorUuid: String!\n    postId: Int!\n}\n\nenum OrderByArg {\n    ASC\n    DESC\n}\n\nenum NullArg {\n    NULL\n}\n\nenum Role {\n    USER\n    ADMIN\n}\n\ninput IntOperation {\n    set: Int\n    increment: Int\n    decrement: Int\n    multiply: Int\n    divide: Int\n}\n\ninput FloatOperation {\n    set: Float\n    increment: Float\n    decrement: Float\n    multiply: Float\n    divide: Float\n}\n\ninput AWSDateTimeFilter {\n    equals: AWSDateTime\n    gt: AWSDateTime\n    gte: AWSDateTime\n    in: [AWSDateTime!]\n    lt: AWSDateTime\n    lte: AWSDateTime\n    not: AWSDateTimeFilter\n    notIn: [AWSDateTime!]\n}\n\ninput AWSDateTimeNullableFilter {\n    equals: AWSDateTime\n    gt: AWSDateTime\n    gte: AWSDateTime\n    in: [AWSDateTime!]\n    lt: AWSDateTime\n    lte: AWSDateTime\n    not: AWSDateTimeFilter\n    notIn: [AWSDateTime!]\n    isNull: Boolean\n}\n\ninput AWSDateTimeListFilter {\n    equals: [AWSDateTime!]\n    has: AWSDateTime\n    hasEvery: [AWSDateTime!]\n    hasSome: [AWSDateTime!]\n    isEmpty: Boolean\n}\n\ninput AWSDateFilter {\n    equals: AWSDate\n    gt: AWSDate\n    gte: AWSDate\n    in: [AWSDate!]\n    lt: AWSDate\n    lte: AWSDate\n    not: AWSDateFilter\n    notIn: [AWSDate!]\n}\n\ninput AWSDateNullableFilter {\n    equals: AWSDate\n    gt: AWSDate\n    gte: AWSDate\n    in: [AWSDate!]\n    lt: AWSDate\n    lte: AWSDate\n    not: AWSDateFilter\n    notIn: [AWSDate!]\n    isNull: Boolean\n}\n\ninput AWSDateListFilter {\n    equals: [AWSDate!]\n    has: AWSDate\n    hasEvery: [AWSDate!]\n    hasSome: [AWSDate!]\n    isEmpty: Boolean\n}\n\ninput FloatFilter {\n    equals: Float\n    gt: Float\n    gte: Float\n    in: [Float!]\n    lt: Float\n    lte: Float\n    not: FloatFilter\n    notIn: [Float!]\n    isNull: Boolean\n}\n\ninput FloatNullableFilter {\n    equals: Float\n    gt: Float\n    gte: Float\n    in: [Float!]\n    lt: Float\n    lte: Float\n    not: FloatFilter\n    notIn: [Float!]\n    isNull: Boolean\n}\n\ninput FloatListFilter {\n    equals: [Float!]\n    has: Float\n    hasEvery: [Float!]\n    hasSome: [Float!]\n    isEmpty: Boolean\n}\n\ninput IntFilter {\n    equals: Int\n    gt: Int\n    gte: Int\n    in: [Int!]\n    lt: Int\n    lte: Int\n    not: IntFilter\n    notIn: [Int!]\n}\n\ninput IntNullableFilter {\n    equals: Int\n    gt: Int\n    gte: Int\n    in: [Int!]\n    lt: Int\n    lte: Int\n    not: IntFilter\n    notIn: [Int!]\n    isNull: Boolean\n}\n\ninput IntListFilter {\n    equals: [Int!]\n    has: Int\n    hasEvery: [Int!]\n    hasSome: [Int!]\n    isEmpty: Boolean\n}\n\ninput AWSJSONFilter {\n    contains: String\n    endsWith: String\n    equals: AWSJSON\n    in: [AWSJSON!]\n    not: AWSJSONFilter\n    notIn: [AWSJSON!]\n    startsWith: String\n}\n\ninput AWSJSONNullableFilter {\n    contains: String\n    endsWith: String\n    equals: AWSJSON\n    in: [AWSJSON!]\n    not: AWSJSONFilter\n    notIn: [AWSJSON!]\n    startsWith: String\n    isNull: Boolean\n}\n\ninput AWSJSONListFilter {\n    equals: [AWSJSON!]\n    has: AWSJSON\n    hasEvery: [AWSJSON!]\n    hasSome: [AWSJSON!]\n    isEmpty: Boolean\n}\n\ninput AWSEmailFilter {\n    contains: String\n    endsWith: String\n    equals: AWSEmail\n    in: [AWSEmail!]\n    not: AWSEmailFilter\n    notIn: [AWSEmail!]\n    startsWith: String\n}\n\ninput AWSEmailNullableFilter {\n    contains: String\n    endsWith: String\n    equals: AWSEmail\n    in: [AWSEmail!]\n    not: AWSEmailFilter\n    notIn: [AWSEmail!]\n    startsWith: String\n    isNull: Boolean\n}\n\ninput AWSEmailListFilter {\n    equals: [AWSEmail!]\n    has: AWSEmail\n    hasEvery: [AWSEmail!]\n    hasSome: [AWSEmail!]\n    isEmpty: Boolean\n}\n\ninput AWSURLFilter {\n    contains: String\n    endsWith: String\n    equals: AWSURL\n    in: [AWSURL!]\n    not: AWSURLFilter\n    notIn: [AWSURL!]\n    startsWith: String\n}\n\ninput AWSURLNullableFilter {\n    contains: String\n    endsWith: String\n    equals: AWSURL\n    in: [AWSURL!]\n    not: AWSURLFilter\n    notIn: [AWSURL!]\n    startsWith: String\n    isNull: Boolean\n}\n\ninput AWSURLListFilter {\n    equals: [AWSURL!]\n    has: AWSURL\n    hasEvery: [AWSURL!]\n    hasSome: [AWSURL!]\n    isEmpty: Boolean\n}\n\ninput StringFilter {\n    contains: String\n    endsWith: String\n    equals: String\n    in: [String!]\n    not: StringFilter\n    notIn: [String!]\n    startsWith: String\n    mode: String\n}\n\ninput StringNullableFilter {\n    contains: String\n    endsWith: String\n    equals: String\n    in: [String!]\n    not: StringFilter\n    notIn: [String!]\n    startsWith: String\n    mode: String\n    isNull: Boolean\n}\n\ninput StringListFilter {\n    equals: [String!]\n    has: String\n    hasEvery: [String!]\n    hasSome: [String!]\n    isEmpty: Boolean\n}\n\ninput BooleanFilter {\n    equals: Boolean\n    not: BooleanFilter\n}\n\ninput BooleanNullableFilter {\n    equals: Boolean\n    not: BooleanFilter\n    isNull: Boolean\n}\n\ninput BooleanListFilter {\n    equals: [Boolean!]\n    has: Boolean\n    hasEvery: [Boolean!]\n    hasSome: [Boolean!]\n}\n\ninput RoleEnumFilter {\n    equals: Role\n    in: [Role!]\n    not: RoleEnumFilter\n    notIn: [Role!]\n}\n\ninput RoleEnumListFilter {\n    equals: [Role!]\n    has: Role\n    hasEvery: [Role!]\n    hasSome: [Role!]\n    isEmpty: Boolean\n}\n\ninput UserFilter {\n    some: UserWhereInputWithoutNullables\n    every: UserWhereInputWithoutNullables\n    none: UserWhereInputWithoutNullables\n}\n\ninput UserWhereInputWithoutNullables {\n    OR: [UserWhereInput!]\n    NOT: [UserWhereInput!]\n    AND: [UserWhereInput!]\n    uuid: StringFilter\n    username: StringFilter\n    email: AWSEmailFilter\n    website: StringNullableFilter\n    hiddenField: StringNullableFilter\n    role: RoleEnumFilter\n    posts: PostFilter\n    profile: ProfileWhereInput\n    comments: CommentFilter\n}\n\ninput UserWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [UserWhereInput!]\n    NOT: [UserWhereInput!]\n    AND: [UserWhereInput!]\n    uuid: StringFilter\n    username: StringFilter\n    email: AWSEmailFilter\n    website: StringNullableFilter\n    hiddenField: StringNullableFilter\n    role: RoleEnumFilter\n    posts: PostFilter\n    profile: ProfileWhereInput\n    comments: CommentFilter\n}\n\ninput UserScalarWhereInput {\n    OR: [UserScalarWhereInput!]\n    NOT: [UserScalarWhereInput!]\n    AND: [UserScalarWhereInput!]\n    uuid: StringFilter\n    username: StringFilter\n    email: AWSEmailFilter\n    website: StringNullableFilter\n    hiddenField: StringNullableFilter\n    role: RoleEnumFilter\n}\n\ninput UserWhereUniqueInput {\n    uuid: String\n    username: String\n    email: AWSEmail\n}\n\ninput UserExtendedWhereUniqueInput {\n    OR: [UserWhereInput!]\n    NOT: [UserWhereInput!]\n    AND: [UserWhereInput!]\n    uuid: String\n    username: String\n    email: AWSEmail\n    website: StringNullableFilter\n    hiddenField: StringNullableFilter\n    role: RoleEnumFilter\n    posts: PostFilter\n    profile: ProfileWhereInput\n    comments: CommentFilter\n}\n\ninput UserOrderByInput {\n    uuid: OrderByArg\n    username: OrderByArg\n    email: OrderByArg\n    website: OrderByArg\n    hiddenField: OrderByArg\n    role: OrderByArg\n    posts: PostOrderByInput\n    profile: ProfileOrderByInput\n    comments: CommentOrderByInput\n}\n\ninput UserPostsCreateNestedInput {\n    connect: [PostWhereUniqueInput!]\n    create: [PostCreateWithoutUserInput!]\n    connectOrCreate: [PostConnectOrCreateWithoutUserInput!]\n}\n\ninput UserProfileCreateNestedInput {\n    connect: ProfileWhereUniqueInput\n    create: ProfileCreateWithoutUserInput\n    connectOrCreate: ProfileConnectOrCreateWithoutUserInput\n}\n\ninput UserCommentsCreateNestedInput {\n    connect: [CommentWhereUniqueInput!]\n    create: [CommentCreateWithoutUserInput!]\n    connectOrCreate: [CommentConnectOrCreateWithoutUserInput!]\n}\n\ninput UserPostsUpdateNestedInput {\n    connect: [PostWhereUniqueInput!]\n    disconnect: [PostExtendedWhereUniqueInput!]\n    set: [PostWhereUniqueInput!]\n    create: [PostCreateWithoutUserInput!]\n    connectOrCreate: [PostConnectOrCreateWithoutUserInput!]\n    update: [PostUpdateWithWhereUniqueWithoutUserInput!]\n    upsert: [PostUpsertWithWhereUniqueWithoutUserInput!]\n    delete: [PostExtendedWhereUniqueInput!]\n    deleteMany: [PostScalarWhereInput!]\n    updateMany: [PostUpdateManyInput!]\n}\n\ninput UserProfileUpdateNestedInput {\n    connect: ProfileWhereUniqueInput\n    disconnect: Boolean\n    create: ProfileCreateWithoutUserInput\n    connectOrCreate: ProfileConnectOrCreateWithoutUserInput\n    update: ProfileUpdateWithoutUserInput\n    upsert: ProfileUpsertWithoutUserInput\n    delete: Boolean\n}\n\ninput UserCommentsUpdateNestedInput {\n    connect: [CommentWhereUniqueInput!]\n    disconnect: [CommentExtendedWhereUniqueInput!]\n    set: [CommentWhereUniqueInput!]\n    create: [CommentCreateWithoutUserInput!]\n    connectOrCreate: [CommentConnectOrCreateWithoutUserInput!]\n    update: [CommentUpdateWithWhereUniqueWithoutUserInput!]\n    upsert: [CommentUpsertWithWhereUniqueWithoutUserInput!]\n    delete: [CommentExtendedWhereUniqueInput!]\n    deleteMany: [CommentScalarWhereInput!]\n    updateMany: [CommentUpdateManyInput!]\n}\n\ninput UserCreateInput {\n    uuid: String\n    username: String!\n    email: AWSEmail!\n    website: String\n    hiddenField: String\n    role: Role = USER\n    posts: UserPostsCreateNestedInput\n    profile: UserProfileCreateNestedInput\n    comments: UserCommentsCreateNestedInput\n}\n\ninput UserCreateWithoutPostInput {\n    uuid: String\n    username: String!\n    email: AWSEmail!\n    website: String\n    hiddenField: String\n    role: Role = USER\n    profile: UserProfileCreateNestedInput\n    comments: UserCommentsCreateNestedInput\n}\n\ninput UserCreateWithoutProfileInput {\n    uuid: String\n    username: String!\n    email: AWSEmail!\n    website: String\n    hiddenField: String\n    role: Role = USER\n    posts: UserPostsCreateNestedInput\n    comments: UserCommentsCreateNestedInput\n}\n\ninput UserCreateWithoutCommentInput {\n    uuid: String\n    username: String!\n    email: AWSEmail!\n    website: String\n    hiddenField: String\n    role: Role = USER\n    posts: UserPostsCreateNestedInput\n    profile: UserProfileCreateNestedInput\n}\n\ninput UserConnectOrCreateWithoutPostInput {\n    where: UserWhereUniqueInput!\n    create: UserCreateWithoutPostInput!\n}\n\ninput UserConnectOrCreateWithoutProfileInput {\n    where: UserWhereUniqueInput!\n    create: UserCreateWithoutProfileInput!\n}\n\ninput UserConnectOrCreateWithoutCommentInput {\n    where: UserWhereUniqueInput!\n    create: UserCreateWithoutCommentInput!\n}\n\ninput UserCreateManyInput {\n    uuid: String\n    username: String!\n    email: AWSEmail!\n    website: String\n    hiddenField: String\n    role: Role = USER\n}\n\ninput UserUpdateInput {\n    uuid: String\n    username: String\n    email: AWSEmail\n    website: String\n    hiddenField: String\n    role: Role\n    posts: UserPostsUpdateNestedInput\n    profile: UserProfileUpdateNestedInput\n    comments: UserCommentsUpdateNestedInput\n}\n\ninput UserUpdateWithoutPostInput {\n    uuid: String\n    username: String\n    email: AWSEmail\n    website: String\n    hiddenField: String\n    role: Role\n    profile: UserProfileUpdateNestedInput\n    comments: UserCommentsUpdateNestedInput\n}\n\ninput UserUpdateWithoutProfileInput {\n    uuid: String\n    username: String\n    email: AWSEmail\n    website: String\n    hiddenField: String\n    role: Role\n    posts: UserPostsUpdateNestedInput\n    comments: UserCommentsUpdateNestedInput\n}\n\ninput UserUpdateWithoutCommentInput {\n    uuid: String\n    username: String\n    email: AWSEmail\n    website: String\n    hiddenField: String\n    role: Role\n    posts: UserPostsUpdateNestedInput\n    profile: UserProfileUpdateNestedInput\n}\n\ninput UserUpdateWithWhereUniqueWithoutPostInput {\n    data: UserUpdateWithoutPostInput!\n    where: UserExtendedWhereUniqueInput!\n}\n\ninput UserUpdateWithWhereUniqueWithoutProfileInput {\n    data: UserUpdateWithoutProfileInput!\n    where: UserExtendedWhereUniqueInput!\n}\n\ninput UserUpdateWithWhereUniqueWithoutCommentInput {\n    data: UserUpdateWithoutCommentInput!\n    where: UserExtendedWhereUniqueInput!\n}\n\ninput UserUpdateManyInput {\n    where: UserScalarWhereInput!\n    data: UserUpdateInput!\n}\n\ninput UserUpsertWithoutPostInput {\n    create: UserCreateWithoutPostInput!\n    update: UserUpdateWithoutPostInput!\n}\n\ninput UserUpsertWithoutProfileInput {\n    create: UserCreateWithoutProfileInput!\n    update: UserUpdateWithoutProfileInput!\n}\n\ninput UserUpsertWithoutCommentInput {\n    create: UserCreateWithoutCommentInput!\n    update: UserUpdateWithoutCommentInput!\n}\n\ninput UserUpsertWithWhereUniqueWithoutPostInput {\n    where: UserExtendedWhereUniqueInput!\n    create: UserCreateWithoutPostInput!\n    update: UserUpdateWithoutPostInput!\n}\n\ninput UserUpsertWithWhereUniqueWithoutProfileInput {\n    where: UserExtendedWhereUniqueInput!\n    create: UserCreateWithoutProfileInput!\n    update: UserUpdateWithoutProfileInput!\n}\n\ninput UserUpsertWithWhereUniqueWithoutCommentInput {\n    where: UserExtendedWhereUniqueInput!\n    create: UserCreateWithoutCommentInput!\n    update: UserUpdateWithoutCommentInput!\n}\n\ninput ProfileFilter {\n    some: ProfileWhereInputWithoutNullables\n    every: ProfileWhereInputWithoutNullables\n    none: ProfileWhereInputWithoutNullables\n}\n\ninput ProfileWhereInputWithoutNullables {\n    OR: [ProfileWhereInput!]\n    NOT: [ProfileWhereInput!]\n    AND: [ProfileWhereInput!]\n    uuid: StringFilter\n    owner: UserWhereInput\n    ownerUuid: StringNullableFilter\n    bio: StringNullableFilter\n}\n\ninput ProfileWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [ProfileWhereInput!]\n    NOT: [ProfileWhereInput!]\n    AND: [ProfileWhereInput!]\n    uuid: StringFilter\n    owner: UserWhereInput\n    ownerUuid: StringNullableFilter\n    bio: StringNullableFilter\n}\n\ninput ProfileScalarWhereInput {\n    OR: [ProfileScalarWhereInput!]\n    NOT: [ProfileScalarWhereInput!]\n    AND: [ProfileScalarWhereInput!]\n    uuid: StringFilter\n    ownerUuid: StringNullableFilter\n    bio: StringNullableFilter\n}\n\ninput ProfileWhereUniqueInput {\n    uuid: String\n    ownerUuid: String\n}\n\ninput ProfileExtendedWhereUniqueInput {\n    OR: [ProfileWhereInput!]\n    NOT: [ProfileWhereInput!]\n    AND: [ProfileWhereInput!]\n    uuid: String\n    ownerUuid: String\n    owner: UserWhereInput\n    bio: StringNullableFilter\n}\n\ninput ProfileOrderByInput {\n    uuid: OrderByArg\n    owner: UserOrderByInput\n    ownerUuid: OrderByArg\n    bio: OrderByArg\n}\n\ninput ProfileOwnerCreateNestedInput {\n    connect: UserWhereUniqueInput\n    create: UserCreateWithoutProfileInput\n    connectOrCreate: UserConnectOrCreateWithoutProfileInput\n}\n\ninput ProfileOwnerUpdateNestedInput {\n    connect: UserWhereUniqueInput\n    disconnect: Boolean\n    create: UserCreateWithoutProfileInput\n    connectOrCreate: UserConnectOrCreateWithoutProfileInput\n    update: UserUpdateWithoutProfileInput\n    upsert: UserUpsertWithoutProfileInput\n    delete: Boolean\n}\n\ninput ProfileCreateInput {\n    uuid: String\n    owner: ProfileOwnerCreateNestedInput\n    bio: String\n}\n\ninput ProfileCreateWithoutUserInput {\n    uuid: String\n    bio: String\n}\n\ninput ProfileConnectOrCreateWithoutUserInput {\n    where: ProfileWhereUniqueInput!\n    create: ProfileCreateWithoutUserInput!\n}\n\ninput ProfileCreateManyInput {\n    uuid: String\n    bio: String\n}\n\ninput ProfileUpdateInput {\n    uuid: String\n    owner: ProfileOwnerUpdateNestedInput\n    bio: String\n}\n\ninput ProfileUpdateWithoutUserInput {\n    uuid: String\n    bio: String\n}\n\ninput ProfileUpdateWithWhereUniqueWithoutUserInput {\n    data: ProfileUpdateWithoutUserInput!\n    where: ProfileExtendedWhereUniqueInput!\n}\n\ninput ProfileUpdateManyInput {\n    where: ProfileScalarWhereInput!\n    data: ProfileUpdateInput!\n}\n\ninput ProfileUpsertWithoutUserInput {\n    create: ProfileCreateWithoutUserInput!\n    update: ProfileUpdateWithoutUserInput!\n}\n\ninput ProfileUpsertWithWhereUniqueWithoutUserInput {\n    where: ProfileExtendedWhereUniqueInput!\n    create: ProfileCreateWithoutUserInput!\n    update: ProfileUpdateWithoutUserInput!\n}\n\ninput PostFilter {\n    some: PostWhereInputWithoutNullables\n    every: PostWhereInputWithoutNullables\n    none: PostWhereInputWithoutNullables\n}\n\ninput PostWhereInputWithoutNullables {\n    OR: [PostWhereInput!]\n    NOT: [PostWhereInput!]\n    AND: [PostWhereInput!]\n    id: IntFilter\n    title: StringFilter\n    author: UserWhereInput\n    authorUuid: StringNullableFilter\n    published: BooleanNullableFilter\n    comments: CommentFilter\n    views: IntNullableFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput PostWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [PostWhereInput!]\n    NOT: [PostWhereInput!]\n    AND: [PostWhereInput!]\n    id: IntFilter\n    title: StringFilter\n    author: UserWhereInput\n    authorUuid: StringNullableFilter\n    published: BooleanNullableFilter\n    comments: CommentFilter\n    views: IntNullableFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput PostScalarWhereInput {\n    OR: [PostScalarWhereInput!]\n    NOT: [PostScalarWhereInput!]\n    AND: [PostScalarWhereInput!]\n    id: IntFilter\n    title: StringFilter\n    authorUuid: StringNullableFilter\n    published: BooleanNullableFilter\n    views: IntNullableFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput PostWhereUniqueInput {\n    id: Int\n}\n\ninput PostExtendedWhereUniqueInput {\n    OR: [PostWhereInput!]\n    NOT: [PostWhereInput!]\n    AND: [PostWhereInput!]\n    id: Int\n    title: StringFilter\n    author: UserWhereInput\n    authorUuid: StringNullableFilter\n    published: BooleanNullableFilter\n    comments: CommentFilter\n    views: IntNullableFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput PostOrderByInput {\n    id: OrderByArg\n    title: OrderByArg\n    author: UserOrderByInput\n    authorUuid: OrderByArg\n    published: OrderByArg\n    comments: CommentOrderByInput\n    views: OrderByArg\n    lastSavedAt: OrderByArg\n}\n\ninput PostAuthorCreateNestedInput {\n    connect: UserWhereUniqueInput\n    create: UserCreateWithoutPostInput\n    connectOrCreate: UserConnectOrCreateWithoutPostInput\n}\n\ninput PostCommentsCreateNestedInput {\n    connect: [CommentWhereUniqueInput!]\n    create: [CommentCreateWithoutPostInput!]\n    connectOrCreate: [CommentConnectOrCreateWithoutPostInput!]\n}\n\ninput PostAuthorUpdateNestedInput {\n    connect: UserWhereUniqueInput\n    disconnect: Boolean\n    create: UserCreateWithoutPostInput\n    connectOrCreate: UserConnectOrCreateWithoutPostInput\n    update: UserUpdateWithoutPostInput\n    upsert: UserUpsertWithoutPostInput\n    delete: Boolean\n}\n\ninput PostCommentsUpdateNestedInput {\n    connect: [CommentWhereUniqueInput!]\n    disconnect: [CommentExtendedWhereUniqueInput!]\n    set: [CommentWhereUniqueInput!]\n    create: [CommentCreateWithoutPostInput!]\n    connectOrCreate: [CommentConnectOrCreateWithoutPostInput!]\n    update: [CommentUpdateWithWhereUniqueWithoutPostInput!]\n    upsert: [CommentUpsertWithWhereUniqueWithoutPostInput!]\n    delete: [CommentExtendedWhereUniqueInput!]\n    deleteMany: [CommentScalarWhereInput!]\n    updateMany: [CommentUpdateManyInput!]\n}\n\ninput PostCreateInput {\n    id: Int\n    title: String!\n    author: PostAuthorCreateNestedInput\n    published: Boolean = false\n    comments: PostCommentsCreateNestedInput\n    views: Int = 0\n    lastSavedAt: AWSDateTime\n}\n\ninput PostCreateWithoutUserInput {\n    id: Int\n    title: String!\n    published: Boolean = false\n    comments: PostCommentsCreateNestedInput\n    views: Int = 0\n    lastSavedAt: AWSDateTime\n}\n\ninput PostCreateWithoutCommentInput {\n    id: Int\n    title: String!\n    author: PostAuthorCreateNestedInput\n    authorUuid: String\n    published: Boolean = false\n    views: Int = 0\n    lastSavedAt: AWSDateTime\n}\n\ninput PostConnectOrCreateWithoutUserInput {\n    where: PostWhereUniqueInput!\n    create: PostCreateWithoutUserInput!\n}\n\ninput PostConnectOrCreateWithoutCommentInput {\n    where: PostWhereUniqueInput!\n    create: PostCreateWithoutCommentInput!\n}\n\ninput PostCreateManyInput {\n    id: Int\n    title: String!\n    published: Boolean = false\n    views: Int = 0\n    lastSavedAt: AWSDateTime\n}\n\ninput PostUpdateInput {\n    id: Int\n    title: String\n    author: PostAuthorUpdateNestedInput\n    published: Boolean\n    comments: PostCommentsUpdateNestedInput\n    views: Int\n    lastSavedAt: AWSDateTime\n}\n\ninput PostUpdateWithoutUserInput {\n    id: Int\n    title: String\n    published: Boolean\n    comments: PostCommentsUpdateNestedInput\n    views: Int\n    lastSavedAt: AWSDateTime\n}\n\ninput PostUpdateWithoutCommentInput {\n    id: Int\n    title: String\n    author: PostAuthorUpdateNestedInput\n    authorUuid: String\n    published: Boolean\n    views: Int\n    lastSavedAt: AWSDateTime\n}\n\ninput PostUpdateWithWhereUniqueWithoutUserInput {\n    data: PostUpdateWithoutUserInput!\n    where: PostExtendedWhereUniqueInput!\n}\n\ninput PostUpdateWithWhereUniqueWithoutCommentInput {\n    data: PostUpdateWithoutCommentInput!\n    where: PostExtendedWhereUniqueInput!\n}\n\ninput PostOperationInput {\n    views: IntOperation\n}\n\ninput PostUpdateManyInput {\n    where: PostScalarWhereInput!\n    data: PostUpdateInput!\n}\n\ninput PostUpsertWithoutUserInput {\n    create: PostCreateWithoutUserInput!\n    update: PostUpdateWithoutUserInput!\n}\n\ninput PostUpsertWithoutCommentInput {\n    create: PostCreateWithoutCommentInput!\n    update: PostUpdateWithoutCommentInput!\n}\n\ninput PostUpsertWithWhereUniqueWithoutUserInput {\n    where: PostExtendedWhereUniqueInput!\n    create: PostCreateWithoutUserInput!\n    update: PostUpdateWithoutUserInput!\n}\n\ninput PostUpsertWithWhereUniqueWithoutCommentInput {\n    where: PostExtendedWhereUniqueInput!\n    create: PostCreateWithoutCommentInput!\n    update: PostUpdateWithoutCommentInput!\n}\n\ninput CommentFilter {\n    some: CommentWhereInputWithoutNullables\n    every: CommentWhereInputWithoutNullables\n    none: CommentWhereInputWithoutNullables\n}\n\ninput CommentWhereInputWithoutNullables {\n    OR: [CommentWhereInput!]\n    NOT: [CommentWhereInput!]\n    AND: [CommentWhereInput!]\n    id: IntFilter\n    author: UserWhereInput\n    authorUuid: StringNullableFilter\n    post: PostWhereInput\n    postId: IntFilter\n    message: StringFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput CommentWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [CommentWhereInput!]\n    NOT: [CommentWhereInput!]\n    AND: [CommentWhereInput!]\n    id: IntFilter\n    author: UserWhereInput\n    authorUuid: StringNullableFilter\n    post: PostWhereInput\n    postId: IntFilter\n    message: StringFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput CommentScalarWhereInput {\n    OR: [CommentScalarWhereInput!]\n    NOT: [CommentScalarWhereInput!]\n    AND: [CommentScalarWhereInput!]\n    id: IntFilter\n    authorUuid: StringNullableFilter\n    postId: IntFilter\n    message: StringFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput CommentWhereUniqueInput {\n    id: Int\n}\n\ninput CommentExtendedWhereUniqueInput {\n    OR: [CommentWhereInput!]\n    NOT: [CommentWhereInput!]\n    AND: [CommentWhereInput!]\n    id: Int\n    author: UserWhereInput\n    authorUuid: StringNullableFilter\n    post: PostWhereInput\n    postId: IntFilter\n    message: StringFilter\n    lastSavedAt: AWSDateTimeNullableFilter\n}\n\ninput CommentOrderByInput {\n    id: OrderByArg\n    author: UserOrderByInput\n    authorUuid: OrderByArg\n    post: PostOrderByInput\n    postId: OrderByArg\n    message: OrderByArg\n    lastSavedAt: OrderByArg\n}\n\ninput CommentAuthorCreateNestedInput {\n    connect: UserWhereUniqueInput\n    create: UserCreateWithoutCommentInput\n    connectOrCreate: UserConnectOrCreateWithoutCommentInput\n}\n\ninput CommentPostCreateNestedInput {\n    connect: PostWhereUniqueInput\n    create: PostCreateWithoutCommentInput\n    connectOrCreate: PostConnectOrCreateWithoutCommentInput\n}\n\ninput CommentAuthorUpdateNestedInput {\n    connect: UserWhereUniqueInput\n    disconnect: Boolean\n    create: UserCreateWithoutCommentInput\n    connectOrCreate: UserConnectOrCreateWithoutCommentInput\n    update: UserUpdateWithoutCommentInput\n    upsert: UserUpsertWithoutCommentInput\n    delete: Boolean\n}\n\ninput CommentPostUpdateNestedInput {\n    connect: PostWhereUniqueInput\n    disconnect: Boolean\n    create: PostCreateWithoutCommentInput\n    connectOrCreate: PostConnectOrCreateWithoutCommentInput\n    update: PostUpdateWithoutCommentInput\n    upsert: PostUpsertWithoutCommentInput\n    delete: Boolean\n}\n\ninput CommentCreateInput {\n    id: Int\n    author: CommentAuthorCreateNestedInput\n    post: CommentPostCreateNestedInput\n    message: String!\n    lastSavedAt: AWSDateTime\n}\n\ninput CommentCreateWithoutUserInput {\n    id: Int\n    post: CommentPostCreateNestedInput\n    postId: Int\n    message: String!\n    lastSavedAt: AWSDateTime\n}\n\ninput CommentCreateWithoutPostInput {\n    id: Int\n    author: CommentAuthorCreateNestedInput\n    authorUuid: String\n    message: String!\n    lastSavedAt: AWSDateTime\n}\n\ninput CommentConnectOrCreateWithoutUserInput {\n    where: CommentWhereUniqueInput!\n    create: CommentCreateWithoutUserInput!\n}\n\ninput CommentConnectOrCreateWithoutPostInput {\n    where: CommentWhereUniqueInput!\n    create: CommentCreateWithoutPostInput!\n}\n\ninput CommentCreateManyInput {\n    id: Int\n    message: String!\n    lastSavedAt: AWSDateTime\n}\n\ninput CommentUpdateInput {\n    id: Int\n    author: CommentAuthorUpdateNestedInput\n    post: CommentPostUpdateNestedInput\n    message: String\n    lastSavedAt: AWSDateTime\n}\n\ninput CommentUpdateWithoutUserInput {\n    id: Int\n    post: CommentPostUpdateNestedInput\n    postId: Int\n    message: String\n    lastSavedAt: AWSDateTime\n}\n\ninput CommentUpdateWithoutPostInput {\n    id: Int\n    author: CommentAuthorUpdateNestedInput\n    authorUuid: String\n    message: String\n    lastSavedAt: AWSDateTime\n}\n\ninput CommentUpdateWithWhereUniqueWithoutUserInput {\n    data: CommentUpdateWithoutUserInput!\n    where: CommentExtendedWhereUniqueInput!\n}\n\ninput CommentUpdateWithWhereUniqueWithoutPostInput {\n    data: CommentUpdateWithoutPostInput!\n    where: CommentExtendedWhereUniqueInput!\n}\n\ninput CommentUpdateManyInput {\n    where: CommentScalarWhereInput!\n    data: CommentUpdateInput!\n}\n\ninput CommentUpsertWithoutUserInput {\n    create: CommentCreateWithoutUserInput!\n    update: CommentUpdateWithoutUserInput!\n}\n\ninput CommentUpsertWithoutPostInput {\n    create: CommentCreateWithoutPostInput!\n    update: CommentUpdateWithoutPostInput!\n}\n\ninput CommentUpsertWithWhereUniqueWithoutUserInput {\n    where: CommentExtendedWhereUniqueInput!\n    create: CommentCreateWithoutUserInput!\n    update: CommentUpdateWithoutUserInput!\n}\n\ninput CommentUpsertWithWhereUniqueWithoutPostInput {\n    where: CommentExtendedWhereUniqueInput!\n    create: CommentCreateWithoutPostInput!\n    update: CommentUpdateWithoutPostInput!\n}\n\ninput AuthorUuidPostIdFieldsInput {\n    authorUuid: String!\n    postId: Int!\n}\n\ninput LikeFilter {\n    some: LikeWhereInputWithoutNullables\n    every: LikeWhereInputWithoutNullables\n    none: LikeWhereInputWithoutNullables\n}\n\ninput LikeWhereInputWithoutNullables {\n    OR: [LikeWhereInput!]\n    NOT: [LikeWhereInput!]\n    AND: [LikeWhereInput!]\n    id: IntFilter\n    authorUuid: StringFilter\n    postId: IntFilter\n}\n\ninput LikeWhereInput {\n    is: NullArg\n    isNot: NullArg\n    OR: [LikeWhereInput!]\n    NOT: [LikeWhereInput!]\n    AND: [LikeWhereInput!]\n    id: IntFilter\n    authorUuid: StringFilter\n    postId: IntFilter\n}\n\ninput LikeScalarWhereInput {\n    OR: [LikeScalarWhereInput!]\n    NOT: [LikeScalarWhereInput!]\n    AND: [LikeScalarWhereInput!]\n    id: IntFilter\n    authorUuid: StringFilter\n    postId: IntFilter\n}\n\ninput LikeWhereUniqueInput {\n    id: Int\n    authorUuid_postId: AuthorUuidPostIdFieldsInput\n}\n\ninput LikeExtendedWhereUniqueInput {\n    OR: [LikeWhereInput!]\n    NOT: [LikeWhereInput!]\n    AND: [LikeWhereInput!]\n    id: Int\n    authorUuid_postId: AuthorUuidPostIdFieldsInput\n    authorUuid: StringFilter\n    postId: IntFilter\n}\n\ninput LikeOrderByInput {\n    id: OrderByArg\n    authorUuid: OrderByArg\n    postId: OrderByArg\n}\n\ninput LikeCreateInput {\n    id: Int\n    authorUuid: String!\n    postId: Int!\n}\n\ninput LikeCreateManyInput {\n    id: Int\n    authorUuid: String!\n    postId: Int!\n}\n\ninput LikeUpdateInput {\n    id: Int\n    authorUuid: String\n    postId: Int\n}\n\ninput LikeUpdateManyInput {\n    where: LikeScalarWhereInput!\n    data: LikeUpdateInput!\n}\n\ntype Query {\n    # Retrieve a single User record by unique identifier.\n    getUser(where: UserExtendedWhereUniqueInput!): User\n\n    # Retrieve a list of Users records.\n    listUsers(\n        where: UserWhereInput\n        orderBy: [UserOrderByInput!]\n        skip: Int\n        take: Int\n    ): [User!]\n\n    # Count the number of Users records.\n    countUsers(\n        where: UserWhereInput\n        orderBy: [UserOrderByInput!]\n        skip: Int\n        take: Int\n    ): Int!\n\n    # Retrieve a single Profile record by unique identifier.\n    getProfile(\n        where: ProfileExtendedWhereUniqueInput!\n    ): Profile\n\n    # Retrieve a list of Profiles records.\n    listProfiles(\n        where: ProfileWhereInput\n        orderBy: [ProfileOrderByInput!]\n        skip: Int\n        take: Int\n    ): [Profile!]\n\n    # Count the number of Profiles records.\n    countProfiles(\n        where: ProfileWhereInput\n        orderBy: [ProfileOrderByInput!]\n        skip: Int\n        take: Int\n    ): Int!\n\n    # Retrieve a single Post record by unique identifier.\n    getPost(where: PostExtendedWhereUniqueInput!): Post\n\n    # Retrieve a list of Posts records.\n    listPosts(\n        where: PostWhereInput\n        orderBy: [PostOrderByInput!]\n        skip: Int\n        take: Int\n    ): [Post!]\n\n    # Count the number of Posts records.\n    countPosts(\n        where: PostWhereInput\n        orderBy: [PostOrderByInput!]\n        skip: Int\n        take: Int\n    ): Int!\n\n    # Retrieve a single Comment record by unique identifier.\n    getComment(\n        where: CommentExtendedWhereUniqueInput!\n    ): Comment\n\n    # Retrieve a list of Comments records.\n    listComments(\n        where: CommentWhereInput\n        orderBy: [CommentOrderByInput!]\n        skip: Int\n        take: Int\n    ): [Comment!]\n\n    # Count the number of Comments records.\n    countComments(\n        where: CommentWhereInput\n        orderBy: [CommentOrderByInput!]\n        skip: Int\n        take: Int\n    ): Int!\n\n    # Retrieve a single Like record by unique identifier.\n    getLike(where: LikeExtendedWhereUniqueInput!): Like\n\n    # Retrieve a list of Likes records.\n    listLikes(\n        where: LikeWhereInput\n        orderBy: [LikeOrderByInput!]\n        skip: Int\n        take: Int\n    ): [Like!]\n\n    # Count the number of Likes records.\n    countLikes(\n        where: LikeWhereInput\n        orderBy: [LikeOrderByInput!]\n        skip: Int\n        take: Int\n    ): Int!\n}\n\ntype Mutation {\n    # Create a new User record.\n    createUser(data: UserCreateInput!): User!\n\n    # Create multiple new Users records.\n    createManyUsers(\n        data: [UserCreateManyInput!]\n        skipDuplicates: Boolean\n    ): BatchPayload!\n\n    # Update a single existing User record.\n    updateUser(\n        where: UserExtendedWhereUniqueInput!\n        data: UserUpdateInput\n    ): User!\n\n    # Update multiple existing Users records.\n    updateManyUsers(\n        where: UserWhereInput!\n        data: UserUpdateInput\n    ): BatchPayload!\n\n    # Create a new User record if it does not exist, or updates it if it does.\n    upsertUser(\n        create: UserCreateInput!\n        update: UserUpdateInput!\n        where: UserExtendedWhereUniqueInput!\n    ): User!\n\n    # Delete a single existing User record.\n    deleteUser(where: UserExtendedWhereUniqueInput!): User!\n\n    # Delete multiple existing Users records.\n    deleteManyUsers(where: UserWhereInput!): BatchPayload!\n\n    # Create a new Profile record.\n    createProfile(data: ProfileCreateInput!): Profile!\n\n    # Create multiple new Profiles records.\n    createManyProfiles(\n        data: [ProfileCreateManyInput!]\n        skipDuplicates: Boolean\n    ): BatchPayload!\n\n    # Update a single existing Profile record.\n    updateProfile(\n        where: ProfileExtendedWhereUniqueInput!\n        data: ProfileUpdateInput\n    ): Profile!\n\n    # Update multiple existing Profiles records.\n    updateManyProfiles(\n        where: ProfileWhereInput!\n        data: ProfileUpdateInput\n    ): BatchPayload!\n\n    # Create a new Profile record if it does not exist, or updates it if it does.\n    upsertProfile(\n        create: ProfileCreateInput!\n        update: ProfileUpdateInput!\n        where: ProfileExtendedWhereUniqueInput!\n    ): Profile!\n\n    # Delete a single existing Profile record.\n    deleteProfile(\n        where: ProfileExtendedWhereUniqueInput!\n    ): Profile!\n\n    # Delete multiple existing Profiles records.\n    deleteManyProfiles(\n        where: ProfileWhereInput!\n    ): BatchPayload!\n\n    # Create a new Post record.\n    createPost(data: PostCreateInput!): Post!\n\n    # Create multiple new Posts records.\n    createManyPosts(\n        data: [PostCreateManyInput!]\n        skipDuplicates: Boolean\n    ): BatchPayload!\n\n    # Update a single existing Post record.\n    updatePost(\n        where: PostExtendedWhereUniqueInput!\n        data: PostUpdateInput\n        operation: PostOperationInput\n    ): Post!\n\n    # Update multiple existing Posts records.\n    updateManyPosts(\n        where: PostWhereInput!\n        data: PostUpdateInput\n        operation: PostOperationInput\n    ): BatchPayload!\n\n    # Create a new Post record if it does not exist, or updates it if it does.\n    upsertPost(\n        create: PostCreateInput!\n        update: PostUpdateInput!\n        where: PostExtendedWhereUniqueInput!\n    ): Post!\n\n    # Delete a single existing Post record.\n    deletePost(where: PostExtendedWhereUniqueInput!): Post!\n\n    # Delete multiple existing Posts records.\n    deleteManyPosts(where: PostWhereInput!): BatchPayload!\n\n    # Create a new Comment record.\n    createComment(data: CommentCreateInput!): Comment!\n\n    # Create multiple new Comments records.\n    createManyComments(\n        data: [CommentCreateManyInput!]\n        skipDuplicates: Boolean\n    ): BatchPayload!\n\n    # Update a single existing Comment record.\n    updateComment(\n        where: CommentExtendedWhereUniqueInput!\n        data: CommentUpdateInput\n    ): Comment!\n\n    # Update multiple existing Comments records.\n    updateManyComments(\n        where: CommentWhereInput!\n        data: CommentUpdateInput\n    ): BatchPayload!\n\n    # Create a new Comment record if it does not exist, or updates it if it does.\n    upsertComment(\n        create: CommentCreateInput!\n        update: CommentUpdateInput!\n        where: CommentExtendedWhereUniqueInput!\n    ): Comment!\n\n    # Delete a single existing Comment record.\n    deleteComment(\n        where: CommentExtendedWhereUniqueInput!\n    ): Comment!\n\n    # Delete multiple existing Comments records.\n    deleteManyComments(\n        where: CommentWhereInput!\n    ): BatchPayload!\n\n    # Create a new Like record.\n    createLike(data: LikeCreateInput!): Like!\n\n    # Create multiple new Likes records.\n    createManyLikes(\n        data: [LikeCreateManyInput!]\n        skipDuplicates: Boolean\n    ): BatchPayload!\n\n    # Update a single existing Like record.\n    updateLike(\n        where: LikeExtendedWhereUniqueInput!\n        data: LikeUpdateInput\n    ): Like!\n\n    # Update multiple existing Likes records.\n    updateManyLikes(\n        where: LikeWhereInput!\n        data: LikeUpdateInput\n    ): BatchPayload!\n\n    # Create a new Like record if it does not exist, or updates it if it does.\n    upsertLike(\n        create: LikeCreateInput!\n        update: LikeUpdateInput!\n        where: LikeExtendedWhereUniqueInput!\n    ): Like!\n\n    # Delete a single existing Like record.\n    deleteLike(where: LikeExtendedWhereUniqueInput!): Like!\n\n    # Delete multiple existing Likes records.\n    deleteManyLikes(where: LikeWhereInput!): BatchPayload!\n\n    # Send a notification.\n    notify(message: String!): PublishNotification\n}\n\ntype Subscription {\n    # Event triggered when a new User record is created.\n    onCreatedUser(\n        uuid: String\n        username: String\n        email: AWSEmail\n    ): User! @aws_subscribe(mutations: [\"createUser\"])\n\n    # Event triggered when an existing User record is updated.\n    onUpdatedUser(\n        uuid: String\n        username: String\n        email: AWSEmail\n    ): User! @aws_subscribe(mutations: [\"updateUser\"])\n\n    # Event triggered when a User record is either created or updated.\n    onUpsertedUser(\n        uuid: String\n        username: String\n        email: AWSEmail\n    ): User! @aws_subscribe(mutations: [\"upsertUser\"])\n\n    # Event triggered when an existing User record is deleted.\n    onDeletedUser(\n        uuid: String\n        username: String\n        email: AWSEmail\n    ): User! @aws_subscribe(mutations: [\"deleteUser\"])\n\n    # Event triggered when a User record is either created, updated, or deleted.\n    onMutatedUser(\n        uuid: String\n        username: String\n        email: AWSEmail\n    ): User!\n        @aws_subscribe(\n            mutations: [\n                \"createUser\"\n                \"updateUser\"\n                \"upsertUser\"\n                \"deleteUser\"\n            ]\n        )\n\n    # Event triggered when multiple new Users records are created.\n    onCreatedManyUsers: BatchPayload!\n        @aws_subscribe(mutations: [\"createManyUsers\"])\n\n    # Event triggered when multiple existing Users records are updated.\n    onUpdatedManyUsers: BatchPayload!\n        @aws_subscribe(mutations: [\"updateManyUsers\"])\n\n    # Event triggered when multiple existing Users records are deleted.\n    onDeletedManyUsers: BatchPayload!\n        @aws_subscribe(mutations: [\"deleteManyUsers\"])\n\n    # Event triggered when multiple Users records are either created, updated, or deleted.\n    onMutatedManyUsers: BatchPayload!\n        @aws_subscribe(\n            mutations: [\n                \"createManyUsers\"\n                \"updateManyUsers\"\n                \"deleteManyUsers\"\n            ]\n        )\n\n    # Event triggered when a new Profile record is created.\n    onCreatedProfile(\n        uuid: String\n        ownerUuid: String\n    ): Profile! @aws_subscribe(mutations: [\"createProfile\"])\n\n    # Event triggered when an existing Profile record is updated.\n    onUpdatedProfile(\n        uuid: String\n        ownerUuid: String\n    ): Profile! @aws_subscribe(mutations: [\"updateProfile\"])\n\n    # Event triggered when a Profile record is either created or updated.\n    onUpsertedProfile(\n        uuid: String\n        ownerUuid: String\n    ): Profile! @aws_subscribe(mutations: [\"upsertProfile\"])\n\n    # Event triggered when an existing Profile record is deleted.\n    onDeletedProfile(\n        uuid: String\n        ownerUuid: String\n    ): Profile! @aws_subscribe(mutations: [\"deleteProfile\"])\n\n    # Event triggered when a Profile record is either created, updated, or deleted.\n    onMutatedProfile(\n        uuid: String\n        ownerUuid: String\n    ): Profile!\n        @aws_subscribe(\n            mutations: [\n                \"createProfile\"\n                \"updateProfile\"\n                \"upsertProfile\"\n                \"deleteProfile\"\n            ]\n        )\n\n    # Event triggered when multiple new Profiles records are created.\n    onCreatedManyProfiles: BatchPayload!\n        @aws_subscribe(mutations: [\"createManyProfiles\"])\n\n    # Event triggered when multiple existing Profiles records are updated.\n    onUpdatedManyProfiles: BatchPayload!\n        @aws_subscribe(mutations: [\"updateManyProfiles\"])\n\n    # Event triggered when multiple existing Profiles records are deleted.\n    onDeletedManyProfiles: BatchPayload!\n        @aws_subscribe(mutations: [\"deleteManyProfiles\"])\n\n    # Event triggered when multiple Profiles records are either created, updated, or deleted.\n    onMutatedManyProfiles: BatchPayload!\n        @aws_subscribe(\n            mutations: [\n                \"createManyProfiles\"\n                \"updateManyProfiles\"\n                \"deleteManyProfiles\"\n            ]\n        )\n\n    # Event triggered when a new Post record is created.\n    onCreatedPost(id: Int): Post!\n        @aws_subscribe(mutations: [\"createPost\"])\n\n    # Event triggered when an existing Post record is updated.\n    onUpdatedPost(id: Int): Post!\n        @aws_subscribe(mutations: [\"updatePost\"])\n\n    # Event triggered when a Post record is either created or updated.\n    onUpsertedPost(id: Int): Post!\n        @aws_subscribe(mutations: [\"upsertPost\"])\n\n    # Event triggered when an existing Post record is deleted.\n    onDeletedPost(id: Int): Post!\n        @aws_subscribe(mutations: [\"deletePost\"])\n\n    # Event triggered when a Post record is either created, updated, or deleted.\n    onMutatedPost(id: Int): Post!\n        @aws_subscribe(\n            mutations: [\n                \"createPost\"\n                \"updatePost\"\n                \"upsertPost\"\n                \"deletePost\"\n            ]\n        )\n\n    # Event triggered when multiple new Posts records are created.\n    onCreatedManyPosts: BatchPayload!\n        @aws_subscribe(mutations: [\"createManyPosts\"])\n\n    # Event triggered when multiple existing Posts records are updated.\n    onUpdatedManyPosts: BatchPayload!\n        @aws_subscribe(mutations: [\"updateManyPosts\"])\n\n    # Event triggered when multiple existing Posts records are deleted.\n    onDeletedManyPosts: BatchPayload!\n        @aws_subscribe(mutations: [\"deleteManyPosts\"])\n\n    # Event triggered when multiple Posts records are either created, updated, or deleted.\n    onMutatedManyPosts: BatchPayload!\n        @aws_subscribe(\n            mutations: [\n                \"createManyPosts\"\n                \"updateManyPosts\"\n                \"deleteManyPosts\"\n            ]\n        )\n\n    # Event triggered when a new Comment record is created.\n    onCreatedComment(id: Int): Comment!\n        @aws_subscribe(mutations: [\"createComment\"])\n\n    # Event triggered when an existing Comment record is updated.\n    onUpdatedComment(id: Int): Comment!\n        @aws_subscribe(mutations: [\"updateComment\"])\n\n    # Event triggered when a Comment record is either created or updated.\n    onUpsertedComment(id: Int): Comment!\n        @aws_subscribe(mutations: [\"upsertComment\"])\n\n    # Event triggered when an existing Comment record is deleted.\n    onDeletedComment(id: Int): Comment!\n        @aws_subscribe(mutations: [\"deleteComment\"])\n\n    # Event triggered when a Comment record is either created, updated, or deleted.\n    onMutatedComment(id: Int): Comment!\n        @aws_subscribe(\n            mutations: [\n                \"createComment\"\n                \"updateComment\"\n                \"upsertComment\"\n                \"deleteComment\"\n            ]\n        )\n\n    # Event triggered when multiple new Comments records are created.\n    onCreatedManyComments: BatchPayload!\n        @aws_subscribe(mutations: [\"createManyComments\"])\n\n    # Event triggered when multiple existing Comments records are updated.\n    onUpdatedManyComments: BatchPayload!\n        @aws_subscribe(mutations: [\"updateManyComments\"])\n\n    # Event triggered when multiple existing Comments records are deleted.\n    onDeletedManyComments: BatchPayload!\n        @aws_subscribe(mutations: [\"deleteManyComments\"])\n\n    # Event triggered when multiple Comments records are either created, updated, or deleted.\n    onMutatedManyComments: BatchPayload!\n        @aws_subscribe(\n            mutations: [\n                \"createManyComments\"\n                \"updateManyComments\"\n                \"deleteManyComments\"\n            ]\n        )\n\n    # Event triggered when a new Like record is created.\n    onCreatedLike(\n        id: Int\n        authorUuid_postId: AuthorUuidPostIdFieldsInput\n    ): Like! @aws_subscribe(mutations: [\"createLike\"])\n\n    # Event triggered when an existing Like record is updated.\n    onUpdatedLike(\n        id: Int\n        authorUuid_postId: AuthorUuidPostIdFieldsInput\n    ): Like! @aws_subscribe(mutations: [\"updateLike\"])\n\n    # Event triggered when a Like record is either created or updated.\n    onUpsertedLike(\n        id: Int\n        authorUuid_postId: AuthorUuidPostIdFieldsInput\n    ): Like! @aws_subscribe(mutations: [\"upsertLike\"])\n\n    # Event triggered when an existing Like record is deleted.\n    onDeletedLike(\n        id: Int\n        authorUuid_postId: AuthorUuidPostIdFieldsInput\n    ): Like! @aws_subscribe(mutations: [\"deleteLike\"])\n\n    # Event triggered when a Like record is either created, updated, or deleted.\n    onMutatedLike(\n        id: Int\n        authorUuid_postId: AuthorUuidPostIdFieldsInput\n    ): Like!\n        @aws_subscribe(\n            mutations: [\n                \"createLike\"\n                \"updateLike\"\n                \"upsertLike\"\n                \"deleteLike\"\n            ]\n        )\n\n    # Event triggered when multiple new Likes records are created.\n    onCreatedManyLikes: BatchPayload!\n        @aws_subscribe(mutations: [\"createManyLikes\"])\n\n    # Event triggered when multiple existing Likes records are updated.\n    onUpdatedManyLikes: BatchPayload!\n        @aws_subscribe(mutations: [\"updateManyLikes\"])\n\n    # Event triggered when multiple existing Likes records are deleted.\n    onDeletedManyLikes: BatchPayload!\n        @aws_subscribe(mutations: [\"deleteManyLikes\"])\n\n    # Event triggered when multiple Likes records are either created, updated, or deleted.\n    onMutatedManyLikes: BatchPayload!\n        @aws_subscribe(\n            mutations: [\n                \"createManyLikes\"\n                \"updateManyLikes\"\n                \"deleteManyLikes\"\n            ]\n        )\n\n    # Triggered from `notify` mutation.\n    onNotification: PublishNotification\n        @aws_subscribe(mutations: [\"notify\"])\n}\n\ntype PublishNotification {\n    message: String!\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"display\": \"Default\",\n    \"compilerOptions\": {\n        \"target\": \"ES2018\",\n        \"module\": \"commonjs\",\n        \"lib\": [\"es2018\"],\n        \"declaration\": false,\n        \"strict\": true,\n        \"noImplicitAny\": false,\n        \"strictNullChecks\": true,\n        \"noImplicitThis\": true,\n        \"alwaysStrict\": true,\n        \"noUnusedLocals\": false,\n        \"noUnusedParameters\": false,\n        \"noImplicitReturns\": true,\n        \"noFallthroughCasesInSwitch\": false,\n        \"inlineSourceMap\": true,\n        \"inlineSources\": true,\n        \"esModuleInterop\": true,\n        \"experimentalDecorators\": true,\n        \"strictPropertyInitialization\": false,\n        \"baseUrl\": \".\",\n        \"paths\": {\n            \"@client\": [\"packages/client/src/index\"],\n            \"@client/*\": [\"packages/client/src/*\"],\n            \"prisma-appsync/dist/server\": [\"dist/server\"]\n        },\n        \"types\": [\"node\"],\n        \"plugins\": [\n            {\n                \"transform\": \"@zerollup/ts-transform-paths\"\n            }\n        ]\n    },\n    \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n    \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "vite.config.ts",
    "content": "// vite.config.ts\nimport { defineConfig } from 'vitest/config'\nimport tsconfigPaths from 'vite-tsconfig-paths'\n\nexport default defineConfig({\n    plugins: [tsconfigPaths()],\n})\n"
  }
]