[
  {
    "path": ".eslintrc.js",
    "content": "const jsConfig = require(\"@ajv-validator/config/.eslintrc_js\")\nconst tsConfig = require(\"@ajv-validator/config/.eslintrc\")\n\nmodule.exports = {\n  env: {\n    es6: true,\n    node: true,\n  },\n  overrides: [\n    jsConfig,\n    {\n      ...tsConfig,\n      files: [\"*.ts\"],\n      rules: {\n        ...tsConfig.rules,\n        complexity: [\"error\", 17],\n        \"@typescript-eslint/no-empty-function\": \"off\",\n        \"@typescript-eslint/no-explicit-any\": \"off\",\n        \"@typescript-eslint/no-floating-promises\": \"off\",\n        \"@typescript-eslint/no-implied-eval\": \"off\",\n        \"@typescript-eslint/no-invalid-this\": \"off\",\n        \"@typescript-eslint/no-parameter-properties\": \"off\",\n        \"@typescript-eslint/no-unnecessary-condition\": \"warn\",\n        \"@typescript-eslint/no-unsafe-assignment\": \"off\",\n        \"@typescript-eslint/no-unsafe-member-access\": \"off\",\n        \"@typescript-eslint/restrict-template-expressions\": \"off\",\n      },\n    },\n  ],\n}\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "@epoberezkin\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: epoberezkin\ntidelift: \"npm/ajv\"\nopen_collective: \"ajv\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-or-error-report.md",
    "content": "---\nname: Bug or error report\nabout: Please use for issues related to incorrect validation behaviour\ntitle: \"\"\nlabels: \"bug report\"\nassignees: \"\"\n---\n\n<!--\nFrequently Asked Questions: https://ajv.js.org/faq.html\nPlease provide all info and reduce your schema and data to the smallest possible size.\n\nThis template is for bug or error reports.\nFor other issues please see https://ajv.js.org/contributing/\n-->\n\n**What version of Ajv are you using? Does the issue happen if you use the latest version?**\n\n**Ajv options object**\n\n<!-- See https://ajv.js.org/options.html -->\n\n```javascript\n\n```\n\n**JSON Schema**\n\n<!-- Please make it as small as possible to reproduce the issue -->\n\n```json\n\n```\n\n**Sample data**\n\n<!-- Please make it as small as possible to reproduce the issue -->\n\n```json\n\n```\n\n**Your code**\n\n<!--\nPlease:\n- make it as small as possible to reproduce the issue\n- use one of the usage patterns from https://ajv.js.org/guide/getting-started.html\n- use `options`, `schema` and `data` as variables, do not repeat their values here\n- post a working code sample in RunKit notebook cloned from https://runkit.com/esp/ajv-issue and include the link here.\n\nIt would make understanding your problem easier and the issue more useful to others.\nThank you!\n-->\n\n```javascript\n\n```\n\n**Validation result, data AFTER validation, error messages**\n\n```\n\n```\n\n**What results did you expect?**\n\n**Are you going to resolve the issue?**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/change.md",
    "content": "---\nname: Feature or change proposal\nabout: For proposals of new features, options or some other improvements\ntitle: \"\"\nlabels: \"enhancement\"\nassignees: \"\"\n---\n\n<!--\nFrequently Asked Questions: https://ajv.js.org/faq.html\nPlease provide all info and reduce your schema and data to the smallest possible size.\n\nThis template is for change proposals.\nFor other issues please see https://ajv.js.org/contributing/\n-->\n\n**What version of Ajv you are you using?**\n\n**What problem do you want to solve?**\n\n**What do you think is the correct solution to problem?**\n\n**Will you be able to implement it?**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/compatibility.md",
    "content": "---\nname: Browser and compatibility issue\nabout: For issues that only happen in a specific environment\ntitle: \"\"\nlabels: \"compatibility\"\nassignees: \"\"\n---\n\n<!--\nFrequently Asked Questions: https://ajv.js.org/faq.html\nPlease provide all info and reduce your schema and data to the smallest possible size.\n\nThis template is for compatibility issues.\nFor other issues please see https://ajv.js.org/contributing/\n-->\n\n**The version of Ajv you are using**\n\n**The environment you have the problem with**\n\n**Your code (please make it as small as possible to reproduce the issue)**\n\n**If your issue is in the browser, please list the other packages loaded in the page in the order they are loaded. Please check if the issue gets resolved (or results change) if you move Ajv bundle closer to the top**\n\n**Results in node.js v8+**\n\n**Results and error messages in your platform**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/installation.md",
    "content": "---\nname: Installation and dependency issue\nabout: For issues that happen during installation\ntitle: \"\"\nlabels: \"installation\"\nassignees: \"\"\n---\n\n<!--\nFrequently Asked Questions: https://ajv.js.org/faq.html\nPlease provide all info and reduce your schema and data to the smallest possible size.\n\nThis template is for installation and dependency issues.\nFor other issues please see https://ajv.js.org/contributing/\n\nBefore submitting the issue, please try the following:\n- use the latest stable Node.js and npm\n- use yarn instead of npm - the issue can be related to https://github.com/npm/npm/issues/19877\n- remove node_modules and package-lock.json and run install again\n-->\n\n**The version of Ajv you are using**\n\n**Operating system and node.js version**\n\n**Package manager and its version**\n\n**Link to (or contents of) package.json**\n\n**Error messages**\n\n**The output of `npm ls`**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/typescript.md",
    "content": "---\nname: Missing or incorrect type definition\nabout: Please use for issues related to typescript types\ntitle: \"\"\nlabels: \"typescript\"\nassignees: \"\"\n---\n\n<!--\nFrequently Asked Questions: https://ajv.js.org/faq.html\n\nThis template is for issues about missing or incorrect type definition and other typescript-related issues.\nFor other issues please see https://ajv.js.org/contributing/\n-->\n\n**What version of Ajv are you using? Does the issue happen if you use the latest version?**\n\n**Your typescript code**\n\n<!--\nPlease make it as small as possible to reproduce the issue\n-->\n\n```typescript\n\n```\n\n**Typescript compiler error messages**\n\n```\n\n```\n\n**Describe the change that should be made to address the issue?**\n\n**Are you going to resolve the issue?**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!--\nFrequently Asked Questions: https://ajv.js.org/faq.html\nPlease provide all info and reduce your schema and data to the smallest possible size.\n\nThis template is for bug or error reports. For other issues please use:\n- security vulnerability: https://tidelift.com/security)\n- a new feature/improvement: https://ajv.js.org/contributing/#changes\n- browser/compatibility issues: https://ajv.js.org/contributing/#compatibility\n- JSON-Schema standard: https://ajv.js.org/contributing/#json-schema\n- Ajv usage questions: https://gitter.im/ajv-validator/ajv\n-->\n\n**What version of Ajv are you using? Does the issue happen if you use the latest version?**\n\n**Ajv options object**\n\n<!-- See https://ajv.js.org/options.html -->\n\n```javascript\n\n```\n\n**JSON Schema**\n\n<!-- Please make it as small as possible to reproduce the issue -->\n\n```json\n\n```\n\n**Sample data**\n\n<!-- Please make it as small as possible to reproduce the issue -->\n\n```json\n\n```\n\n**Your code**\n\n<!--\nPlease:\n- make it as small as possible to reproduce the issue\n- use one of the usage patterns from https://ajv.js.org/guide/getting-started.html\n- use `options`, `schema` and `data` as variables, do not repeat their values here\n- post a working code sample in RunKit notebook cloned from https://runkit.com/esp/ajv-issue and include the link here.\n\nIt would make understanding your problem easier and the issue more useful to others.\nThank you!\n-->\n\n```javascript\n\n```\n\n**Validation result, data AFTER validation, error messages**\n\n```\n\n\n```\n\n**What results did you expect?**\n\n**Are you going to resolve the issue?**\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nThank you for submitting a pull request to Ajv.\n\nBefore continuing, please read the guidelines:\nhttps://github.com/ajv-validator/ajv/blob/master/CONTRIBUTING.md#pull-requests\n\nIf the pull request contains code please make sure there is an issue that we agreed to resolve (if it is a documentation improvement there is no need for an issue).\n\nPlease answer the questions below.\n-->\n\n**What issue does this pull request resolve?**\n\n**What changes did you make?**\n\n**Is there anything that requires more attention while reviewing?**\n"
  },
  {
    "path": ".github/config.yml",
    "content": "# Please supply comments to be used for GitHub labels \ngithubLabels:\n  bug: >\n    Bug confirmed - to be fixed. PR is welcome!\n\n#  duplicate: >\n#  enhancement: >    \n#  good first issue: >    \n#  help wanted: >\n#  invalid: >\n#  question: >    \n#  wont fix: >\n  \n  bug report: >\n    Thank you for the report! If you didn't post a code sample to RunKit yet,\n    please clone this notebook https://runkit.com/esp/ajv-issue,\n    post the code sample that demonstrates the bug and post the link here.\n    It will speed up the investigation and fixing!\n\n  json schema: >\n    This question is about the usage of JSON Schema specification - it is not specific to Ajv.\n    Please use JSON Schema reference materials or [submit the question to Stack Overflow](https://stackoverflow.com/questions/ask?tags=jsonschema,ajv).\n\n    - [JSON Schema specification](http://json-schema.org/)\n\n    - [Tutorial by Space Telescope Science Institute](http://json-schema.org/understanding-json-schema/)\n\n    - [validation keywords](https://github.com/ajv-validator/ajv#validation-keywords) (in Ajv docs)\n\n    - [combining schemas](https://github.com/ajv-validator/ajv#ref) (in Ajv docs)\n\n    - [Tutorial by @epoberezkin](https://code.tutsplus.com/tutorials/validating-data-with-json-schema-part-1--cms-25343)\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: npm\n  directory: \"/\"\n  schedule:\n    interval: daily\n  open-pull-requests-limit: 10\n  ignore:\n  - dependency-name: \"@types/node\"\n    versions:\n    - 15.0.0\n  - dependency-name: eslint-config-prettier\n    versions:\n    - 8.0.0\n    - 8.1.0\n    - 8.2.0\n  - dependency-name: karma\n    versions:\n    - 6.0.3\n    - 6.0.4\n    - 6.1.0\n    - 6.1.1\n    - 6.1.2\n    - 6.2.0\n    - 6.3.0\n    - 6.3.1\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: build\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [\"*\"]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [18.x, 20.x, 21.x]\n\n    steps:\n      - uses: actions/checkout@v4\n      - name: use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n      - run: npm install\n      - run: git submodule update --init\n      - name: update website\n        if: ${{ github.event_name == 'push' && matrix.node-version == '18.x' }}\n        run: ./scripts/publish-site\n        env:\n          GH_TOKEN_PUBLIC: ${{ secrets.GH_TOKEN_PUBLIC }}\n          GIT_USER_EMAIL: ${{ secrets.GIT_USER_EMAIL }}\n          GIT_USER_NAME: ${{ secrets.GIT_USER_NAME }}\n      - run: npm run build\n      - run: npm run test-ci\n      - name: coveralls\n        uses: coverallsapp/github-action@v2\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: publish\n\non:\n  release:\n    types: [published]\n\njobs:\n  publish-npm:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 18\n          registry-url: https://registry.npmjs.org/\n      - run: npm install\n      - run: git submodule update --init\n      - run: npm run test-ci\n      - name: Publish beta version to npm\n        if: ${{ github.event.release.prerelease }}\n        run: npm publish --tag beta\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n      - name: Publish to npm\n        if: ${{ !github.event.release.prerelease }}\n        run: npm publish\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n      - name: Commit bundles to ajv-dist\n        run: ./scripts/publish-bundles\n        env:\n          GH_TOKEN_PUBLIC: ${{ secrets.GH_TOKEN_PUBLIC }}\n          GIT_USER_EMAIL: ${{ secrets.GIT_USER_EMAIL }}\n          GIT_USER_NAME: ${{ secrets.GIT_USER_NAME }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directory\n# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git\nnode_modules\n\n.DS_Store\n\n# Browserified tests\n.browser\n\n# compiled typescript\ndist/\n\n# browser bundles\nbundle/\n\npackage-lock.json\n\nspec/_json/*.js\n\n# docs\ndocs/code_of_conduct.md\ndocs/contributing.md\ndocs/license.md\ndocs/.vuepress/components/Contributors/\ndocs/packages/*\n!docs/packages/README.md\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"spec/JSON-Schema-Test-Suite\"]\n\tpath = spec/JSON-Schema-Test-Suite\n\turl = https://github.com/json-schema/JSON-Schema-Test-Suite.git\n[submodule \"spec/json-typedef-spec\"]\n\tpath = spec/json-typedef-spec\n\turl = https://github.com/jsontypedef/json-typedef-spec.git\n"
  },
  {
    "path": ".npmrc",
    "content": "package-lock=false\n"
  },
  {
    "path": ".prettierignore",
    "content": "spec/JSON-Schema-Test-Suite\nspec/json-typedef-spec\n.browser\ncoverage\ndist\nbundle\n.nyc_output\nspec/_json\ndocs/.vuepress/components/_contributors.js\n"
  },
  {
    "path": ".runkit_example.js",
    "content": "const Ajv = require(\"ajv\")\nconst ajv = new Ajv({allErrors: true})\n\nconst schema = {\n  type: \"object\",\n  properties: {\n    foo: {type: \"string\"},\n    bar: {type: \"number\", maximum: 3},\n  },\n  required: [\"foo\", \"bar\"],\n  additionalProperties: false,\n}\n\nconst validate = ajv.compile(schema)\n\ntest({foo: \"abc\", bar: 2})\ntest({foo: 2, bar: 4})\n\nfunction test(data) {\n  const valid = validate(data)\n  if (valid) console.log(\"Valid!\")\n  else console.log(\"Invalid: \" + ajv.errorsText(validate.errors))\n}\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "---\npermalink: /code_of_conduct\n---\n\n# Contributor Covenant Code of Conduct\n\n### Our Pledge\n\nWe commit to creating and maintaining an open and welcoming environment. We, as contributors and maintainers, commit to building a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n### Our Standards\n\n**Behaviour that contributes to creating a positive environment include**:\n\n- Using welcoming and inclusive language\n  - Consider when identity words like race or ethnicity matter\n  - Be conscious of language with discriminatory connotations (e.g. gendered, ableist, racialized phrases)\n  - Be open to being corrected if you make a mistake - it’s okay to mess up, what matters is your follow up\n- Gracefully accepting constructive criticism\n- Showing empathy towards other community members\n- Treat other community members and project team members with respect\n- Report if you witness harassment or wrongdoing in our spaces\n\n**Unacceptable behaviour by participants include**:\n\n- The use of sexualized language or imagery and unwelcome sexual attention or advances\n- Trolling, insulting/derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or electronic address, without explicit permission\n- Other conduct which could reasonably be considered inappropriate in a professional setting\n\n### Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behaviour and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n### Scope\n\nThe goal of this Code of Conduct is to set standards and expectations around how we interact within this community. It’s scope applies to all project participants and covers all interactions within the community associated with this project including, but not limited to, email communication, issue trackers, source code repositories, forums, and social media.\n\nExamples of representing a project or community include:\n\n- Using an official project e-mail address\n- Posting via an official social media account\n- Acting as an appointed representative at an online or offline event\n\nRepresentation of a project may be further defined and clarified by project maintainers.\n\n### Enforcement\n\nWe will not tolerate abuse, harassment, or any other unacceptable behaviour made against community members, project maintainers, or members of our project team, either online or offline.\n\nViolations of our Code of Conduct may be reported by contacting the project team at [ajv.validator@gmail.com](mailto:ajv.validator@gmail.com). The project team will review and investigate all complaints, to the best of our ability, and will respond in a way that it deems appropriate to the circumstances.\n\nReports of violations will be investigated in a respectful, professional manner as promptly and confidentially as possible. We will have zero tolerance for intimidation or retaliation against anyone who raises a concern, makes a report or cooperates in an investigation around a violation of our code of conduct. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions or removal as determined by other members of the project's leadership.\n\n### Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4,\navailable at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html)\n\nFor answers to common questions about this code of conduct, see\n[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "---\npermalink: /contributing\n---\n\n# Contributing guide\n\nThank you for your help making Ajv better! Every contribution is appreciated. There are many areas where you can contribute.\n\nMore than 100 people contributed to Ajv, and we would love to have you join the development. We welcome implementing new features that will benefit many users and ideas to improve our documentation.\n\nAt Ajv, we are committed to creating more equitable and inclusive spaces for our community and team members to contribute to discussions that affect both this project and our ongoing work in the open source ecosystem.\n\nWe strive to create an environment of respect and healthy discourse by setting standards for our interactions and we expect it from all members of our community - from long term project member to first time visitor. For more information, review our [code of conduct](./CODE_OF_CONDUCT.md) and values.\n\n::: tip Submit issue first\nIf you plan to implement a new feature or some other change please create an issue first, to make sure that your work is not lost.\n:::\n\n[[toc]]\n\n## Documentation\n\nAjv has a lot of features and maintaining documentation takes time. If anything is unclear, or could be explained better, we appreciate the time you spend correcting or clarifying it.\n\nThere is a link in the bottom of each website page to quickly edit it.\n\n## Issues\n\nBefore submitting the issue:\n\n- Search the existing issues\n- Review [Frequently Asked Questions](./docs/faq.md).\n- Provide all the relevant information, reducing both your schema and data to the smallest possible size when they still have the issue.\n\nWe value simplicity - simplifying the example that shows the issue makes it more valuable for other users. This process helps us reduce situations where an error is occurring due to incorrect usage rather than a bug.\n\n### Bug reports\n\nPlease make sure to include the following information in the issue:\n\n1. What version of Ajv are you using?\n2. Does the issue happen if you use the latest version?\n3. Ajv [options object](./docs/options)\n4. Schema and the data you are validating (please make it as small as possible to reproduce the issue).\n5. Your code sample (please use `options`, `schema` and `data` as variables).\n6. Validation result, data AFTER validation, error messages.\n7. What results did you expect?\n\nTo speed up investigation and fixes, please include the link to the working code sample at runkit.com (please clone https://runkit.com/esp/ajv-issue).\n\n[Create bug report](https://github.com/ajv-validator/ajv/issues/new?template=bug-or-error-report.md).\n\n### Security vulnerabilities\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure.\n\nPlease do NOT report security vulnerabilities via GitHub issues.\n\n<a name=\"changes\"></a>\n\n### Change proposals\n\n[Create a proposal](https://github.com/ajv-validator/ajv/issues/new?template=change.md) for a new feature, option or some other improvement.\n\nPlease include this information:\n\n1. The version of Ajv you are using.\n2. The problem you want to solve.\n3. Your solution to the problem.\n4. Would you like to implement it?\n\nIf you’re requesting a change, it would be helpful to include this as well:\n\n1. What you did.\n2. What happened.\n3. What you would like to happen.\n\nPlease include as much details as possible - the more information, the better.\n\n<a name=\"compatibility\"></a>\n\n### Browser and compatibility issues\n\n[Create an issue](https://github.com/ajv-validator/ajv/issues/new?template=compatibility.md) to report a compatibility problem that only happens in a particular environment (when your code works correctly in the latest stable Node.js in linux systems but fails in some other environment).\n\nPlease include this information:\n\n1. The version of Ajv you are using.\n2. The environment you have the problem with.\n3. Your code (please make it as small as possible to reproduce the issue).\n4. If your issue is in the browser, please list the other packages loaded in the page in the order they are loaded. Please check if the issue gets resolved (or results change) if you move Ajv bundle closer to the top.\n5. Results in the latest stable Node.js.\n6. Results and error messages in your platform.\n\n<a name=\"installation\"></a>\n\n### Installation and dependency issues\n\n[Create an issue](https://github.com/ajv-validator/ajv/issues/new?template=installation.md) to report problems that happen during Ajv installation or when Ajv is missing some dependency.\n\nBefore submitting the issue, please try the following:\n\n- use the latest stable Node.js and `npm`\n- try using `yarn` instead of `npm` - the issue can be related to https://github.com/npm/npm/issues/19877\n- remove `node_modules` and `package-lock.json` and run `npm install` again\n\nIf nothing helps, please submit:\n\n1. The version of Ajv you are using\n2. Operating system and Node.js version\n3. Package manager and its version\n4. Link to (or contents of) package.json and package-lock.json\n5. Error messages\n6. The output of `npm ls`\n\n<a name=\"json-schema\"></a>\n\n### Using JSON Schema standard\n\nAjv implements JSON Schema standard draft-04 and draft-06/07.\n\nIf it is a general issue related to using the standard keywords included in JSON Schema specification or implementing some advanced validation logic please ask the question on [Stack Overflow](https://stackoverflow.com/questions/ask?tags=jsonschema,ajv) (my account is [esp](https://stackoverflow.com/users/1816503/esp)) or submit the question to [json-schema.org](https://github.com/json-schema-org/json-schema-spec/issues/new). Please mention @epoberezkin.\n\n<a name=\"usage\"></a>\n\n### Ajv usage questions\n\nThe best place to ask a question about using Ajv is [Gitter chat](https://gitter.im/ajv-validator/ajv).\n\nIf the question is advanced, it can be submitted to [Stack Overflow](http://stackoverflow.com/questions/ask?tags=jsonschema,ajv).\n\n## Code\n\nThanks a lot for considering contributing to Ajv! Our users have created many great features, and we look forward to your contributions.\n\nFor help navigating the code, please review the [Code components](./docs/components.md) document.\n\n### How we make decisions\n\nWe value conscious curation of our library size, and balancing performance and functionality. To that end, we cannot accept every suggestion. When evaluating pull requests we consider:\n\n- Will this benefit many users or a niche use case?\n- How will this impact the performance of Ajv?\n- How will this expand our library size?\n\nTo help us evaluate and understand, when you submit an issue and pull request:\n\n- Explain why this feature is important to the user base\n- Include documentation\n- Include test coverage with any new feature implementations\n\nPlease include documentation and test coverage with any new feature implementations.\n\n### Development\n\nRunning tests:\n\n```bash\nnpm install\ngit submodule update --init\nnpm test\n```\n\n`npm run build` - compiles typescript to dist folder.\n\n`npm run watch` - automatically compiles typescript when files on lib folder changes.\n\n### Pull requests\n\nWe want to iterate on the code efficiently. To speed up the process, please follow these steps:\n\n1. Submit an [issue with the bug](https://github.com/ajv-validator/ajv/issues/new) or with the proposed change (unless the contribution is to fix the documentation typos and mistakes).\n2. Describe the proposed api and implementation plan (unless the issue is a relatively simple bug and fixing it doesn't change any api).\n3. Once agreed, please write as little code as possible to achieve the desired result. We are passionate about keeping our library size optimized.\n4. Please add the tests both for the added feature and, if you are submitting an option, for the existing behaviour when this option is turned off or not passed.\n5. Please avoid unnecessary changes, refactoring or changing coding styles as part of your change (unless the change was proposed as refactoring).\n6. Follow the coding conventions even if they are not validated.\n7. Please run the tests before committing your code.\n8. If tests fail in CI build after you make a PR please investigate and fix the issue.\n\n### Contributions license\n\nWhen contributing the code you confirm that:\n\n1. Your contribution is created by you.\n2. You have the right to submit it under the MIT license.\n3. You understand and agree that your contribution is public, will be stored indefinitely, can be redistributed as the part of Ajv or another related package under MIT license, modified or completely removed from Ajv.\n4. You grant irrevocable MIT license to use your contribution as part of Ajv or any other package.\n5. You waive all rights to your contribution.\n6. Unless you request otherwise, you can be mentioned as the author of the contribution in the Ajv documentation and change log.\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015-2021 Evgeny Poberezkin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "<img align=\"right\" alt=\"Ajv logo\" width=\"160\" src=\"https://ajv.js.org/img/ajv.svg\">\n\n&nbsp;\n\n# Ajv JSON schema validator\n\nThe fastest JSON validator for Node.js and browser.\n\nSupports JSON Schema draft-04/06/07/2019-09/2020-12 ([draft-04 support](https://ajv.js.org/json-schema.html#draft-04) requires ajv-draft-04 package) and JSON Type Definition [RFC8927](https://datatracker.ietf.org/doc/rfc8927/).\n\n[![build](https://github.com/ajv-validator/ajv/actions/workflows/build.yml/badge.svg)](https://github.com/ajv-validator/ajv/actions?query=workflow%3Abuild)\n[![npm](https://img.shields.io/npm/v/ajv.svg)](https://www.npmjs.com/package/ajv)\n[![npm downloads](https://img.shields.io/npm/dm/ajv.svg)](https://www.npmjs.com/package/ajv)\n[![Coverage Status](https://coveralls.io/repos/github/ajv-validator/ajv/badge.svg?branch=master)](https://coveralls.io/github/ajv-validator/ajv?branch=master)\n[![SimpleX](https://img.shields.io/badge/chat-on%20SimpleX-70F0F9)](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F8KvvURM6J38Gdq9dCuPswMOkMny0xCOJ%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAr8rPVRuMOXv6kwF2yUAap-eoVg-9ssOFCi1fIrxTUw0%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%224pwLRgWHU9tlroMWHz0uOg%3D%3D%22%7D)\n[![Gitter](https://img.shields.io/gitter/room/ajv-validator/ajv.svg)](https://gitter.im/ajv-validator/ajv)\n[![GitHub Sponsors](https://img.shields.io/badge/$-sponsors-brightgreen)](https://github.com/sponsors/epoberezkin)\n\n## Ajv sponsors\n\n[<img src=\"https://ajv.js.org/img/mozilla.svg\" width=\"45%\" alt=\"Mozilla\">](https://www.mozilla.org)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"9%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"45%\">](https://opencollective.com/ajv)\n\n[<img src=\"https://ajv.js.org/img/microsoft.png\" width=\"31%\" alt=\"Microsoft\">](https://opensource.microsoft.com)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"31%\">](https://opencollective.com/ajv)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"31%\">](https://opencollective.com/ajv)\n\n[<img src=\"https://ajv.js.org/img/retool.svg\" width=\"22.5%\" alt=\"Retool\">](https://retool.com/?utm_source=sponsor&utm_campaign=ajv)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/tidelift.svg\" width=\"22.5%\" alt=\"Tidelift\">](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=enterprise)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/simplex.svg\" width=\"22.5%\" alt=\"SimpleX\">](https://github.com/simplex-chat/simplex-chat)<img src=\"https://ajv.js.org/img/gap.svg\" width=\"3%\">[<img src=\"https://ajv.js.org/img/reserved.svg\" width=\"22.5%\">](https://opencollective.com/ajv)\n\n## Contributing\n\nMore than 100 people contributed to Ajv, and we would love to have you join the development. We welcome implementing new features that will benefit many users and ideas to improve our documentation.\n\nPlease review [Contributing guidelines](./CONTRIBUTING.md) and [Code components](https://ajv.js.org/components.html).\n\n## Documentation\n\nAll documentation is available on the [Ajv website](https://ajv.js.org).\n\nSome useful site links:\n\n- [Getting started](https://ajv.js.org/guide/getting-started.html)\n- [JSON Schema vs JSON Type Definition](https://ajv.js.org/guide/schema-language.html)\n- [API reference](https://ajv.js.org/api.html)\n- [Strict mode](https://ajv.js.org/strict-mode.html)\n- [Standalone validation code](https://ajv.js.org/standalone.html)\n- [Security considerations](https://ajv.js.org/security.html)\n- [Command line interface](https://ajv.js.org/packages/ajv-cli.html)\n- [Frequently Asked Questions](https://ajv.js.org/faq.html)\n\n## <a name=\"sponsors\"></a>Please [sponsor Ajv development](https://github.com/sponsors/epoberezkin)\n\nSince I asked to support Ajv development 40 people and 6 organizations contributed via GitHub and OpenCollective - this support helped receiving the MOSS grant!\n\nYour continuing support is very important - the funds will be used to develop and maintain Ajv once the next major version is released.\n\nPlease sponsor Ajv via:\n\n- [GitHub sponsors page](https://github.com/sponsors/epoberezkin) (GitHub will match it)\n- [Ajv Open Collective](https://opencollective.com/ajv)\n\nThank you.\n\n#### Open Collective sponsors\n\n<a href=\"https://opencollective.com/ajv\"><img src=\"https://opencollective.com/ajv/individuals.svg?width=890\"></a>\n\n<a href=\"https://opencollective.com/ajv/organization/0/website\"><img src=\"https://opencollective.com/ajv/organization/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/1/website\"><img src=\"https://opencollective.com/ajv/organization/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/2/website\"><img src=\"https://opencollective.com/ajv/organization/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/3/website\"><img src=\"https://opencollective.com/ajv/organization/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/4/website\"><img src=\"https://opencollective.com/ajv/organization/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/5/website\"><img src=\"https://opencollective.com/ajv/organization/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/6/website\"><img src=\"https://opencollective.com/ajv/organization/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/7/website\"><img src=\"https://opencollective.com/ajv/organization/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/8/website\"><img src=\"https://opencollective.com/ajv/organization/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/9/website\"><img src=\"https://opencollective.com/ajv/organization/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/10/website\"><img src=\"https://opencollective.com/ajv/organization/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/11/website\"><img src=\"https://opencollective.com/ajv/organization/11/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/12/website\"><img src=\"https://opencollective.com/ajv/organization/12/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/13/website\"><img src=\"https://opencollective.com/ajv/organization/13/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/14/website\"><img src=\"https://opencollective.com/ajv/organization/14/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/15/website\"><img src=\"https://opencollective.com/ajv/organization/15/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/16/website\"><img src=\"https://opencollective.com/ajv/organization/16/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/17/website\"><img src=\"https://opencollective.com/ajv/organization/17/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/18/website\"><img src=\"https://opencollective.com/ajv/organization/18/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/19/website\"><img src=\"https://opencollective.com/ajv/organization/19/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/20/website\"><img src=\"https://opencollective.com/ajv/organization/20/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/21/website\"><img src=\"https://opencollective.com/ajv/organization/21/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/22/website\"><img src=\"https://opencollective.com/ajv/organization/22/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/23/website\"><img src=\"https://opencollective.com/ajv/organization/23/avatar.svg\"></a>\n<a href=\"https://opencollective.com/ajv/organization/24/website\"><img src=\"https://opencollective.com/ajv/organization/24/avatar.svg\"></a>\n\n## Performance\n\nAjv generates code to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization.\n\nCurrently Ajv is the fastest and the most standard compliant validator according to these benchmarks:\n\n- [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark) - 50% faster than the second place\n- [jsck benchmark](https://github.com/pandastrike/jsck#benchmarks) - 20-190% faster\n- [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html)\n- [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html)\n\nPerformance of different validators by [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark):\n\n[![performance](https://chart.googleapis.com/chart?chxt=x,y&cht=bhs&chco=76A4FB&chls=2.0&chbh=62,4,1&chs=600x416&chxl=-1:|ajv|@exodus/schemasafe|is-my-json-valid|djv|@cfworker/json-schema|jsonschema/=t:100,69.2,51.5,13.1,5.1,1.2)](https://github.com/ebdrup/json-schema-benchmark/blob/master/README.md#performance)\n\n## Features\n\n- Ajv implements JSON Schema [draft-06/07/2019-09/2020-12](http://json-schema.org/) standards (draft-04 is supported in v6):\n  - all validation keywords (see [JSON Schema validation keywords](https://ajv.js.org/json-schema.html))\n  - [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md) extensions:\n    - NEW: keyword [discriminator](https://ajv.js.org/json-schema.html#discriminator).\n    - keyword [nullable](https://ajv.js.org/json-schema.html#nullable).\n  - full support of remote references (remote schemas have to be added with `addSchema` or compiled to be available)\n  - support of recursive references between schemas\n  - correct string lengths for strings with unicode pairs\n  - JSON Schema [formats](https://ajv.js.org/guide/formats.html) (with [ajv-formats](https://github.com/ajv-validator/ajv-formats) plugin).\n  - [validates schemas against meta-schema](https://ajv.js.org/api.html#api-validateschema)\n- NEW: supports [JSON Type Definition](https://datatracker.ietf.org/doc/rfc8927/):\n  - all keywords (see [JSON Type Definition schema forms](https://ajv.js.org/json-type-definition.html))\n  - meta-schema for JTD schemas\n  - \"union\" keyword and user-defined keywords (can be used inside \"metadata\" member of the schema)\n- supports [browsers](https://ajv.js.org/guide/environments.html#browsers) and Node.js 10.x - current\n- [asynchronous loading](https://ajv.js.org/guide/managing-schemas.html#asynchronous-schema-loading) of referenced schemas during compilation\n- \"All errors\" validation mode with [option allErrors](https://ajv.js.org/options.html#allerrors)\n- [error messages with parameters](https://ajv.js.org/api.html#validation-errors) describing error reasons to allow error message generation\n- i18n error messages support with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package\n- [removing-additional-properties](https://ajv.js.org/guide/modifying-data.html#removing-additional-properties)\n- [assigning defaults](https://ajv.js.org/guide/modifying-data.html#assigning-defaults) to missing properties and items\n- [coercing data](https://ajv.js.org/guide/modifying-data.html#coercing-data-types) to the types specified in `type` keywords\n- [user-defined keywords](https://ajv.js.org/guide/user-keywords.html)\n- additional extension keywords with [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package\n- [\\$data reference](https://ajv.js.org/guide/combining-schemas.html#data-reference) to use values from the validated data as values for the schema keywords\n- [asynchronous validation](https://ajv.js.org/guide/async-validation.html) of user-defined formats and keywords\n\n## Install\n\nTo install version 8:\n\n```\nnpm install ajv\n```\n\n## <a name=\"usage\"></a>Getting started\n\nTry it in the Node.js REPL: https://runkit.com/npm/ajv\n\nIn JavaScript:\n\n```javascript\n// or ESM/TypeScript import\nimport Ajv from \"ajv\"\n// Node.js require:\nconst Ajv = require(\"ajv\")\n\nconst ajv = new Ajv() // options can be passed, e.g. {allErrors: true}\n\nconst schema = {\n  type: \"object\",\n  properties: {\n    foo: {type: \"integer\"},\n    bar: {type: \"string\"},\n  },\n  required: [\"foo\"],\n  additionalProperties: false,\n}\n\nconst data = {\n  foo: 1,\n  bar: \"abc\",\n}\n\nconst validate = ajv.compile(schema)\nconst valid = validate(data)\nif (!valid) console.log(validate.errors)\n```\n\nLearn how to use Ajv and see more examples in the [Guide: getting started](https://ajv.js.org/guide/getting-started.html)\n\n## Changes history\n\nSee [https://github.com/ajv-validator/ajv/releases](https://github.com/ajv-validator/ajv/releases)\n\n**Please note**: [Changes in version 8.0.0](https://github.com/ajv-validator/ajv/releases/tag/v8.0.0)\n\n[Version 7.0.0](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0)\n\n[Version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0).\n\n## Code of conduct\n\nPlease review and follow the [Code of conduct](./CODE_OF_CONDUCT.md).\n\nPlease report any unacceptable behaviour to ajv.validator@gmail.com - it will be reviewed by the project team.\n\n## Security contact\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues.\n\n## Open-source software support\n\nAjv is a part of [Tidelift subscription](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=readme) - it provides a centralised support to open-source software users, in addition to the support provided by software maintainers.\n\n## License\n\n[MIT](./LICENSE)\n"
  },
  {
    "path": "benchmark/jtd.js",
    "content": "/* eslint-disable no-empty */\n/* eslint-disable no-console */\nconst Ajv = require(\"ajv/dist/jtd\")\nconst Benchmark = require(\"benchmark\")\nconst jtdValidationTests = require(\"../spec/json-typedef-spec/tests/validation.json\")\n\nconst ajv = new Ajv()\nconst suite = new Benchmark.Suite()\nconst tests = []\n\nfor (const testName in jtdValidationTests) {\n  const {schema, instance, errors} = jtdValidationTests[testName]\n  const valid = errors.length === 0\n  if (!valid) continue\n  tests.push({\n    validate: ajv.compile(schema),\n    serialize: ajv.compileSerializer(schema),\n    parse: ajv.compileParser(schema),\n    data: instance,\n    json: JSON.stringify(instance),\n  })\n}\n\n// suite.add(\"JTD test suite: compiled JTD serializers\", () => {\n//   for (const test of tests) {\n//     test.serialize(test.data)\n//   }\n// })\n\n// suite.add(\"JTD test suite: JSON.stringify\", () => {\n//   for (const test of tests) {\n//     JSON.stringify(test.data)\n//   }\n// })\n\nconst testSchema = {\n  definitions: {\n    obj: {\n      properties: {\n        foo: {type: \"string\"},\n        bar: {type: \"int8\"},\n      },\n    },\n  },\n  properties: {\n    a: {ref: \"obj\"},\n  },\n  optionalProperties: {\n    b: {ref: \"obj\"},\n  },\n}\n\nconst testData = {\n  a: {\n    foo: \"foo1\",\n    bar: 1,\n  },\n  b: {\n    foo: \"foo2\",\n    bar: 2,\n  },\n}\n\n// const serializer = ajv.compileSerializer(testSchema)\n\n// suite.add(\"test data: compiled JTD serializer\", () => serializer(testData))\n// suite.add(\"test data: JSON.stringify\", () => JSON.stringify(testData))\n\nsuite.add(\"JTD test suite: compiled JTD parsers\", () => {\n  for (const test of tests) {\n    test.parse(test.json)\n  }\n})\n\nsuite.add(\"JTD test suite: JSON.parse\", () => {\n  for (const test of tests) {\n    JSON.parse(test.json)\n  }\n})\n\nsuite.add(\"JTD test suite: JSON.parse + validate\", () => {\n  for (const test of tests) {\n    JSON.parse(test.json)\n  }\n})\n\nconst validTestData = JSON.stringify(testData)\n\nconst invalidTestData = JSON.stringify({\n  a: {\n    foo: \"foo1\",\n    bar: \"1\",\n  },\n  b: {\n    foo: \"foo2\",\n    bar: 2,\n  },\n})\n\nconst parse = ajv.compileParser(testSchema)\nconst validate = ajv.compile(testSchema)\n\nsuite.add(\"valid test data: compiled JTD parser\", () => parse(validTestData))\nsuite.add(\"valid test data: JSON.parse\", () => JSON.parse(validTestData))\nsuite.add(\"valid test data: JSON.parse + validate\", () => validate(JSON.parse(validTestData)))\nsuite.add(\"invalid test data: compiled JTD parser\", () => parse(invalidTestData))\nsuite.add(\"invalid test data: JSON.parse\", () => JSON.parse(invalidTestData))\nsuite.add(\"invalid test data: JSON.parse + validate\", () => validate(JSON.parse(invalidTestData)))\n\nconsole.log()\n\nsuite\n  .on(\"cycle\", (event) => console.log(String(event.target)))\n  .on(\"complete\", function () {\n    // eslint-disable-next-line no-invalid-this\n    console.log('The fastest is \"' + this.filter(\"fastest\").map(\"name\") + '\"')\n  })\n  .run({async: true})\n"
  },
  {
    "path": "benchmark/package.json",
    "content": "{\n  \"private\": true,\n  \"devDependencies\": {\n    \"benchmark\": \"^2.1.4\"\n  }\n}\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"ajv\",\n  \"description\": \"Another JSON Schema Validator\",\n  \"main\": \"bundle/ajv.min.js\",\n  \"authors\": [\"Evgeny Poberezkin\"],\n  \"license\": \"MIT\",\n  \"keywords\": [\"JSON\", \"schema\", \"validator\"],\n  \"homepage\": \"https://github.com/ajv-validator/ajv\",\n  \"moduleType\": [\"amd\", \"globals\", \"node\"],\n  \"ignore\": [\"node_modules\", \"bower_components\", \"spec\"]\n}\n"
  },
  {
    "path": "docs/.vuepress/components/Button.vue",
    "content": "<template>\n  <a :href=\"link\" :class=\"cssClass\" class=\"button\"><slot /></a>\n</template>\n\n<script>\nexport default {\n  props: {\n    link: {\n      type: String,\n    },\n    cssClass: {\n      type: String,\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\na.button\n  display block\n  width 114px\n  height 38px\n  line-height 38px\n  background-color $ajvGreenColor\n  border-radius 6px\n  color white\n  text-align center\n  font-weight 600\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Column.vue",
    "content": "<template>\n  <div :class=\"side\" class=\"column\">\n    <slot />\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    side: {\n      type: String,\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.column\n  margin-bottom 22px\n\n  @media only screen and (min-width: $MQMobile)\n    &.left\n      width 33%\n      margin-right 5%\n\n    &.right\n      width 62%\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Columns.vue",
    "content": "<template>\n  <div class=\"columns\">\n    <slot />\n  </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n@media only screen and (min-width: $MQMobile)\n  .columns\n    display flex\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Contributors.vue",
    "content": "<template>\n  <div>\n    <a\n      v-for=\"(contributor, i) in contributors\"\n      class=\"contributor\"\n      :style=\"'background-position: ' + (100 * i) / (contributors.length - 1) + '% 0'\"\n      :href=\"'https://github.com/' + contributor\"\n    >\n      {{ contributor }}\n    </a>\n  </div>\n</template>\n\n<script>\nimport contributors from \"./Contributors/_contributors.js\"\nexport default {\n  data() {\n    return {\n      contributors: contributors,\n    }\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.contributor\n  width 3.26em\n  height 3.26em\n  border-radius 50%\n  text-indent -9999px\n  display inline-block\n  background no-repeat url('./Contributors/contributors.jpg')\n  background-size auto 102%\n  margin 0 0.67em 0.67em 0\n  border 2px solid var(--second)\n  @media only screen and (min-width: $MQMobileSmall)\n    width 3.625em\n    height 3.625em\n    margin 0 0.8em 0.8em 0\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Feature.vue",
    "content": "<template>\n  <div :class=\"type\">\n    <slot />\n    <a class=\"read-more\" :href=\"link\">\n      <img src=\"./Feature/arrow.svg\" />\n    </a>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    type: {\n      type: String,\n    },\n    link: {\n      type: String,\n    },\n  },\n}\n</script>\n\n\n<style lang=\"stylus\" scoped>\ndiv\n  height 200px\n  box-sizing border-box\n  padding 28px\n  border-radius 8px\n  position relative\n  color #fff\n  margin-bottom 25px\n\n  @media only screen and (min-width: $MQMobileNarrow)\n    height 160px\n\n  @media only screen and (min-width: $MQMobile)\n    width 31.25%\n    height 225px\n    margin-right 3%\n    margin-bottom 0\n\n  h3\n    margin 0 0\n    @media only screen and (min-width: $MQNarrow)\n      font-size 1.75em\n\n    .header-anchor\n      display none\n\n  p\n    @media only screen and (min-width: $MQNarrow)\n      font-size 1.25em\n\n  &.less-code\n    background-color $ajvGreenColor\n\n  &.fast-secure\n    background-color $ajvBlueColor\n\n  &.multi-spec\n    background-color $ajvRedColor\n\n@media only screen and (min-width: $MQMobile)\n  div:last-child\n    margin-right 0\n\na\n  position absolute\n  bottom 24px\n  right 24px\n  color #fff\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Features.vue",
    "content": "<template>\n  <div class=\"features\">\n    <slot />\n  </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.features\n  padding 60px 0\n\n  @media only screen and (min-width: $MQMobile)\n    display flex\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/FooterColumn.vue",
    "content": "<template>\n  <div :class=\"type\" class=\"column\">\n    <slot />\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    type: {\n      type: String,\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\ndiv\n  @media only screen and (min-width: $MQMobile)\n    width 25%\n\np\n  a\n    color $textColor\n    font-weight normal\n    &:hover\n      text-decoration underline\n\n  @media only screen and (max-width: $MQMobile)\n    margin 0\n    line-height 30px\n\n.column\n  img\n    display block\n    margin 0 auto\n\n  &.ajv\n    img\n      margin 0 0\n      width 100px      \n      @media only screen and (max-width: $MQMobile)\n        margin-bottom 34px\n\n\n  &.links a\n    color $textColor\n    font-weight normal\n\n  &.sponsors\n    @media only screen and (max-width: $MQMobile)\n      a:first-child\n        display block\n        margin-top 80px\n\n    img\n      width 140px\n      padding 0 20px 15px\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/FooterColumns.vue",
    "content": "<template>\n  <div class=\"footer-columns\">\n    <slot />\n  </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.footer-columns\n  padding 20px 0 60px\n  border-bottom 1px solid #C4C4C4\n\n  @media only screen and (min-width: $MQMobile)\n    display flex\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/GitHub.vue",
    "content": "<template>\n  <ClientOnly>\n    <span>\n      <a\n        class=\"github-button\"\n        href=\"https://github.com/ajv-validator/ajv\"\n        data-show-count=\"true\"\n        data-size=\"large\"\n        aria-label=\"Star ajv-validator/ajv on GitHub\"\n      >\n        Star\n      </a>\n    </span>\n  </ClientOnly>\n</template>\n\n<script>\nexport default {\n  mounted() {\n    let githubScript = document.createElement(\"script\")\n    githubScript.setAttribute(\"src\", \"https://buttons.github.io/buttons.js\")\n    document.head.appendChild(githubScript)\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\nspan\n  vertical-align -8px\n  padding-left 20px\n  @media only screen and (max-width: $MQMobile)\n    vertical-align -21px\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/HeroSection.vue",
    "content": "<template>\n  <div class=\"hero-section\">\n    <div class=\"section-content\">\n      <img src=\"./HeroSection/hero-image.svg\" class=\"hero-image\" />\n      <div class=\"section-content-wrapper\">\n        <slot />\n      </div>\n    </div>\n  </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.hero-section\n  width 100%\n  padding 50px 0\n  padding-top $navbarHeight\n  overflow hidden\n\n  .section-content\n    position relative\n    max-width 1000px\n    padding 0 50px\n    margin 0 auto\n    @media only screen and (max-width: $MQMobile)\n      padding 0 40px\n    @media only screen and (max-width: $MQMobileNarrow)\n      padding 0 30px\n\n    .section-content-wrapper\n      position relative\n      z-index 2\n\n  .hero-image\n    position absolute\n    z-index 1\n    width 658px\n    top -400px\n    left -25px\n\n    @media only screen and (min-width: $MQMobileNarrow)\n      width 823px\n      top -500px\n      left 50px\n\n    @media only screen and (min-width: $MQMobile)\n      top -430px\n      left 330px\n\n    @media only screen and (min-width: $MQNarrow)\n      width 1097px\n      top -575px\n      left 425px\n\n  background linear-gradient(304.33deg, rgba(237, 237, 237, 0.31) -7.48%, #C6E1FF 30.07%, rgba(237, 237, 237, 0.26) 82.76%)\n\n  .header-anchor\n    display none\n\n  h1\n    font-size 2em\n    margin-top 200px\n  h2\n    border-bottom none\n\n  @media only screen and (min-width: $MQMobileNarrow)\n    h1\n      font-size 3em\n    h2\n      font-size 1.75em\n\n  @media only screen and (min-width: $MQMobile)\n    h1, h2\n      margin-left 48px\n\n  @media only screen and (min-width: $MQNarrow)\n    h1\n      font-size 4em\n    h2\n      font-size 2.25em\n    h1, h2\n      margin-left 64px\n</style>"
  },
  {
    "path": "docs/.vuepress/components/HomePage.vue",
    "content": "<template>\n  <main class=\"homepage\">\n    <slot name=\"top\" />\n\n    <Content />\n\n    <slot name=\"bottom\" />\n  </main>\n</template>\n\n<style lang=\"stylus\" scoped>\n@require '../theme/styles/wrapper.styl'\n\n.homepage\n  padding 0 0 0 0\n  box-sizing content-box\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/HomeSection.vue",
    "content": "<template>\n  <div class=\"home-section\" :class=\"section\">\n    <div class=\"section-content\">\n      <slot />\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    section: {\n      type: String,\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.home-section\n  width 100%\n  padding 50px 0\n  padding-top $navbarHeight\n\n  .section-content\n    max-width 1000px\n    padding 0 50px\n    margin 0 auto\n    @media only screen and (max-width: $MQMobile)\n      padding 0 40px\n    @media only screen and (max-width: $MQMobileNarrow)\n      padding 0 30px\n\n  & >>> .theme-code-group\n    button\n      position relative\n      outline none\n      z-index 1\n\n  &.testimonials\n    background linear-gradient(295.26deg, rgba(232, 232, 232, 0.8) 26.65%, rgba(255, 255, 255, 0.04) 83.48%)\n\n  &.contributors\n    background linear-gradient(295.26deg, rgba(232, 232, 232, 0.8) 26.65%, rgba(255, 255, 255, 0.04) 83.48%)\n\n  &.footer\n    background linear-gradient(295.26deg, rgba(232, 232, 232, 0.8) 26.65%, rgba(255, 255, 255, 0.04) 83.48%)\n\n    p\n      padding 20px 0 0\n      text-align center\n      color #292828\n\n      a\n        color $textColor\n        font-weight normal\n        &:hover\n          text-decoration underline\n</style>"
  },
  {
    "path": "docs/.vuepress/components/NewsHome.vue",
    "content": "<template>\n  <div>\n    <div v-for=\"(post, i) in posts\" class=\"post\">\n      <Columns>\n        <Column side=\"left\">\n          <h3>{{ post.frontmatter.title }}</h3>\n          <NewsPostMeta :date=\"post.frontmatter.date\" />\n        </Column>\n\n        <Column side=\"right\">\n          <div v-html=\"post.excerpt\"></div>\n          <Button :link=\"post.path\" cssClass=\"read-more\" v-if=\"post.frontmatter.more !== false\">Read more</Button>\n        </Column>\n      </Columns>\n    </div>\n    <p class=\"subscribe\">\n      <Subscribe />\n      <a href=\"/news/\" class=\"all-news\">All news</a>\n    </p>\n  </div>\n</template>\n\n<script>\nexport default {\n  computed: {\n    posts() {\n      return this.$site.pages\n        .filter((x) => x.path.startsWith(\"/news/\") && !x.frontmatter.newsIndex)\n        .sort((a, b) => new Date(b.frontmatter.date) - new Date(a.frontmatter.date))\n        .slice(0, 3)\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.post\n  display flex\n  border-bottom 1px solid #eaecef\n\n  &:last-child\n    border-bottom none\n\n  a.read-more\n    float right\n    margin 28px 0\n\np.subscribe\n  margin-top 2em\n\n  a.all-news\n    display block\n    margin-top 1rem\n\n    @media only screen and (min-width: $MQMobileNarrow)\n      display inline-block\n      float right\n      margin-top 0\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/NewsIndex.vue",
    "content": "<template>\n  <div>\n    <div v-for=\"post in posts\">\n      <h2>{{ post.frontmatter.title }}</h2>\n\n      <router-link :to=\"post.path\">\n        <NewsPostMeta :date=\"post.frontmatter.date\" />\n      </router-link>\n\n      <div v-html=\"post.excerpt\"></div>\n\n      <p v-if=\"post.frontmatter.more !== false\">\n        <router-link :to=\"post.path\">Read more</router-link>\n      </p>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  computed: {\n    posts() {\n      return this.$site.pages\n        .filter((x) => x.path.startsWith(\"/news/\") && !x.frontmatter.newsIndex)\n        .sort((a, b) => new Date(b.frontmatter.date) - new Date(a.frontmatter.date))\n    },\n  },\n}\n</script>\n"
  },
  {
    "path": "docs/.vuepress/components/NewsPost.vue",
    "content": "<template>\n  <main class=\"page\">\n    <slot name=\"top\" />\n\n    <div class=\"theme-default-content\" style=\"padding-bottom: 0px\">\n      <h1>{{ $page.frontmatter.title }}</h1>\n      <NewsPostMeta :date=\"$page.frontmatter.date\" />\n    </div>\n\n    <Content class=\"theme-default-content\" style=\"padding-top: 0px\" />\n    <PageEdit />\n\n    <slot name=\"bottom\" />\n  </main>\n</template>\n\n<script>\nimport PageEdit from \"@theme/components/PageEdit.vue\"\n\nexport default {\n  components: {PageEdit},\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n@require '../theme/styles/wrapper.styl'\n\n.page\n  padding-bottom 2rem\n  display block\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/NewsPostMeta.vue",
    "content": "<template>\n  <div class=\"post-meta\">\n    <time class=\"pub-date\" pubdate itemprop=\"datePublished\" :datetime=\"date\">\n      {{ resolvedDate }}\n    </time>\n  </div>\n</template>\n\n<script>\nimport dayjs from \"dayjs\"\nimport dayjsPluginUTC from \"dayjs/plugin/utc\"\n\ndayjs.extend(dayjsPluginUTC)\n\nexport default {\n  props: {\n    date: {\n      type: String,\n    },\n  },\n  computed: {\n    resolvedDate() {\n      return dayjs.utc(this.date).format(\"MMMM D, YYYY\")\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.post-meta > div\n  display inline-flex\n\n.pub-date\n  color #808080\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Projects.vue",
    "content": "<template>\n  <div class=\"projects\">\n    <slot />\n  </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.projects\n  p\n    max-width 1100px\n    padding 0\n\n  img\n    display inline-block\n    max-width 240px\n    height 40px\n    line-height 40px\n    vertical-align middle\n    @media only screen and (max-width: $MQMobile)\n      max-width 160px\n      height 30px\n      line-height 30px\n\n  a\n    display inline-block\n    height 40px\n    line-height 40px\n    vertical-align middle\n    margin 0 36px 30px 0\n    font-size 28px\n    font-weight 500\n    color $textColor\n    @media only screen and (max-width: $MQMobile)\n      margin 0 24px 20px 0\n      height 30px\n      line-height 30px\n      font-size 20px\n\n    &:hover\n      text-decoration none\n\n    span\n      display none\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Sponsors.vue",
    "content": "<template>\n  <div class=\"sponsors\" :class=\"level\">\n    <slot />\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    level: {\n      type: String,\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.sponsors\n  max-width 800px\n  margin 0 auto\n\n  h2\n    margin-left 0\n    text-decoration none\n\n    a.header-anchor\n      width auto\n      margin-right 0\n  p\n    font-size 24px\n\n  &.platinum, &.gold, &.bronze\n    img\n      width 100%\n    a\n      margin-bottom 10px\n      display inline-block\n      @media only screen and (min-width: $MQMobileNarrow)\n        margin-bottom 0\n    a:last-child\n      margin-right 0\n\n  &.platinum\n    a\n      width 100%\n      display block\n      @media only screen and (min-width: $MQMobileNarrow)\n        display inline-block\n        width 45%\n        margin-right 8%\n\n  &.gold\n    a\n      width 45%\n      margin-right 4%\n      @media only screen and (min-width: $MQMobileNarrow)\n        width 31%\n        margin-right 2%\n\n  &.bronze\n    a\n      width 45%\n      margin-right 4%\n      @media only screen and (min-width: $MQMobileNarrow)\n        width 22%\n        margin-right 3%\n\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Subscribe.vue",
    "content": "<template>\n  <form\n    action=\"https://ajv.us1.list-manage.com/subscribe/post?u=4343a2a251fa30892c2360003&amp;id=304f51cbc3\"\n    method=\"post\"\n    target=\"_blank\"\n    novalidate\n  >\n    <label for=\"subscription-email\">Subscribe to Ajv news</label>\n    <input id=\"subscription-email\" name=\"EMAIL\" placeholder=\"Your email\" />\n    <div style=\"position: absolute; left: -5000px;\" aria-hidden=\"true\">\n      <input type=\"text\" name=\"b_4343a2a251fa30892c2360003_304f51cbc3\" tabindex=\"-1\" value=\"\">\n    </div>\n    <button type=\"submit\">Submit</button>\n  </form>\n</template>\n\n<style lang=\"stylus\" scoped>\nform\n  display inline-block\n\nlabel\n  display block\n  margin-bottom 1rem\n  @media only screen and (min-width: $MQMobile)\n    display inline-block\n    margin-bottom 0\n\ninput, button\n  font-family Raleway\n  font-size 16px\n  border 0px solid\n  outline none\n\ninput\n  border 1px solid #cfd4db\n  height 2rem\n  width 180px\n  border-radius 2rem\n  padding 0 0.5rem\n  margin 0 0.5rem 0 0\n  &:focus\n    border-color: $accentColor\n  @media only screen and (min-width: $MQMobile)\n    width 200px\n    margin 0 1rem\n\n\nbutton\n  width 114px\n  height 36px\n  line-height 36px\n  padding-top 0\n  background-color $ajvGreenColor\n  border-radius 6px\n  color white\n  text-align center\n  font-weight 600\n  display block\n  margin-top 1em\n  @media only screen and (min-width: $MQMobileSmall)\n    display inline-block\n    margin-top 0\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Testimonial.vue",
    "content": "<template>\n  <div class=\"testimonial-content\" :class=\"color\">\n    <slot />\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    color: {\n      type: String,\n    },\n  },\n}\n</script>\n\n<style lang=\"stylus\" scoped>\ndiv.testimonial-content\n  background-position center\n  overflow hidden\n  width 280px\n  background-repeat no-repeat\n  &.blue\n    background-image url(./Testimonial/testimonials-blue.svg)\n  &.green\n    background-image url(./Testimonial/testimonials-green.svg)\n  p\n    margin 0.9em 0\n    font-size 15px\n\n  @media only screen and (max-width 374px)\n    &.blue, &.green\n      background-image none\n      padding 0 0\n      p\n        font-size 15px\n\n  @media only screen and (max-width 500px)\n    width 100%\n    background-size 350px 156px\n    padding 0 calc(50% - 100px)\n    box-sizing border-box\n    p\n      font-size 12px\n\n  @media only screen and (min-width 500px)\n    height 212px\n    padding 0 75px\n    margin 40px auto 0\n\n  @media only screen and (min-width $MQNarrow)\n    padding 0 calc(25% - 140px)\n\n.header-anchor\n  display none\n</style>\n"
  },
  {
    "path": "docs/.vuepress/components/Testimonials.vue",
    "content": "<template>\n  <div class=\"testimonials\">\n    <slot />\n  </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.testimonials\n  padding 20px 0\n  @media only screen and (min-width $MQNarrow)\n    display flex\n</style>\n"
  },
  {
    "path": "docs/.vuepress/config.js",
    "content": "const {slugify} = require(\"@vuepress/shared-utils\")\n\nconst title = \"Ajv JSON schema validator\"\nconst description =\n  \"The fastest JSON schema Validator. Supports JSON Schema draft-04/06/07/2019-09/2020-12 and JSON Type Definition (RFC8927)\"\n\nmodule.exports = {\n  title,\n  description,\n  head: [\n    [\"link\", {rel: \"icon\", href: `/favicon.ico`}],\n    [\"meta\", {charset: \"utf-8\"}],\n    [\"meta\", {property: \"og:title\", content: title}],\n    [\"meta\", {property: \"og:description\", content: description}],\n    [\"meta\", {property: \"og:image\", content: \"https://ajv.js.org/img/ajv.png\"}],\n    [\"meta\", {itemprop: \"image\", content: \"https://ajv.js.org/img/ajv.png\"}],\n    [\"meta\", {name: \"twitter:card\", content: \"summary\"}],\n    [\"meta\", {name: \"twitter:title\", content: title}],\n    [\"meta\", {name: \"twitter:image:src\", content: \"https://ajv.js.org/img/ajv.png\"}],\n    [\"meta\", {name: \"apple-mobile-web-app-capable\", content: \"yes\"}],\n    [\"link\", {rel: \"apple-touch-icon\", href: `/img/apple-touch-icon.png`}],\n  ],\n  markdown: {\n    slugify: (str) => slugify(str.replace(/<Badge[^>]*\\/>/, \"\")),\n    toc: {includeLevel: [2, 3, 4]},\n  },\n  heroText: \"hello there\",\n  themeConfig: {\n    logo: \"/img/ajv.svg\",\n    nav: [\n      {text: \"Home\", link: \"/\"},\n      {\n        text: \"Guide\",\n        items: [\n          {link: \"/guide/why-ajv\", text: \"Why use Ajv\"},\n          {link: \"/guide/getting-started\", text: \"Getting started\"},\n          {link: \"/guide/typescript\", text: \"Using with TypeScript\"},\n          {link: \"/guide/schema-language\", text: \"Choosing schema language\"},\n          {link: \"/guide/managing-schemas\", text: \"Managing schemas\"},\n          {link: \"/guide/combining-schemas\", text: \"Combining schemas\"},\n          {link: \"/guide/formats\", text: \"Format validation\"},\n          {link: \"/guide/modifying-data\", text: \"Modifying data\"},\n          {link: \"/guide/user-keywords\", text: \"User-defined keywords\"},\n          {link: \"/guide/async-validation\", text: \"Asynchronous validation\"},\n          {link: \"/guide/environments\", text: \"Execution environments\"},\n        ],\n      },\n      {\n        text: \"Reference\",\n        items: [\n          {link: \"/api\", text: \"API Reference\"},\n          {link: \"/options\", text: \"Ajv options\"},\n          {link: \"/json-schema\", text: \"JSON Schema\"},\n          {link: \"/json-type-definition\", text: \"JSON Type Definition\"},\n          {link: \"/strict-mode\", text: \"Strict mode\"},\n          {link: \"/standalone\", text: \"Standalone validation code\"},\n          {link: \"/keywords\", text: \"User defined keywords\"},\n          {link: \"/coercion\", text: \"Type coercion rules\"},\n        ],\n      },\n      {\n        text: \"Learn more\",\n        items: [\n          {\n            text: \"Extending Ajv\",\n            items: [\n              {link: \"/packages/\", text: \"Extending Ajv\"},\n              {link: \"/packages/ajv-cli\", text: \"ajv-cli\"},\n              {link: \"/packages/ajv-errors\", text: \"ajv-errors\"},\n              {link: \"/packages/ajv-formats\", text: \"ajv-formats\"},\n              {link: \"/packages/ajv-i18n\", text: \"ajv-i18n\"},\n              {link: \"/packages/ajv-keywords\", text: \"ajv-keywords\"},\n            ],\n          },\n          {\n            text: \"Contributors\",\n            items: [\n              {link: \"/contributing\", text: \"Contributing guide\"},\n              {link: \"/codegen\", text: \"Code generation design\"},\n              {link: \"/components\", text: \"Code components\"},\n              {link: \"/code_of_conduct\", text: \"Code of Conduct\"},\n            ],\n          },\n          {\n            text: \"Information\",\n            items: [\n              {link: \"/news/\", text: \"News\"},\n              {link: \"/faq\", text: \"FAQ\"},\n              {link: \"/security\", text: \"Security\"},\n              {link: \"/v6-to-v8-migration\", text: \"Migrate from v6\"},\n              {link: \"/testimonials\", text: \"What users say\"},\n              {link: \"/license\", text: \"License\"},\n            ],\n          },\n        ],\n      },\n    ],\n    sidebar: [\n      {\n        title: \"Guide\",\n        children: [\n          \"/guide/why-ajv\",\n          \"/guide/getting-started\",\n          \"/guide/typescript\",\n          \"/guide/schema-language\",\n          \"/guide/managing-schemas\",\n          \"/guide/combining-schemas\",\n          \"/guide/formats\",\n          \"/guide/modifying-data\",\n          \"/guide/user-keywords\",\n          \"/guide/async-validation\",\n          \"/guide/environments\",\n        ],\n      },\n      {\n        title: \"Reference\",\n        children: [\n          \"/api\",\n          \"/options\",\n          \"/json-schema\",\n          \"/json-type-definition\",\n          \"/strict-mode\",\n          \"/standalone\",\n          \"/keywords\",\n          \"/coercion\",\n        ],\n      },\n      {\n        title: \"Extending Ajv\",\n        children: [\n          [\"/packages/\", \"Extending Ajv\"],\n          [\"/packages/ajv-formats\", \"ajv-formats\"],\n          [\"/packages/ajv-keywords\", \"ajv-keywords\"],\n          [\"/packages/ajv-errors\", \"ajv-errors\"],\n          [\"/packages/ajv-i18n\", \"ajv-i18n\"],\n          [\"/packages/ajv-cli\", \"ajv-cli\"],\n        ],\n      },\n      {\n        title: \"Contributors\",\n        children: [\n          \"/contributing\",\n          \"/codegen\",\n          \"/components\",\n          [\"/code_of_conduct\", \"Code of conduct\"],\n        ],\n      },\n      {\n        title: \"Information\",\n        children: [\n          \"/news/\",\n          \"/faq\",\n          \"/security\",\n          [\"/v6-to-v8-migration\", \"Migrate from v6 to v8\"],\n          \"/testimonials\",\n          [\"/license\", \"License\"],\n        ],\n      },\n    ],\n    repo: \"ajv-validator/ajv\",\n    docsDir: \"docs\",\n    editLinks: true,\n    activeHeaderLinks: false,\n  },\n}\n"
  },
  {
    "path": "docs/.vuepress/styles/index.styl",
    "content": "img + span > .icon.outbound {\n  display: none;\n}\n\nbody {\n  font-family: 'Raleway';\n  font-weight: normal;\n}\n\nstrong {\n  font-weight: 550;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  font-family: 'IstokWeb';\n  font-weight: normal;\n}\n\n.custom-block.tip {\n  border-color: $tipColor;\n  background-color: $attentionBoxColor;\n  color: $textColor;\n\n  .custom-block-title {\n    color: $textColor;\n  }\n}\n\n.custom-block.warning {\n  border-color: $warningColor;\n  background-color: $attentionBoxColor;\n  color: $textColor;\n\n  .custom-block-title {\n    color: $textColor;\n  }\n}\n\n.custom-block.danger {\n  border-color: $dangerColor;\n  background-color: $attentionBoxColor;\n  color: $textColor;\n\n  .custom-block-title {\n    color: $textColor;\n  }\n}\n\n.sidebar nav.nav-links div.nav-item {\n  display: none;\n}\n\nspan.badge {\n  font-family: 'Raleway';\n  font-weight: 500;\n}\n\n.theme-code-group .token.string {\n  color: $accentCode;\n}\n\n.theme-code-group button.theme-code-group__nav-tab.theme-code-group__nav-tab-active {\n  border-color: $accentCode;\n}\n\n.navbar span.site-name {\n  font-family: IstokWeb;\n  font-weight: 500;\n  font-size: 1.6em;\n}\n\np.sidebar-heading {\n  font-weight: 500;\n  font-size: 1em;\n}\n\na.sidebar-link.active {\n  font-weight: 500!important;\n}\n\n@font-face {\n  font-family: 'Raleway';\n  src: url(/fonts/Raleway-VariableFont_wght.ttf);\n}\n\n@font-face {\n  font-family: 'IstokWeb';\n  src: url(/fonts/IstokWeb-Regular.ttf);\n  font-weight: normal;\n}\n"
  },
  {
    "path": "docs/.vuepress/styles/palette.styl",
    "content": "$ajvBlueColor = #409cff\n$ajvGreenColor = #23c8d2 // #1fdca3\n$ajvRedColor = #f5775b\n\n$tipColor = $ajvGreenColor\n$warningColor = #f1f440\n$dangerColor = $ajvRedColor\n$attentionBoxColor = #f7f7f3\n\n$accentColor = #07aab4 // darken($ajvGreenColor, 15%)\n$accentCode = #7ec699\n$textColor = #292828\n$borderColor = #eaecef\n$codeBgColor = #282c34\n$arrowBgColor = #ccc\n$badgeTipColor = $ajvGreenColor\n$badgeWarningColor = #e9c400\n$badgeErrorColor = $ajvRedColor\n\n$MQMobileNarrow = 480px\n$MQMobileSmall = 414px\n"
  },
  {
    "path": "docs/.vuepress/theme/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "docs/.vuepress/theme/components/AlgoliaSearchBox.vue",
    "content": "<template>\n  <form\n    id=\"search-form\"\n    class=\"algolia-search-wrapper search-box\"\n    role=\"search\"\n  >\n    <input\n      id=\"algolia-search-input\"\n      class=\"search-query\"\n      :placeholder=\"placeholder\"\n    >\n  </form>\n</template>\n\n<script>\nexport default {\n  name: 'AlgoliaSearchBox',\n\n  props: ['options'],\n\n  data () {\n    return {\n      placeholder: undefined\n    }\n  },\n\n  watch: {\n    $lang (newValue) {\n      this.update(this.options, newValue)\n    },\n\n    options (newValue) {\n      this.update(newValue, this.$lang)\n    }\n  },\n\n  mounted () {\n    this.initialize(this.options, this.$lang)\n    this.placeholder = this.$site.themeConfig.searchPlaceholder || ''\n  },\n\n  methods: {\n    initialize (userOptions, lang) {\n      Promise.all([\n        import(/* webpackChunkName: \"docsearch\" */ 'docsearch.js/dist/cdn/docsearch.min.js'),\n        import(/* webpackChunkName: \"docsearch\" */ 'docsearch.js/dist/cdn/docsearch.min.css')\n      ]).then(([docsearch]) => {\n        docsearch = docsearch.default\n        const { algoliaOptions = {}} = userOptions\n        docsearch(Object.assign(\n          {},\n          userOptions,\n          {\n            inputSelector: '#algolia-search-input',\n            // #697 Make docsearch work well at i18n mode.\n            algoliaOptions: {\n              ...algoliaOptions,\n              facetFilters: [`lang:${lang}`].concat(algoliaOptions.facetFilters || [])\n            },\n            handleSelected: (input, event, suggestion) => {\n              const { pathname, hash } = new URL(suggestion.url)\n              const routepath = pathname.replace(this.$site.base, '/')\n              const _hash = decodeURIComponent(hash)\n              this.$router.push(`${routepath}${_hash}`)\n            }\n          }\n        ))\n      })\n    },\n\n    update (options, lang) {\n      this.$el.innerHTML = '<input id=\"algolia-search-input\" class=\"search-query\">'\n      this.initialize(options, lang)\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.algolia-search-wrapper\n  & > span\n    vertical-align middle\n  .algolia-autocomplete\n    line-height normal\n    .ds-dropdown-menu\n      background-color #fff\n      border 1px solid #999\n      border-radius 4px\n      font-size 16px\n      margin 6px 0 0\n      padding 4px\n      text-align left\n      &:before\n        border-color #999\n      [class*=ds-dataset-]\n        border none\n        padding 0\n      .ds-suggestions\n        margin-top 0\n      .ds-suggestion\n        border-bottom 1px solid $borderColor\n    .algolia-docsearch-suggestion--highlight\n      color #2c815b\n    .algolia-docsearch-suggestion\n      border-color $borderColor\n      padding 0\n      .algolia-docsearch-suggestion--category-header\n        padding 5px 10px\n        margin-top 0\n        background $accentColor\n        color #fff\n        font-weight 600\n        .algolia-docsearch-suggestion--highlight\n          background rgba(255, 255, 255, 0.6)\n      .algolia-docsearch-suggestion--wrapper\n        padding 0\n      .algolia-docsearch-suggestion--title\n        font-weight 600\n        margin-bottom 0\n        color $textColor\n      .algolia-docsearch-suggestion--subcategory-column\n        vertical-align top\n        padding 5px 7px 5px 5px\n        border-color $borderColor\n        background #f1f3f5\n        &:after\n          display none\n      .algolia-docsearch-suggestion--subcategory-column-text\n        color #555\n    .algolia-docsearch-footer\n      border-color $borderColor\n    .ds-cursor .algolia-docsearch-suggestion--content\n      background-color #e7edf3 !important\n      color $textColor\n\n@media (min-width: $MQMobile)\n  .algolia-search-wrapper\n    .algolia-autocomplete\n      .algolia-docsearch-suggestion\n        .algolia-docsearch-suggestion--subcategory-column\n          float none\n          width 150px\n          min-width 150px\n          display table-cell\n        .algolia-docsearch-suggestion--content\n          float none\n          display table-cell\n          width 100%\n          vertical-align top\n        .ds-dropdown-menu\n          min-width 515px !important\n\n@media (max-width: $MQMobile)\n  .algolia-search-wrapper\n    .ds-dropdown-menu\n      min-width calc(100vw - 4rem) !important\n      max-width calc(100vw - 4rem) !important\n    .algolia-docsearch-suggestion--wrapper\n      padding 5px 7px 5px 5px !important\n    .algolia-docsearch-suggestion--subcategory-column\n      padding 0 !important\n      background white !important\n    .algolia-docsearch-suggestion--subcategory-column-text:after\n      content \" > \"\n      font-size 10px\n      line-height 14.4px\n      display inline-block\n      width 5px\n      margin -3px 3px 0\n      vertical-align middle\n\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/DropdownLink.vue",
    "content": "<template>\n  <div\n    class=\"dropdown-wrapper\"\n    :class=\"{ open }\"\n  >\n    <button\n      class=\"dropdown-title\"\n      type=\"button\"\n      :aria-label=\"dropdownAriaLabel\"\n      @click=\"handleDropdown\"\n    >\n      <span class=\"title\">{{ item.text }}</span>\n      <span\n        class=\"arrow down\"\n      />\n    </button>\n    <button\n      class=\"mobile-dropdown-title\"\n      type=\"button\"\n      :aria-label=\"dropdownAriaLabel\"\n      @click=\"setOpen(!open)\"\n    >\n      <span class=\"title\">{{ item.text }}</span>\n      <span\n        class=\"arrow\"\n        :class=\"open ? 'down' : 'right'\"\n      />\n    </button>\n\n    <DropdownTransition>\n      <ul\n        v-show=\"open\"\n        class=\"nav-dropdown\"\n      >\n        <li\n          v-for=\"(subItem, index) in item.items\"\n          :key=\"subItem.link || index\"\n          class=\"dropdown-item\"\n        >\n          <h4 v-if=\"subItem.type === 'links'\">\n            {{ subItem.text }}\n          </h4>\n\n          <ul\n            v-if=\"subItem.type === 'links'\"\n            class=\"dropdown-subitem-wrapper\"\n          >\n            <li\n              v-for=\"childSubItem in subItem.items\"\n              :key=\"childSubItem.link\"\n              class=\"dropdown-subitem\"\n            >\n              <NavLink\n                :item=\"childSubItem\"\n                @focusout=\"\n                  isLastItemOfArray(childSubItem, subItem.items) &&\n                    isLastItemOfArray(subItem, item.items) &&\n                    setOpen(false)\n                \"\n              />\n            </li>\n          </ul>\n\n          <NavLink\n            v-else\n            :item=\"subItem\"\n            @focusout=\"isLastItemOfArray(subItem, item.items) && setOpen(false)\"\n          />\n        </li>\n      </ul>\n    </DropdownTransition>\n  </div>\n</template>\n\n<script>\nimport NavLink from '@theme/components/NavLink.vue'\nimport DropdownTransition from '@theme/components/DropdownTransition.vue'\nimport last from 'lodash/last'\n\nexport default {\n  name: 'DropdownLink',\n\n  components: {\n    NavLink,\n    DropdownTransition\n  },\n\n  props: {\n    item: {\n      required: true\n    }\n  },\n\n  data () {\n    return {\n      open: false\n    }\n  },\n\n  computed: {\n    dropdownAriaLabel () {\n      return this.item.ariaLabel || this.item.text\n    }\n  },\n\n  watch: {\n    $route () {\n      this.open = false\n    }\n  },\n\n  methods: {\n    setOpen (value) {\n      this.open = value\n    },\n\n    isLastItemOfArray (item, array) {\n      return last(array) === item\n    },\n\n    /**\n     * Open the dropdown when user tab and click from keyboard.\n     *\n     * Use event.detail to detect tab and click from keyboard. Ref: https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail\n     * The Tab + Click is UIEvent > KeyboardEvent, so the detail is 0.\n     */\n    handleDropdown () {\n      const isTriggerByTab = event.detail === 0\n      if (isTriggerByTab) this.setOpen(!this.open)\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.dropdown-wrapper\n  cursor pointer\n  .dropdown-title\n    display block\n    font-size 0.9rem\n    font-family inherit\n    cursor inherit\n    padding inherit\n    line-height 1.4rem\n    background transparent\n    border none\n    font-weight 500\n    color $textColor\n    &:hover\n      border-color transparent\n    .arrow\n      vertical-align middle\n      margin-top -1px\n      margin-left 0.4rem\n  .mobile-dropdown-title\n    @extends .dropdown-title\n    display none\n    font-weight 600\n    font-size inherit\n      &:hover\n        color $accentColor\n  .nav-dropdown\n    .dropdown-item\n      color inherit\n      line-height 1.7rem\n      h4\n        margin 0.45rem 0 0\n        border-top 1px solid #eee\n        padding 1rem 1.5rem 0.45rem 1.25rem\n      .dropdown-subitem-wrapper\n        padding 0\n        list-style none\n        .dropdown-subitem\n          font-size 0.9em\n      a\n        display block\n        line-height 1.7rem\n        position relative\n        border-bottom none\n        font-weight 400\n        margin-bottom 0\n        padding 0 1.5rem 0 1.25rem\n        &:hover\n          color $accentColor\n        &.router-link-active\n          color $accentColor\n          &::after\n            content \"\"\n            width 0\n            height 0\n            border-left 5px solid $accentColor\n            border-top 3px solid transparent\n            border-bottom 3px solid transparent\n            position absolute\n            top calc(50% - 2px)\n            left 9px\n      &:first-child h4\n        margin-top 0\n        padding-top 0\n        border-top 0\n\n@media (max-width: $MQMobile)\n  .dropdown-wrapper\n    &.open .dropdown-title\n      margin-bottom 0.5rem\n    .dropdown-title\n      display: none\n    .mobile-dropdown-title\n      display: block\n    .nav-dropdown\n      transition height .1s ease-out\n      overflow hidden\n      .dropdown-item\n        h4\n          border-top 0\n          margin-top 0\n          padding-top 0\n        h4, & > a\n          font-size 15px\n          line-height 2rem\n        .dropdown-subitem\n          font-size 14px\n          padding-left 1rem\n\n@media (min-width: $MQMobile)\n  .dropdown-wrapper\n    height 1.8rem\n    &:hover .nav-dropdown,\n    &.open .nav-dropdown\n      // override the inline style.\n      display block !important\n    &.open:blur\n      display none\n    .nav-dropdown\n      display none\n      // Avoid height shaked by clicking\n      height auto !important\n      box-sizing border-box;\n      max-height calc(100vh - 2.7rem)\n      overflow-y auto\n      position absolute\n      top 100%\n      right 0\n      background-color #fff\n      padding 0.6rem 0\n      border 1px solid #ddd\n      border-bottom-color #ccc\n      text-align left\n      border-radius 0.25rem\n      white-space nowrap\n      margin 0\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/DropdownTransition.vue",
    "content": "<template>\n  <transition\n    name=\"dropdown\"\n    @enter=\"setHeight\"\n    @after-enter=\"unsetHeight\"\n    @before-leave=\"setHeight\"\n  >\n    <slot />\n  </transition>\n</template>\n\n<script>\nexport default {\n  name: 'DropdownTransition',\n\n  methods: {\n    setHeight (items) {\n      // explicitly set height so that it can be transitioned\n      items.style.height = items.scrollHeight + 'px'\n    },\n\n    unsetHeight (items) {\n      items.style.height = ''\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.dropdown-enter, .dropdown-leave-to\n  height 0 !important\n\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/Home.vue",
    "content": "<template>\n  <main\n    class=\"home\"\n    :aria-labelledby=\"data.heroText !== null ? 'main-title' : null\"\n  >\n    <header class=\"hero\">\n      <img\n        v-if=\"data.heroImage\"\n        :src=\"$withBase(data.heroImage)\"\n        :alt=\"data.heroAlt || 'hero'\"\n      >\n\n      <h1\n        v-if=\"data.heroText !== null\"\n        id=\"main-title\"\n      >\n        {{ data.heroText || $title || 'Hello' }}\n      </h1>\n\n      <p\n        v-if=\"data.tagline !== null\"\n        class=\"description\"\n      >\n        {{ data.tagline || $description || 'Welcome to your VuePress site' }}\n      </p>\n\n      <p\n        v-if=\"data.actionText && data.actionLink\"\n        class=\"action\"\n      >\n        <NavLink\n          class=\"action-button\"\n          :item=\"actionLink\"\n        />\n      </p>\n    </header>\n\n    <div\n      v-if=\"data.features && data.features.length\"\n      class=\"features\"\n    >\n      <div\n        v-for=\"(feature, index) in data.features\"\n        :key=\"index\"\n        class=\"feature\"\n      >\n        <h2>{{ feature.title }}</h2>\n        <p>{{ feature.details }}</p>\n      </div>\n    </div>\n\n    <Content class=\"theme-default-content custom\" />\n\n    <div\n      v-if=\"data.footer\"\n      class=\"footer\"\n    >\n      {{ data.footer }}\n    </div>\n  </main>\n</template>\n\n<script>\nimport NavLink from '@theme/components/NavLink.vue'\n\nexport default {\n  name: 'Home',\n\n  components: { NavLink },\n\n  computed: {\n    data () {\n      return this.$page.frontmatter\n    },\n\n    actionLink () {\n      return {\n        link: this.data.actionLink,\n        text: this.data.actionText\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.home\n  padding $navbarHeight 2rem 0\n  max-width $homePageWidth\n  margin 0px auto\n  display block\n  .hero\n    text-align center\n    img\n      max-width: 100%\n      max-height 280px\n      display block\n      margin 3rem auto 1.5rem\n    h1\n      font-size 3rem\n    h1, .description, .action\n      margin 1.8rem auto\n    .description\n      max-width 35rem\n      font-size 1.6rem\n      line-height 1.3\n      color lighten($textColor, 40%)\n    .action-button\n      display inline-block\n      font-size 1.2rem\n      color #fff\n      background-color $accentColor\n      padding 0.8rem 1.6rem\n      border-radius 4px\n      transition background-color .1s ease\n      box-sizing border-box\n      border-bottom 1px solid darken($accentColor, 10%)\n      &:hover\n        background-color lighten($accentColor, 10%)\n  .features\n    border-top 1px solid $borderColor\n    padding 1.2rem 0\n    margin-top 2.5rem\n    display flex\n    flex-wrap wrap\n    align-items flex-start\n    align-content stretch\n    justify-content space-between\n  .feature\n    flex-grow 1\n    flex-basis 30%\n    max-width 30%\n    h2\n      font-size 1.4rem\n      font-weight 500\n      border-bottom none\n      padding-bottom 0\n      color lighten($textColor, 10%)\n    p\n      color lighten($textColor, 25%)\n  .footer\n    padding 2.5rem\n    border-top 1px solid $borderColor\n    text-align center\n    color lighten($textColor, 25%)\n\n@media (max-width: $MQMobile)\n  .home\n    .features\n      flex-direction column\n    .feature\n      max-width 100%\n      padding 0 2.5rem\n\n@media (max-width: $MQMobileNarrow)\n  .home\n    padding-left 1.5rem\n    padding-right 1.5rem\n    .hero\n      img\n        max-height 210px\n        margin 2rem auto 1.2rem\n      h1\n        font-size 2rem\n      h1, .description, .action\n        margin 1.2rem auto\n      .description\n        font-size 1.2rem\n      .action-button\n        font-size 1rem\n        padding 0.6rem 1.2rem\n    .feature\n      h2\n        font-size 1.25rem\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/NavLink.vue",
    "content": "<template>\n  <RouterLink\n    v-if=\"isInternal\"\n    class=\"nav-link\"\n    :to=\"link\"\n    :exact=\"exact\"\n    @focusout.native=\"focusoutAction\"\n  >\n    {{ item.text }}\n  </RouterLink>\n  <a\n    v-else\n    :href=\"link\"\n    class=\"nav-link external\"\n    :target=\"target\"\n    :rel=\"rel\"\n    @focusout=\"focusoutAction\"\n  >\n    {{ item.text }}\n    <OutboundLink v-if=\"isBlankTarget\" />\n  </a>\n</template>\n\n<script>\nimport { isExternal, isMailto, isTel, ensureExt } from '../util'\n\nexport default {\n  name: 'NavLink',\n\n  props: {\n    item: {\n      required: true\n    }\n  },\n\n  computed: {\n    link () {\n      return ensureExt(this.item.link)\n    },\n\n    exact () {\n      if (this.$site.locales) {\n        return Object.keys(this.$site.locales).some(rootLink => rootLink === this.link)\n      }\n      return this.link === '/'\n    },\n\n    isNonHttpURI () {\n      return isMailto(this.link) || isTel(this.link)\n    },\n\n    isBlankTarget () {\n      return this.target === '_blank'\n    },\n\n    isInternal () {\n      return !isExternal(this.link) && !this.isBlankTarget\n    },\n\n    target () {\n      if (this.isNonHttpURI) {\n        return null\n      }\n      if (this.item.target) {\n        return this.item.target\n      }\n      return isExternal(this.link) ? '_blank' : ''\n    },\n\n    rel () {\n      if (this.isNonHttpURI) {\n        return null\n      }\n      if (this.item.rel === false) {\n        return null\n      }\n      if (this.item.rel) {\n        return this.item.rel\n      }\n      return this.isBlankTarget ? 'noopener noreferrer' : null\n    }\n  },\n\n  methods: {\n    focusoutAction () {\n      this.$emit('focusout')\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/NavLinks.vue",
    "content": "<template>\n  <nav\n    v-if=\"userLinks.length || repoLink\"\n    class=\"nav-links\"\n  >\n    <!-- user links -->\n    <div\n      v-for=\"item in userLinks\"\n      :key=\"item.link\"\n      class=\"nav-item\"\n    >\n      <DropdownLink\n        v-if=\"item.type === 'links'\"\n        :item=\"item\"\n      />\n      <NavLink\n        v-else\n        :item=\"item\"\n      />\n    </div>\n\n    <GitHub/>\n    </a>\n  </nav>\n</template>\n\n<script>\nimport DropdownLink from '@theme/components/DropdownLink.vue'\nimport { resolveNavLinkItem } from '../util'\nimport NavLink from '@theme/components/NavLink.vue'\n\nexport default {\n  name: 'NavLinks',\n\n  components: {\n    NavLink,\n    DropdownLink\n  },\n\n  computed: {\n    userNav () {\n      return this.$themeLocaleConfig.nav || this.$site.themeConfig.nav || []\n    },\n\n    nav () {\n      const { locales } = this.$site\n      if (locales && Object.keys(locales).length > 1) {\n        const currentLink = this.$page.path\n        const routes = this.$router.options.routes\n        const themeLocales = this.$site.themeConfig.locales || {}\n        const languageDropdown = {\n          text: this.$themeLocaleConfig.selectText || 'Languages',\n          ariaLabel: this.$themeLocaleConfig.ariaLabel || 'Select language',\n          items: Object.keys(locales).map(path => {\n            const locale = locales[path]\n            const text = themeLocales[path] && themeLocales[path].label || locale.lang\n            let link\n            // Stay on the current page\n            if (locale.lang === this.$lang) {\n              link = currentLink\n            } else {\n              // Try to stay on the same page\n              link = currentLink.replace(this.$localeConfig.path, path)\n              // fallback to homepage\n              if (!routes.some(route => route.path === link)) {\n                link = path\n              }\n            }\n            return { text, link }\n          })\n        }\n        return [...this.userNav, languageDropdown]\n      }\n      return this.userNav\n    },\n\n    userLinks () {\n      return (this.nav || []).map(link => {\n        return Object.assign(resolveNavLinkItem(link), {\n          items: (link.items || []).map(resolveNavLinkItem)\n        })\n      })\n    },\n\n    repoLink () {\n      const { repo } = this.$site.themeConfig\n      if (repo) {\n        return /^https?:/.test(repo)\n          ? repo\n          : `https://github.com/${repo}`\n      }\n      return null\n    },\n\n    repoLabel () {\n      if (!this.repoLink) return\n      if (this.$site.themeConfig.repoLabel) {\n        return this.$site.themeConfig.repoLabel\n      }\n\n      const repoHost = this.repoLink.match(/^https?:\\/\\/[^/]+/)[0]\n      const platforms = ['GitHub', 'GitLab', 'Bitbucket']\n      for (let i = 0; i < platforms.length; i++) {\n        const platform = platforms[i]\n        if (new RegExp(platform, 'i').test(repoHost)) {\n          return platform\n        }\n      }\n\n      return 'Source'\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.nav-links\n  display inline-block\n  a\n    line-height 1.4rem\n    color inherit\n    &:hover, &.router-link-active\n      color $accentColor\n  .nav-item\n    position relative\n    display inline-block\n    margin-left 1.5rem\n    line-height 2rem\n    &:first-child\n      margin-left 0\n  .repo-link\n    margin-left 1.5rem\n\n@media (max-width: $MQMobile)\n  .nav-links\n    .nav-item, .repo-link\n      margin-left 0\n\n@media (min-width: $MQMobile)\n  .nav-links a\n    &:hover, &.router-link-active\n      color $textColor\n  .nav-item > a:not(.external)\n    &:hover, &.router-link-active\n      margin-bottom -2px\n      border-bottom 2px solid lighten($accentColor, 8%)\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/Navbar.vue",
    "content": "<template>\n  <header class=\"navbar\">\n    <SidebarButton @toggle-sidebar=\"$emit('toggle-sidebar')\" />\n\n    <RouterLink\n      :to=\"$localePath\"\n      class=\"home-link\"\n    >\n      <img\n        v-if=\"$site.themeConfig.logo\"\n        class=\"logo\"\n        :src=\"$withBase($site.themeConfig.logo)\"\n        :alt=\"$siteTitle\"\n      >\n      <span\n        v-if=\"$siteTitle\"\n        ref=\"siteName\"\n        class=\"site-name\"\n        :class=\"{ 'can-hide': $site.themeConfig.logo }\"\n      >{{ $siteTitle }}</span>\n    </RouterLink>\n\n    <div\n      class=\"links\"\n      :style=\"linksWrapMaxWidth ? {\n        'max-width': linksWrapMaxWidth + 'px'\n      } : {}\"\n    >\n      <AlgoliaSearchBox\n        v-if=\"isAlgoliaSearch\"\n        :options=\"algolia\"\n      />\n      <SearchBox v-else-if=\"$site.themeConfig.search !== false && $page.frontmatter.search !== false\" />\n      <NavLinks class=\"can-hide\" />\n    </div>\n  </header>\n</template>\n\n<script>\nimport AlgoliaSearchBox from '@AlgoliaSearchBox'\nimport SearchBox from '@SearchBox'\nimport SidebarButton from '@theme/components/SidebarButton.vue'\nimport NavLinks from '@theme/components/NavLinks.vue'\n\nexport default {\n  name: 'Navbar',\n\n  components: {\n    SidebarButton,\n    NavLinks,\n    SearchBox,\n    AlgoliaSearchBox\n  },\n\n  data () {\n    return {\n      linksWrapMaxWidth: null\n    }\n  },\n\n  computed: {\n    algolia () {\n      return this.$themeLocaleConfig.algolia || this.$site.themeConfig.algolia || {}\n    },\n\n    isAlgoliaSearch () {\n      return this.algolia && this.algolia.apiKey && this.algolia.indexName\n    }\n  },\n\n  mounted () {\n    const MOBILE_DESKTOP_BREAKPOINT = 719 // refer to config.styl\n    const NAVBAR_VERTICAL_PADDING = parseInt(css(this.$el, 'paddingLeft')) + parseInt(css(this.$el, 'paddingRight'))\n    const handleLinksWrapWidth = () => {\n      if (document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT) {\n        this.linksWrapMaxWidth = null\n      } else {\n        this.linksWrapMaxWidth = this.$el.offsetWidth - NAVBAR_VERTICAL_PADDING\n          - (this.$refs.siteName && this.$refs.siteName.offsetWidth || 0)\n      }\n    }\n    handleLinksWrapWidth()\n    window.addEventListener('resize', handleLinksWrapWidth, false)\n  }\n}\n\nfunction css (el, property) {\n  // NOTE: Known bug, will return 'auto' if style value is 'auto'\n  const win = el.ownerDocument.defaultView\n  // null means not to return pseudo styles\n  return win.getComputedStyle(el, null)[property]\n}\n</script>\n\n<style lang=\"stylus\">\n$navbar-vertical-padding = 0.7rem\n$navbar-horizontal-padding = 1.5rem\n\n.navbar\n  padding $navbar-vertical-padding $navbar-horizontal-padding\n  line-height $navbarHeight - 1.4rem\n  a, span, img\n    display inline-block\n  .logo\n    height $navbarHeight - 1.4rem\n    min-width $navbarHeight - 1.4rem\n    margin-right 0.8rem\n    vertical-align top\n  .site-name\n    font-size 1.3rem\n    font-weight 600\n    color $textColor\n    position relative\n  .links\n    padding-left 1.5rem\n    box-sizing border-box\n    background-color white\n    white-space nowrap\n    font-size 0.9rem\n    position absolute\n    right $navbar-horizontal-padding\n    top $navbar-vertical-padding\n    display flex\n    .search-box\n      flex: 0 0 auto\n      vertical-align top\n\n@media (max-width: $MQMobile)\n  .navbar\n    padding-left 4rem\n    .can-hide\n      display none\n    .links\n      padding-left 1.5rem\n    .site-name\n      width calc(100vw - 9.4rem)\n      overflow hidden\n      white-space nowrap\n      text-overflow ellipsis\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/Page.vue",
    "content": "<template>\n  <main class=\"page\">\n    <slot name=\"top\" />\n\n    <Content class=\"theme-default-content\" />\n    <PageEdit />\n\n    <PageNav v-bind=\"{ sidebarItems }\" />\n\n    <slot name=\"bottom\" />\n  </main>\n</template>\n\n<script>\nimport PageEdit from '@theme/components/PageEdit.vue'\nimport PageNav from '@theme/components/PageNav.vue'\n\nexport default {\n  components: { PageEdit, PageNav },\n  props: ['sidebarItems']\n}\n</script>\n\n<style lang=\"stylus\">\n@require '../styles/wrapper.styl'\n\n.page\n  padding-bottom 2rem\n  display block\n\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/PageEdit.vue",
    "content": "<template>\n  <footer class=\"page-edit\">\n    <div\n      v-if=\"editLink\"\n      class=\"edit-link\"\n    >\n      <a\n        :href=\"editLink\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >{{ editLinkText }}</a>\n      <OutboundLink />\n    </div>\n\n    <div\n      v-if=\"lastUpdated\"\n      class=\"last-updated\"\n    >\n      <span class=\"prefix\">{{ lastUpdatedText }}:</span>\n      <span class=\"time\">{{ lastUpdated }}</span>\n    </div>\n  </footer>\n</template>\n\n<script>\nimport isNil from 'lodash/isNil'\nimport { endingSlashRE, outboundRE } from '../util'\n\nexport default {\n  name: 'PageEdit',\n\n  computed: {\n    lastUpdated () {\n      return this.$page.lastUpdated\n    },\n\n    lastUpdatedText () {\n      if (typeof this.$themeLocaleConfig.lastUpdated === 'string') {\n        return this.$themeLocaleConfig.lastUpdated\n      }\n      if (typeof this.$site.themeConfig.lastUpdated === 'string') {\n        return this.$site.themeConfig.lastUpdated\n      }\n      return 'Last Updated'\n    },\n\n    editLink () {\n      const showEditLink = isNil(this.$page.frontmatter.editLink)\n        ? this.$site.themeConfig.editLinks\n        : this.$page.frontmatter.editLink\n\n      const {\n        repo,\n        docsDir = '',\n        docsBranch = 'master',\n        docsRepo = repo\n      } = this.$site.themeConfig\n\n      if (typeof showEditLink == \"string\") return showEditLink\n\n      if (showEditLink && docsRepo && this.$page.relativePath) {\n        return this.createEditLink(\n          repo,\n          docsRepo,\n          docsDir,\n          docsBranch,\n          this.$page.relativePath\n        )\n      }\n      return null\n    },\n\n    editLinkText () {\n      return (\n        this.$themeLocaleConfig.editLinkText\n        || this.$site.themeConfig.editLinkText\n        || `Edit this page`\n      )\n    }\n  },\n\n  methods: {\n    createEditLink (repo, docsRepo, docsDir, docsBranch, path) {\n      const bitbucket = /bitbucket.org/\n      if (bitbucket.test(docsRepo)) {\n        const base = docsRepo\n        return (\n          base.replace(endingSlashRE, '')\n          + `/src`\n          + `/${docsBranch}/`\n          + (docsDir ? docsDir.replace(endingSlashRE, '') + '/' : '')\n          + path\n          + `?mode=edit&spa=0&at=${docsBranch}&fileviewer=file-view-default`\n        )\n      }\n\n      const gitlab = /gitlab.com/\n      if (gitlab.test(docsRepo)) {\n        const base = docsRepo\n        return (\n          base.replace(endingSlashRE, '')\n          + `/-/edit`\n          + `/${docsBranch}/`\n          + (docsDir ? docsDir.replace(endingSlashRE, '') + '/' : '')\n          + path\n        )\n      }\n\n      const base = outboundRE.test(docsRepo)\n        ? docsRepo\n        : `https://github.com/${docsRepo}`\n      return (\n        base.replace(endingSlashRE, '')\n        + '/edit'\n        + `/${docsBranch}/`\n        + (docsDir ? docsDir.replace(endingSlashRE, '') + '/' : '')\n        + path\n      )\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n@require '../styles/wrapper.styl'\n\n.page-edit\n  @extend $wrapper\n  padding-top 1rem\n  padding-bottom 1rem\n  overflow auto\n\n  .edit-link\n    display inline-block\n    a\n      color lighten($textColor, 25%)\n      margin-right 0.25rem\n  .last-updated\n    float right\n    font-size 0.9em\n    .prefix\n      font-weight 500\n      color lighten($textColor, 25%)\n    .time\n      font-weight 400\n      color #767676\n\n@media (max-width: $MQMobile)\n  .page-edit\n    .edit-link\n      margin-bottom 0.5rem\n    .last-updated\n      font-size 0.8em\n      float none\n      text-align left\n\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/PageNav.vue",
    "content": "<template>\n  <div\n    v-if=\"prev || next\"\n    class=\"page-nav\"\n  >\n    <p class=\"inner\">\n      <span\n        v-if=\"prev\"\n        class=\"prev\"\n      >\n        ←\n        <a\n          v-if=\"prev.type === 'external'\"\n          class=\"prev\"\n          :href=\"prev.path\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          {{ prev.title || prev.path }}\n\n          <OutboundLink />\n        </a>\n\n        <RouterLink\n          v-else\n          class=\"prev\"\n          :to=\"prev.path\"\n        >\n          {{ prev.title || prev.path }}\n        </RouterLink>\n      </span>\n\n      <span\n        v-if=\"next\"\n        class=\"next\"\n      >\n        <a\n          v-if=\"next.type === 'external'\"\n          :href=\"next.path\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          {{ next.title || next.path }}\n\n          <OutboundLink />\n        </a>\n\n        <RouterLink\n          v-else\n          :to=\"next.path\"\n        >\n          {{ next.title || next.path }}\n        </RouterLink>\n        →\n      </span>\n    </p>\n  </div>\n</template>\n\n<script>\nimport { resolvePage } from '../util'\nimport isString from 'lodash/isString'\nimport isNil from 'lodash/isNil'\n\nexport default {\n  name: 'PageNav',\n\n  props: ['sidebarItems'],\n\n  computed: {\n    prev () {\n      return resolvePageLink(LINK_TYPES.PREV, this)\n    },\n\n    next () {\n      return resolvePageLink(LINK_TYPES.NEXT, this)\n    }\n  }\n}\n\nfunction resolvePrev (page, items) {\n  return find(page, items, -1)\n}\n\nfunction resolveNext (page, items) {\n  return find(page, items, 1)\n}\n\nconst LINK_TYPES = {\n  NEXT: {\n    resolveLink: resolveNext,\n    getThemeLinkConfig: ({ nextLinks }) => nextLinks,\n    getPageLinkConfig: ({ frontmatter }) => frontmatter.next\n  },\n  PREV: {\n    resolveLink: resolvePrev,\n    getThemeLinkConfig: ({ prevLinks }) => prevLinks,\n    getPageLinkConfig: ({ frontmatter }) => frontmatter.prev\n  }\n}\n\nfunction resolvePageLink (\n  linkType,\n  { $themeConfig, $page, $route, $site, sidebarItems }\n) {\n  const { resolveLink, getThemeLinkConfig, getPageLinkConfig } = linkType\n\n  // Get link config from theme\n  const themeLinkConfig = getThemeLinkConfig($themeConfig)\n\n  // Get link config from current page\n  const pageLinkConfig = getPageLinkConfig($page)\n\n  // Page link config will overwrite global theme link config if defined\n  const link = isNil(pageLinkConfig) ? themeLinkConfig : pageLinkConfig\n\n  if (link === false) {\n    return\n  } else if (isString(link)) {\n    return resolvePage($site.pages, link, $route.path)\n  } else {\n    return resolveLink($page, sidebarItems)\n  }\n}\n\nfunction find (page, items, offset) {\n  const res = []\n  flatten(items, res)\n  for (let i = 0; i < res.length; i++) {\n    const cur = res[i]\n    if (cur.type === 'page' && cur.path === decodeURIComponent(page.path)) {\n      return res[i + offset]\n    }\n  }\n}\n\nfunction flatten (items, res) {\n  for (let i = 0, l = items.length; i < l; i++) {\n    if (items[i].type === 'group') {\n      flatten(items[i].children || [], res)\n    } else {\n      res.push(items[i])\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n@require '../styles/wrapper.styl'\n\n.page-nav\n  @extend $wrapper\n  padding-top 1rem\n  padding-bottom 0\n  .inner\n    min-height 2rem\n    margin-top 0\n    border-top 1px solid $borderColor\n    padding-top 1rem\n    overflow auto // clear float\n  .next\n    float right\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/Sidebar.vue",
    "content": "<template>\n  <aside class=\"sidebar\">\n    <NavLinks />\n\n    <slot name=\"top\" />\n\n    <SidebarLinks\n      :depth=\"0\"\n      :items=\"items\"\n    />\n    <slot name=\"bottom\" />\n  </aside>\n</template>\n\n<script>\nimport SidebarLinks from '@theme/components/SidebarLinks.vue'\nimport NavLinks from '@theme/components/NavLinks.vue'\n\nexport default {\n  name: 'Sidebar',\n\n  components: { SidebarLinks, NavLinks },\n\n  props: ['items']\n}\n</script>\n\n<style lang=\"stylus\">\n.sidebar\n  ul\n    padding 0\n    margin 0\n    list-style-type none\n  a\n    display inline-block\n  .nav-links\n    display none\n    border-bottom 1px solid $borderColor\n    padding 0.5rem 0 0.75rem 0\n    a\n      font-weight 600\n    .nav-item, .repo-link\n      display block\n      line-height 1.25rem\n      font-size 1.1em\n      padding 0.5rem 0 0.5rem 1.5rem\n  & > .sidebar-links\n    padding 1.5rem 0\n    & > li > a.sidebar-link\n      font-size 1.1em\n      line-height 1.7\n      font-weight bold\n    & > li:not(:first-child)\n      margin-top .75rem\n\n@media (max-width: $MQMobile)\n  .sidebar\n    .nav-links\n      display block\n      .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active::after\n        top calc(1rem - 2px)\n    & > .sidebar-links\n      padding 1rem 0\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/SidebarButton.vue",
    "content": "<template>\n  <div\n    class=\"sidebar-button\"\n    @click=\"$emit('toggle-sidebar')\"\n  >\n    <svg\n      class=\"icon\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n      role=\"img\"\n      viewBox=\"0 0 448 512\"\n    >\n      <path\n        fill=\"currentColor\"\n        d=\"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z\"\n        class=\"\"\n      />\n    </svg>\n  </div>\n</template>\n\n<style lang=\"stylus\">\n.sidebar-button\n  cursor pointer\n  display none\n  width 1.25rem\n  height 1.25rem\n  position absolute\n  padding 0.6rem\n  top 0.6rem\n  left 1rem\n  .icon\n    display block\n    width 1.25rem\n    height 1.25rem\n\n@media (max-width: $MQMobile)\n  .sidebar-button\n    display block\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/SidebarGroup.vue",
    "content": "<template>\n  <section\n    class=\"sidebar-group\"\n    :class=\"[\n      {\n        collapsable,\n        'is-sub-group': depth !== 0\n      },\n      `depth-${depth}`\n    ]\"\n  >\n    <RouterLink\n      v-if=\"item.path\"\n      class=\"sidebar-heading clickable\"\n      :class=\"{\n        open,\n        'active': isActive($route, item.path)\n      }\"\n      :to=\"item.path\"\n      @click.native=\"$emit('toggle')\"\n    >\n      <span>{{ item.title }}</span>\n      <span\n        v-if=\"collapsable\"\n        class=\"arrow\"\n        :class=\"open ? 'down' : 'right'\"\n      />\n    </RouterLink>\n\n    <p\n      v-else\n      class=\"sidebar-heading\"\n      :class=\"{ open }\"\n      @click=\"$emit('toggle')\"\n    >\n      <span>{{ item.title }}</span>\n      <span\n        v-if=\"collapsable\"\n        class=\"arrow\"\n        :class=\"open ? 'down' : 'right'\"\n      />\n    </p>\n\n    <DropdownTransition>\n      <SidebarLinks\n        v-if=\"open || !collapsable\"\n        class=\"sidebar-group-items\"\n        :items=\"item.children\"\n        :sidebar-depth=\"item.sidebarDepth\"\n        :initial-open-group-index=\"item.initialOpenGroupIndex\"\n        :depth=\"depth + 1\"\n      />\n    </DropdownTransition>\n  </section>\n</template>\n\n<script>\nimport { isActive } from '../util'\nimport DropdownTransition from '@theme/components/DropdownTransition.vue'\n\nexport default {\n  name: 'SidebarGroup',\n\n  components: {\n    DropdownTransition\n  },\n\n  props: [\n    'item',\n    'open',\n    'collapsable',\n    'depth'\n  ],\n\n  // ref: https://vuejs.org/v2/guide/components-edge-cases.html#Circular-References-Between-Components\n  beforeCreate () {\n    this.$options.components.SidebarLinks = require('@theme/components/SidebarLinks.vue').default\n  },\n\n  methods: { isActive }\n}\n</script>\n\n<style lang=\"stylus\">\n.sidebar-group\n  .sidebar-group\n    padding-left 0.5em\n  &:not(.collapsable)\n    .sidebar-heading:not(.clickable)\n      cursor auto\n      color inherit\n  // refine styles of nested sidebar groups\n  &.is-sub-group\n    padding-left 0\n    & > .sidebar-heading\n      font-size 0.95em\n      line-height 1.4\n      font-weight normal\n      padding-left 2rem\n      &:not(.clickable)\n        opacity 0.5\n    & > .sidebar-group-items\n      padding-left 1rem\n      & > li > .sidebar-link\n        font-size: 0.95em;\n        border-left none\n  &.depth-2\n    & > .sidebar-heading\n      border-left none\n\n.sidebar-heading\n  color $textColor\n  transition color .15s ease\n  cursor pointer\n  font-size 1.1em\n  font-weight bold\n  // text-transform uppercase\n  padding 0.35rem 1.5rem 0.35rem 1.25rem\n  width 100%\n  box-sizing border-box\n  margin 0\n  border-left 0.25rem solid transparent\n  &.open, &:hover\n    color inherit\n  .arrow\n    position relative\n    top -0.12em\n    left 0.5em\n  &.clickable\n    &.active\n      font-weight 600\n      color $accentColor\n      border-left-color $accentColor\n    &:hover\n      color $accentColor\n\n.sidebar-group-items\n  transition height .1s ease-out\n  font-size 0.95em\n  overflow hidden\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/SidebarLink.vue",
    "content": "<script>\nimport { isActive, hashRE, groupHeaders } from '../util'\n\nexport default {\n  functional: true,\n\n  props: ['item', 'sidebarDepth'],\n\n  render (h,\n    {\n      parent: {\n        $page,\n        $site,\n        $route,\n        $themeConfig,\n        $themeLocaleConfig\n      },\n      props: {\n        item,\n        sidebarDepth\n      }\n    }) {\n    // use custom active class matching logic\n    // due to edge case of paths ending with / + hash\n    const selfActive = isActive($route, item.path)\n    // for sidebar: auto pages, a hash link should be active if one of its child\n    // matches\n    const active = item.type === 'auto'\n      ? selfActive || item.children.some(c => isActive($route, item.basePath + '#' + c.slug))\n      : selfActive\n    const link = item.type === 'external'\n      ? renderExternal(h, item.path, item.title || item.path)\n      : renderLink(h, item.path, item.title || item.path, active)\n\n    const maxDepth = [\n      $page.frontmatter.sidebarDepth,\n      sidebarDepth,\n      $themeLocaleConfig.sidebarDepth,\n      $themeConfig.sidebarDepth,\n      1\n    ].find(depth => depth !== undefined)\n\n    const displayAllHeaders = $themeLocaleConfig.displayAllHeaders\n      || $themeConfig.displayAllHeaders\n\n    if (item.type === 'auto') {\n      return [link, renderChildren(h, item.children, item.basePath, $route, maxDepth)]\n    } else if ((active || displayAllHeaders) && item.headers && !hashRE.test(item.path)) {\n      const children = groupHeaders(item.headers)\n      return [link, renderChildren(h, children, item.path, $route, maxDepth)]\n    } else {\n      return link\n    }\n  }\n}\n\nfunction renderLink (h, to, text, active, level) {\n  const component = {\n    props: {\n      to,\n      activeClass: '',\n      exactActiveClass: ''\n    },\n    class: {\n      active,\n      'sidebar-link': true\n    }\n  }\n\n  if (level > 2) {\n    component.style = {\n      'padding-left': level + 'rem'\n    }\n  }\n\n  return h('RouterLink', component, text)\n}\n\nfunction renderChildren (h, children, path, route, maxDepth, depth = 1) {\n  if (!children || depth > maxDepth) return null\n  return h('ul', { class: 'sidebar-sub-headers' }, children.map(c => {\n    const active = isActive(route, path + '#' + c.slug)\n    return h('li', { class: 'sidebar-sub-header' }, [\n      renderLink(h, path + '#' + c.slug, c.title, active, c.level - 1),\n      renderChildren(h, c.children, path, route, maxDepth, depth + 1)\n    ])\n  }))\n}\n\nfunction renderExternal (h, to, text) {\n  return h('a', {\n    attrs: {\n      href: to,\n      target: '_blank',\n      rel: 'noopener noreferrer'\n    },\n    class: {\n      'sidebar-link': true\n    }\n  }, [text, h('OutboundLink')])\n}\n</script>\n\n<style lang=\"stylus\">\n.sidebar .sidebar-sub-headers\n  padding-left 1rem\n  font-size 0.95em\n\na.sidebar-link\n  font-size 1em\n  font-weight 400\n  display inline-block\n  color $textColor\n  border-left 0.25rem solid transparent\n  padding 0.35rem 1rem 0.35rem 1.25rem\n  line-height 1.4\n  width: 100%\n  box-sizing: border-box\n  &:hover\n    color $accentColor\n  &.active\n    font-weight 600\n    color $accentColor\n    border-left-color $accentColor\n  .sidebar-group &\n    padding-left 2rem\n  .sidebar-sub-headers &\n    padding-top 0.25rem\n    padding-bottom 0.25rem\n    border-left none\n    &.active\n      font-weight 500\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/components/SidebarLinks.vue",
    "content": "<template>\n  <ul\n    v-if=\"items.length\"\n    class=\"sidebar-links\"\n  >\n    <li\n      v-for=\"(item, i) in items\"\n      :key=\"i\"\n    >\n      <SidebarGroup\n        v-if=\"item.type === 'group'\"\n        :item=\"item\"\n        :open=\"i === openGroupIndex\"\n        :collapsable=\"item.collapsable || item.collapsible\"\n        :depth=\"depth\"\n        @toggle=\"toggleGroup(i)\"\n      />\n      <SidebarLink\n        v-else\n        :sidebar-depth=\"sidebarDepth\"\n        :item=\"item\"\n      />\n    </li>\n  </ul>\n</template>\n\n<script>\nimport SidebarGroup from '@theme/components/SidebarGroup.vue'\nimport SidebarLink from '@theme/components/SidebarLink.vue'\nimport { isActive } from '../util'\n\nexport default {\n  name: 'SidebarLinks',\n\n  components: { SidebarGroup, SidebarLink },\n\n  props: [\n    'items',\n    'depth',  // depth of current sidebar links\n    'sidebarDepth', // depth of headers to be extracted\n    'initialOpenGroupIndex'\n  ],\n\n  data () {\n    return {\n      openGroupIndex: this.initialOpenGroupIndex || 0\n    }\n  },\n\n  watch: {\n    '$route' () {\n      this.refreshIndex()\n    }\n  },\n\n  created () {\n    this.refreshIndex()\n  },\n\n  methods: {\n    refreshIndex () {\n      const index = resolveOpenGroupIndex(\n        this.$route,\n        this.items\n      )\n      if (index > -1) {\n        this.openGroupIndex = index\n      }\n    },\n\n    toggleGroup (index) {\n      this.openGroupIndex = index === this.openGroupIndex ? -1 : index\n    },\n\n    isActive (page) {\n      return isActive(this.$route, page.regularPath)\n    }\n  }\n}\n\nfunction resolveOpenGroupIndex (route, items) {\n  for (let i = 0; i < items.length; i++) {\n    const item = items[i]\n    if (descendantIsActive(route, item)) {\n      return i\n    }\n  }\n  return -1\n}\n\nfunction descendantIsActive (route, item) {\n  if (item.type === 'group') {\n    const childIsActive = item.path && isActive(route, item.path)\n    const grandChildIsActive = item.children.some(child => {\n      if (child.type === 'group') {\n        return descendantIsActive(route, child)\n      } else {\n        return child.type === 'page' && isActive(route, child.path)\n      }\n    })\n\n    return childIsActive || grandChildIsActive\n  }\n  return false\n}\n</script>\n"
  },
  {
    "path": "docs/.vuepress/theme/global-components/Badge.vue",
    "content": "<script>\nexport default {\n  functional: true,\n  props: {\n    type: {\n      type: String,\n      default: 'tip'\n    },\n    text: String,\n    vertical: {\n      type: String,\n      default: 'top'\n    }\n  },\n  render (h, { props, slots }) {\n    return h('span', {\n      class: ['badge', props.type],\n      style: {\n        verticalAlign: props.vertical\n      }\n    }, props.text || slots().default)\n  }\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.badge\n  display inline-block\n  font-size 14px\n  height 18px\n  line-height 18px\n  border-radius 3px\n  padding 0 6px\n  color white\n  background-color #42b983\n  &.tip, &.green\n    background-color $badgeTipColor\n  &.error\n    background-color $badgeErrorColor\n  &.warning, &.warn, &.yellow\n    background-color $badgeWarningColor\n  & + &\n    margin-left 5px\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/global-components/CodeBlock.vue",
    "content": "<template>\n  <div\n    class=\"theme-code-block\"\n    :class=\"{ 'theme-code-block__active': active }\"\n  >\n    <slot />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'CodeBlock',\n  props: {\n    title: {\n      type: String,\n      required: true\n    },\n    active: {\n      type: Boolean,\n      default: false\n    }\n  },\n  mounted () {\n    if (this.$parent && this.$parent.loadTabs) {\n      this.$parent.loadTabs()\n    }\n  }\n}\n</script>\n\n<style scoped>\n  .theme-code-block {\n    display: none;\n  }\n  .theme-code-block__active {\n    display: block;\n  }\n  .theme-code-block > pre {\n    background-color: orange;\n  }\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/global-components/CodeGroup.vue",
    "content": "<template>\n  <ClientOnly>\n    <div class=\"theme-code-group\">\n      <div class=\"theme-code-group__nav\">\n        <ul class=\"theme-code-group__ul\">\n          <li\n            v-for=\"(tab, i) in codeTabs\"\n            :key=\"tab.title\"\n            class=\"theme-code-group__li\"\n          >\n            <button\n              class=\"theme-code-group__nav-tab\"\n              :class=\"{\n                'theme-code-group__nav-tab-active': i === activeCodeTabIndex,\n              }\"\n              @click=\"changeCodeTab(i)\"\n            >\n              {{ tab.title }}\n            </button>\n          </li>\n        </ul>\n      </div>\n      <slot />\n      <pre\n        v-if=\"codeTabs.length < 1\"\n        class=\"pre-blank\"\n      >// Make sure to add code blocks to your code group</pre>\n    </div>\n  </ClientOnly>\n</template>\n\n<script>\nexport default {\n  name: 'CodeGroup',\n  data () {\n    return {\n      codeTabs: [],\n      activeCodeTabIndex: -1\n    }\n  },\n  watch: {\n    activeCodeTabIndex (index) {\n      this.activateCodeTab(index)\n    }\n  },\n  mounted () {\n    this.loadTabs()\n  },\n  methods: {\n    changeCodeTab (index) {\n      this.activeCodeTabIndex = index\n    },\n    loadTabs () {\n      this.codeTabs = (this.$slots.default || []).filter(slot => Boolean(slot.componentOptions)).map((slot, index) => {\n        if (slot.componentOptions.propsData.active === '') {\n          this.activeCodeTabIndex = index\n        }\n\n        return {\n          title: slot.componentOptions.propsData.title,\n          elm: slot.elm\n        }\n      })\n\n      if (this.activeCodeTabIndex === -1 && this.codeTabs.length > 0) {\n        this.activeCodeTabIndex = 0\n      }\n\n      this.activateCodeTab(0)\n    },\n    activateCodeTab (index) {\n      this.codeTabs.forEach(tab => {\n        if (tab.elm) {\n          tab.elm.classList.remove('theme-code-block__active')\n        }\n      })\n\n      if (this.codeTabs[index].elm) {\n        this.codeTabs[index].elm.classList.add('theme-code-block__active')\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n  .theme-code-group {}\n  .theme-code-group__nav {\n    margin-bottom: -35px;\n    background-color: $codeBgColor;\n    padding-bottom: 22px;\n    border-top-left-radius: 6px;\n    border-top-right-radius: 6px;\n    padding-left: 10px;\n    padding-top: 10px;\n  }\n  .theme-code-group__ul {\n    margin: auto 0;\n    padding-left: 0;\n    display: inline-flex;\n    list-style: none;\n  }\n  .theme-code-group__li {}\n  .theme-code-group__nav-tab {\n    border: 0;\n    padding: 5px;\n    cursor: pointer;\n    background-color: transparent;\n    font-size: 0.85em;\n    line-height: 1.4;\n    color: rgba(255, 255, 255, 0.9);\n    font-weight: 600;\n  }\n  .theme-code-group__nav-tab-active {\n    border-bottom: #42b983 1px solid;\n  }\n  .pre-blank {\n    color: #42b983;\n  }\n</style>\n"
  },
  {
    "path": "docs/.vuepress/theme/index.js",
    "content": "const path = require(\"path\")\n\n// Theme API.\nmodule.exports = (options, ctx) => {\n  const {themeConfig, siteConfig} = ctx\n\n  // resolve algolia\n  const isAlgoliaSearch =\n    themeConfig.algolia ||\n    Object.keys((siteConfig.locales && themeConfig.locales) || {}).some(\n      (base) => themeConfig.locales[base].algolia\n    )\n\n  const enableSmoothScroll = themeConfig.smoothScroll === true\n\n  return {\n    alias() {\n      return {\n        \"@AlgoliaSearchBox\": isAlgoliaSearch\n          ? path.resolve(__dirname, \"components/AlgoliaSearchBox.vue\")\n          : path.resolve(__dirname, \"noopModule.js\"),\n      }\n    },\n\n    plugins: [\n      [\"@vuepress/active-header-links\", options.activeHeaderLinks],\n      \"@vuepress/search\",\n      \"@vuepress/plugin-nprogress\",\n      [\n        \"container\",\n        {\n          type: \"tip\",\n          defaultTitle: {\n            \"/\": \"TIP\",\n            \"/zh/\": \"提示\",\n          },\n        },\n      ],\n      [\n        \"container\",\n        {\n          type: \"warning\",\n          defaultTitle: {\n            \"/\": \"WARNING\",\n            \"/zh/\": \"注意\",\n          },\n        },\n      ],\n      [\n        \"container\",\n        {\n          type: \"danger\",\n          defaultTitle: {\n            \"/\": \"WARNING\",\n            \"/zh/\": \"警告\",\n          },\n        },\n      ],\n      [\n        \"container\",\n        {\n          type: \"details\",\n          before: (info) =>\n            `<details class=\"custom-block details\">${info ? `<summary>${info}</summary>` : \"\"}\\n`,\n          after: () => \"</details>\\n\",\n        },\n      ],\n      [\"smooth-scroll\", enableSmoothScroll],\n    ],\n  }\n}\n"
  },
  {
    "path": "docs/.vuepress/theme/layouts/404.vue",
    "content": "<template>\n  <div class=\"theme-container\">\n    <div class=\"theme-default-content\">\n      <h1>404</h1>\n\n      <blockquote>{{ getMsg() }}</blockquote>\n\n      <RouterLink to=\"/\">\n        Take me home.\n      </RouterLink>\n    </div>\n  </div>\n</template>\n\n<script>\nconst msgs = [\n  `There's nothing here.`,\n  `How did we get here?`,\n  `That's a Four-Oh-Four.`,\n  `Looks like we've got some broken links.`\n]\n\nexport default {\n  methods: {\n    getMsg () {\n      return msgs[Math.floor(Math.random() * msgs.length)]\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "docs/.vuepress/theme/layouts/Layout.vue",
    "content": "<template>\n  <div\n    class=\"theme-container\"\n    :class=\"pageClasses\"\n    @touchstart=\"onTouchStart\"\n    @touchend=\"onTouchEnd\"\n  >\n    <Navbar\n      v-if=\"shouldShowNavbar\"\n      @toggle-sidebar=\"toggleSidebar\"\n    />\n\n    <div\n      class=\"sidebar-mask\"\n      @click=\"toggleSidebar(false)\"\n    />\n\n    <Sidebar\n      :items=\"sidebarItems\"\n      @toggle-sidebar=\"toggleSidebar\"\n    >\n      <template #top>\n        <slot name=\"sidebar-top\" />\n      </template>\n      <template #bottom>\n        <slot name=\"sidebar-bottom\" />\n      </template>\n    </Sidebar>\n\n    <HomePage\n      v-if=\"$page.frontmatter.homepage\"\n      :sidebar-items=\"sidebarItems\"\n    >\n      <template #top>\n        <slot name=\"page-top\" />\n      </template>\n      <template #bottom>\n        <slot name=\"page-bottom\" />\n      </template>\n    </HomePage>\n\n    <NewsPost\n      v-else-if=\"$page.frontmatter.news\"\n      :sidebar-items=\"sidebarItems\"\n    >\n      <template #top>\n        <slot name=\"page-top\" />\n      </template>\n      <template #bottom>\n        <slot name=\"page-bottom\" />\n      </template>\n    </NewsPost>\n\n    <Page\n      v-else\n      :sidebar-items=\"sidebarItems\"\n    >\n      <template #top>\n        <slot name=\"page-top\" />\n      </template>\n      <template #bottom>\n        <slot name=\"page-bottom\" />\n      </template>\n    </Page>\n  </div>\n</template>\n\n<script>\nimport Home from '@theme/components/Home.vue'\nimport Navbar from '@theme/components/Navbar.vue'\nimport Page from '@theme/components/Page.vue'\nimport Sidebar from '@theme/components/Sidebar.vue'\nimport { resolveSidebarItems } from '../util'\n\nexport default {\n  name: 'Layout',\n\n  components: {\n    Home,\n    Page,\n    Sidebar,\n    Navbar\n  },\n\n  data () {\n    return {\n      isSidebarOpen: false\n    }\n  },\n\n  computed: {\n    shouldShowNavbar () {\n      const { themeConfig } = this.$site\n      const { frontmatter } = this.$page\n      if (\n        frontmatter.navbar === false\n        || themeConfig.navbar === false) {\n        return false\n      }\n      return (\n        this.$title\n        || themeConfig.logo\n        || themeConfig.repo\n        || themeConfig.nav\n        || this.$themeLocaleConfig.nav\n      )\n    },\n\n    shouldShowSidebar () {\n      const { frontmatter } = this.$page\n      return (\n        !frontmatter.home\n        && frontmatter.sidebar !== false\n        && this.sidebarItems.length\n      )\n    },\n\n    sidebarItems () {\n      return resolveSidebarItems(\n        this.$page,\n        this.$page.regularPath,\n        this.$site,\n        this.$localePath\n      )\n    },\n\n    pageClasses () {\n      const userPageClass = this.$page.frontmatter.pageClass\n      return [\n        {\n          'no-navbar': !this.shouldShowNavbar,\n          'sidebar-open': this.isSidebarOpen,\n          'no-sidebar': !this.shouldShowSidebar\n        },\n        userPageClass\n      ]\n    }\n  },\n\n  mounted () {\n    this.$router.afterEach(() => {\n      this.isSidebarOpen = false\n    })\n  },\n\n  methods: {\n    toggleSidebar (to) {\n      this.isSidebarOpen = typeof to === 'boolean' ? to : !this.isSidebarOpen\n      this.$emit('toggle-sidebar', this.isSidebarOpen)\n    },\n\n    // side swipe\n    onTouchStart (e) {\n      this.touchStart = {\n        x: e.changedTouches[0].clientX,\n        y: e.changedTouches[0].clientY\n      }\n    },\n\n    onTouchEnd (e) {\n      const dx = e.changedTouches[0].clientX - this.touchStart.x\n      const dy = e.changedTouches[0].clientY - this.touchStart.y\n      if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 40) {\n        if (dx > 0 && this.touchStart.x <= 80) {\n          this.toggleSidebar(true)\n        } else {\n          this.toggleSidebar(false)\n        }\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "docs/.vuepress/theme/noopModule.js",
    "content": "export default {}\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/arrow.styl",
    "content": "@require './config'\n\n.arrow\n  display inline-block\n  width 0\n  height 0\n  &.up\n    border-left 4px solid transparent\n    border-right 4px solid transparent\n    border-bottom 6px solid $arrowBgColor\n  &.down\n    border-left 4px solid transparent\n    border-right 4px solid transparent\n    border-top 6px solid $arrowBgColor\n  &.right\n    border-top 4px solid transparent\n    border-bottom 4px solid transparent\n    border-left 6px solid $arrowBgColor\n  &.left\n    border-top 4px solid transparent\n    border-bottom 4px solid transparent\n    border-right 6px solid $arrowBgColor\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/code.styl",
    "content": "{$contentClass}\n  code\n    color lighten($textColor, 20%)\n    padding 0.25rem 0.5rem\n    margin 0\n    font-size 0.85em\n    background-color rgba(27,31,35,0.05)\n    border-radius 3px\n    .token\n      &.deleted\n        color #EC5975\n      &.inserted\n        color $accentColor\n\n{$contentClass}\n  pre, pre[class*=\"language-\"]\n    line-height 1.4\n    padding 1.25rem 1.5rem\n    margin 0.85rem 0\n    background-color $codeBgColor\n    border-radius 6px\n    overflow auto\n    code\n      color #fff\n      padding 0\n      background-color transparent\n      border-radius 0\n\ndiv[class*=\"language-\"]\n  position relative\n  background-color $codeBgColor\n  border-radius 6px\n  .highlight-lines\n    user-select none\n    padding-top 1.3rem\n    position absolute\n    top 0\n    left 0\n    width 100%\n    line-height 1.4\n    .highlighted\n      background-color rgba(0, 0, 0, 66%)\n  pre, pre[class*=\"language-\"]\n    background transparent\n    position relative\n    z-index 1\n  &::before\n    position absolute\n    z-index 3\n    top 0.8em\n    right 1em\n    font-size 0.75rem\n    color rgba(255, 255, 255, 0.4)\n  &:not(.line-numbers-mode)\n    .line-numbers-wrapper\n      display none\n  &.line-numbers-mode\n    .highlight-lines .highlighted\n        position relative\n        &:before\n          content ' '\n          position absolute\n          z-index 3\n          left 0\n          top 0\n          display block\n          width $lineNumbersWrapperWidth\n          height 100%\n          background-color rgba(0, 0, 0, 66%)\n    pre\n      padding-left $lineNumbersWrapperWidth + 1 rem\n      vertical-align middle\n    .line-numbers-wrapper\n      position absolute\n      top 0\n      width $lineNumbersWrapperWidth\n      text-align center\n      color rgba(255, 255, 255, 0.3)\n      padding 1.25rem 0\n      line-height 1.4\n      br\n        user-select none\n      .line-number\n        position relative\n        z-index 4\n        user-select none\n        font-size 0.85em\n    &::after\n      content ''\n      position absolute\n      z-index 2\n      top 0\n      left 0\n      width $lineNumbersWrapperWidth\n      height 100%\n      border-radius 6px 0 0 6px\n      border-right 1px solid rgba(0, 0, 0, 66%)\n      background-color $codeBgColor\n\n\nfor lang in $codeLang\n  div{'[class~=\"language-' + lang + '\"]'}\n    &:before\n      content ('' + lang)\n\ndiv[class~=\"language-javascript\"]\n  &:before\n    content \"js\"\n\ndiv[class~=\"language-typescript\"]\n  &:before\n    content \"ts\"\n\ndiv[class~=\"language-markup\"]\n  &:before\n    content \"html\"\n\ndiv[class~=\"language-markdown\"]\n  &:before\n    content \"md\"\n\ndiv[class~=\"language-json\"]:before\n  content \"json\"\n\ndiv[class~=\"language-ruby\"]:before\n  content \"rb\"\n\ndiv[class~=\"language-python\"]:before\n  content \"py\"\n\ndiv[class~=\"language-bash\"]:before\n  content \"sh\"\n\ndiv[class~=\"language-php\"]:before\n  content \"php\"\n\n@import '~prismjs/themes/prism-tomorrow.css'\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/config.styl",
    "content": "$contentClass = '.theme-default-content'\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/custom-blocks.styl",
    "content": ".custom-block\n  .custom-block-title\n    font-weight 600\n    margin-bottom -0.4rem\n  &.tip, &.warning, &.danger\n    padding .1rem 1.5rem\n    border-left-width .5rem\n    border-left-style solid\n    margin 1rem 0\n  &.tip\n    background-color #f3f5f7\n    border-color #42b983\n  &.warning\n    background-color rgba(255,229,100,.3)\n    border-color darken(#ffe564, 35%)\n    color darken(#ffe564, 70%)\n    .custom-block-title\n      color darken(#ffe564, 50%)\n    a\n      color $textColor\n  &.danger\n    background-color #ffe6e6\n    border-color darken(red, 20%)\n    color darken(red, 70%)\n    .custom-block-title\n      color darken(red, 40%)\n    a\n      color $textColor\n  &.details\n    display block\n    position relative\n    border-radius 2px\n    margin 1.6em 0\n    padding 1.6em\n    background-color #eee\n    h4\n      margin-top 0\n    figure, p\n      &:last-child\n        margin-bottom 0\n        padding-bottom 0\n    summary\n      outline none\n      cursor pointer\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/index.styl",
    "content": "@require './config'\n@require './code'\n@require './custom-blocks'\n@require './arrow'\n@require './wrapper'\n@require './toc'\n\nhtml, body\n  padding 0\n  margin 0\n  background-color #fff\n\nbody\n  font-family -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif\n  -webkit-font-smoothing antialiased\n  -moz-osx-font-smoothing grayscale\n  font-size 16px\n  color $textColor\n\n.page\n  padding-left $sidebarWidth\n\n.navbar\n  position fixed\n  z-index 20\n  top 0\n  left 0\n  right 0\n  height $navbarHeight\n  background-color #fff\n  box-sizing border-box\n  border-bottom 1px solid $borderColor\n\n.sidebar-mask\n  position fixed\n  z-index 9\n  top 0\n  left 0\n  width 100vw\n  height 100vh\n  display none\n\n.sidebar\n  font-size 16px\n  background-color #fff\n  width $sidebarWidth\n  position fixed\n  z-index 10\n  margin 0\n  top $navbarHeight\n  left 0\n  bottom 0\n  box-sizing border-box\n  border-right 1px solid $borderColor\n  overflow-y auto\n\n{$contentClass}:not(.custom)\n  @extend $wrapper\n  > *:first-child\n    margin-top $navbarHeight\n\n  a:hover\n    text-decoration underline\n\n  p.demo\n    padding 1rem 1.5rem\n    border 1px solid #ddd\n    border-radius 4px\n\n  img\n    max-width 100%\n\n{$contentClass}.custom\n  padding 0\n  margin 0\n\n  img\n    max-width 100%\n\na\n  font-weight 500\n  color $accentColor\n  text-decoration none\n\np a code\n  font-weight 400\n  color $accentColor\n\nkbd\n  background #eee\n  border solid 0.15rem #ddd\n  border-bottom solid 0.25rem #ddd\n  border-radius 0.15rem\n  padding 0 0.15em\n\nblockquote\n  font-size 1rem\n  color #999;\n  border-left .2rem solid #dfe2e5\n  margin 1rem 0\n  padding .25rem 0 .25rem 1rem\n\n  & > p\n    margin 0\n\nul, ol\n  padding-left 1.2em\n\nstrong\n  font-weight 600\n\nh1, h2, h3, h4, h5, h6\n  font-weight 600\n  line-height 1.25\n\n  {$contentClass}:not(.custom) > &\n    margin-top (0.5rem - $navbarHeight)\n    padding-top ($navbarHeight + 1rem)\n    margin-bottom 0\n\n    &:first-child\n      margin-top -1.5rem\n      margin-bottom 1rem\n\n      + p, + pre, + .custom-block\n        margin-top 2rem\n\n  &:focus .header-anchor,\n  &:hover .header-anchor\n    opacity: 1\n\nh1\n  font-size 2.2rem\n\nh2\n  font-size 1.65rem\n  padding-bottom .3rem\n  border-bottom 1px solid $borderColor\n\nh3\n  font-size 1.35rem\n\na.header-anchor\n  font-size 0.85em\n  float left\n  margin-left -0.87em\n  padding-right 0.23em\n  margin-top 0.125em\n  opacity 0\n\n  &:focus,\n  &:hover\n    text-decoration none\n\ncode, kbd, .line-number\n  font-family source-code-pro, Menlo, Monaco, Consolas, \"Courier New\", monospace\n\np, ul, ol\n  line-height 1.7\n\nhr\n  border 0\n  border-top 1px solid $borderColor\n\ntable\n  border-collapse collapse\n  margin 1rem 0\n  display: block\n  overflow-x: auto\n\ntr\n  border-top 1px solid #dfe2e5\n\n  &:nth-child(2n)\n    background-color #f6f8fa\n\nth, td\n  border 1px solid #dfe2e5\n  padding .6em 1em\n\n.theme-container\n  &.sidebar-open\n    .sidebar-mask\n      display: block\n\n  &.no-navbar\n    {$contentClass}:not(.custom) > h1, h2, h3, h4, h5, h6\n      margin-top 1.5rem\n      padding-top 0\n\n    .sidebar\n      top 0\n\n@media (min-width: ($MQMobile + 1px))\n  .theme-container.no-sidebar\n    .sidebar\n      display none\n\n    .page\n      padding-left 0\n\n@require 'mobile.styl'\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/mobile.styl",
    "content": "@require './config'\n\n$mobileSidebarWidth = $sidebarWidth * 0.82\n\n// narrow desktop / iPad\n@media (max-width: $MQNarrow)\n  .sidebar\n    font-size 15px\n    width $mobileSidebarWidth\n  .page\n    padding-left $mobileSidebarWidth\n\n// wide mobile\n@media (max-width: $MQMobile)\n  .sidebar\n    top 0\n    padding-top $navbarHeight\n    transform translateX(-100%)\n    transition transform .2s ease\n  .page\n    padding-left 0\n  .theme-container\n    &.sidebar-open\n      .sidebar\n        transform translateX(0)\n    &.no-navbar\n      .sidebar\n        padding-top: 0\n\n// narrow mobile\n@media (max-width: $MQMobileNarrow)\n  h1\n    font-size 1.9rem\n  {$contentClass}\n    div[class*=\"language-\"]\n      margin 0.85rem -1.5rem\n      border-radius 0\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/toc.styl",
    "content": ".table-of-contents\n  .badge\n    vertical-align middle\n"
  },
  {
    "path": "docs/.vuepress/theme/styles/wrapper.styl",
    "content": "$wrapper\n  max-width $contentWidth\n  margin 0 auto\n  padding 2rem 2.5rem\n  @media (max-width: $MQNarrow)\n    padding 2rem\n  @media (max-width: $MQMobileNarrow)\n    padding 1.5rem\n\n"
  },
  {
    "path": "docs/.vuepress/theme/util/index.js",
    "content": "export const hashRE = /#.*$/\nexport const extRE = /\\.(md|html)$/\nexport const endingSlashRE = /\\/$/\nexport const outboundRE = /^[a-z]+:/i\n\nexport function normalize(path) {\n  return decodeURI(path).replace(hashRE, \"\").replace(extRE, \"\")\n}\n\nexport function getHash(path) {\n  const match = path.match(hashRE)\n  if (match) {\n    return match[0]\n  }\n}\n\nexport function isExternal(path) {\n  return outboundRE.test(path)\n}\n\nexport function isMailto(path) {\n  return /^mailto:/.test(path)\n}\n\nexport function isTel(path) {\n  return /^tel:/.test(path)\n}\n\nexport function ensureExt(path) {\n  if (isExternal(path)) {\n    return path\n  }\n  const hashMatch = path.match(hashRE)\n  const hash = hashMatch ? hashMatch[0] : \"\"\n  const normalized = normalize(path)\n\n  if (endingSlashRE.test(normalized)) {\n    return path\n  }\n  return normalized + \".html\" + hash\n}\n\nexport function isActive(route, path) {\n  const routeHash = decodeURIComponent(route.hash)\n  const linkHash = getHash(path)\n  if (linkHash && routeHash !== linkHash) {\n    return false\n  }\n  const routePath = normalize(route.path)\n  const pagePath = normalize(path)\n  return routePath === pagePath\n}\n\nexport function resolvePage(pages, rawPath, base) {\n  if (isExternal(rawPath)) {\n    return {\n      type: \"external\",\n      path: rawPath,\n    }\n  }\n  if (base) {\n    rawPath = resolvePath(rawPath, base)\n  }\n  const path = normalize(rawPath)\n  for (let i = 0; i < pages.length; i++) {\n    if (normalize(pages[i].regularPath) === path) {\n      return Object.assign({}, pages[i], {\n        type: \"page\",\n        path: ensureExt(pages[i].path),\n      })\n    }\n  }\n  console.error(`[vuepress] No matching page found for sidebar item \"${rawPath}\"`)\n  return {}\n}\n\nfunction resolvePath(relative, base, append) {\n  const firstChar = relative.charAt(0)\n  if (firstChar === \"/\") {\n    return relative\n  }\n\n  if (firstChar === \"?\" || firstChar === \"#\") {\n    return base + relative\n  }\n\n  const stack = base.split(\"/\")\n\n  // remove trailing segment if:\n  // - not appending\n  // - appending to trailing slash (last segment is empty)\n  if (!append || !stack[stack.length - 1]) {\n    stack.pop()\n  }\n\n  // resolve relative path\n  const segments = relative.replace(/^\\//, \"\").split(\"/\")\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i]\n    if (segment === \"..\") {\n      stack.pop()\n    } else if (segment !== \".\") {\n      stack.push(segment)\n    }\n  }\n\n  // ensure leading slash\n  if (stack[0] !== \"\") {\n    stack.unshift(\"\")\n  }\n\n  return stack.join(\"/\")\n}\n\n/**\n * @param { Page } page\n * @param { string } regularPath\n * @param { SiteData } site\n * @param { string } localePath\n * @returns { SidebarGroup }\n */\nexport function resolveSidebarItems(page, regularPath, site, localePath) {\n  const {pages, themeConfig} = site\n\n  const localeConfig =\n    localePath && themeConfig.locales ? themeConfig.locales[localePath] || themeConfig : themeConfig\n\n  const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar\n  if (pageSidebarConfig === \"auto\") {\n    return resolveHeaders(page)\n  }\n\n  const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar\n  if (!sidebarConfig) {\n    return []\n  } else {\n    const {base, config} = resolveMatchingConfig(regularPath, sidebarConfig)\n    if (config === \"auto\") {\n      return resolveHeaders(page)\n    }\n    return config ? config.map((item) => resolveItem(item, pages, base)) : []\n  }\n}\n\n/**\n * @param { Page } page\n * @returns { SidebarGroup }\n */\nfunction resolveHeaders(page) {\n  const headers = groupHeaders(page.headers || [])\n  return [\n    {\n      type: \"group\",\n      collapsable: false,\n      title: page.title,\n      path: null,\n      children: headers.map((h) => ({\n        type: \"auto\",\n        title: h.title,\n        basePath: page.path,\n        path: page.path + \"#\" + h.slug,\n        children: h.children || [],\n      })),\n    },\n  ]\n}\n\nexport function groupHeaders(headers) {\n  // group h3s under h2\n  headers = headers.map((h) => Object.assign({}, h))\n  let lastH2\n  headers.forEach((h) => {\n    if (h.level === 2) {\n      lastH2 = h\n    } else if (lastH2) {\n      ;(lastH2.children || (lastH2.children = [])).push(h)\n    }\n  })\n  return headers.filter((h) => h.level === 2)\n}\n\nexport function resolveNavLinkItem(linkItem) {\n  return Object.assign(linkItem, {\n    type: linkItem.items && linkItem.items.length ? \"links\" : \"link\",\n  })\n}\n\n/**\n * @param { Route } route\n * @param { Array<string|string[]> | Array<SidebarGroup> | [link: string]: SidebarConfig } config\n * @returns { base: string, config: SidebarConfig }\n */\nexport function resolveMatchingConfig(regularPath, config) {\n  if (Array.isArray(config)) {\n    return {\n      base: \"/\",\n      config: config,\n    }\n  }\n  for (const base in config) {\n    if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) {\n      return {\n        base,\n        config: config[base],\n      }\n    }\n  }\n  return {}\n}\n\nfunction ensureEndingSlash(path) {\n  return /(\\.html|\\/)$/.test(path) ? path : path + \"/\"\n}\n\nfunction resolveItem(item, pages, base, groupDepth = 1) {\n  if (typeof item === \"string\") {\n    return resolvePage(pages, item, base)\n  } else if (Array.isArray(item)) {\n    return Object.assign(resolvePage(pages, item[0], base), {\n      title: item[1],\n    })\n  } else {\n    const children = item.children || []\n    if (children.length === 0 && item.path) {\n      return Object.assign(resolvePage(pages, item.path, base), {\n        title: item.title,\n      })\n    }\n    return {\n      type: \"group\",\n      path: item.path,\n      title: item.title,\n      sidebarDepth: item.sidebarDepth,\n      initialOpenGroupIndex: item.initialOpenGroupIndex,\n      children: children.map((child) => resolveItem(child, pages, base, groupDepth + 1)),\n      collapsable: item.collapsable !== false,\n    }\n  }\n}\n"
  },
  {
    "path": "docs/README.md",
    "content": "---\nhomepage: true\nsidebar: false\n---\n\n<HeroSection>\n\n# Ajv JSON schema validator\n\n## Security and reliability for JavaScript applications\n\n<Features>\n<Feature type=\"less-code\" link=\"/guide/why-ajv.html#write-less-code\">\n\n### Write less code\n\nEnsure your data is valid once it is received\n\n</Feature>\n<Feature type=\"fast-secure\" link=\"/guide/why-ajv.html#super-fast-secure\">\n\n### Super fast & secure\n\nCompiles your schemas to optimized JavaScript code\n\n</Feature>\n\n<Feature type=\"multi-spec\" link=\"/guide/why-ajv.html#multi-standard\">\n\n### Multi-standard\n\nUse JSON Type Definition or JSON Schema\n\n</Feature>\n</Features>\n\n<Sponsors level=\"platinum\">\n\n## Ajv sponsors\n\n[![mozilla](/img/mozilla.svg)](https://www.mozilla.org)\n[![reserved](/img/reserved.svg)](https://opencollective.com/ajv)\n\n</Sponsors>\n\n<Sponsors level=\"gold\">\n\n[![microsoft](/img/microsoft.png)](https://opensource.microsoft.com)\n[![reserved](/img/reserved.svg)](https://opencollective.com/ajv)\n[![reserved](/img/reserved.svg)](https://opencollective.com/ajv)\n\n</Sponsors>\n\n<Sponsors level=\"bronze\">\n\n[![Retool](/img/retool.svg)](https://retool.com/?utm_source=sponsor&utm_campaign=ajv)\n[![Tidelift](/img/tidelift.svg)](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=enterprise)\n[![SimpleX](/img/simplex.svg)](https://github.com/simplex-chat/simplex-chat)\n[![reserved](/img/reserved.svg)](https://opencollective.com/ajv)\n\n</Sponsors>\n\n</HeroSection>\n\n<HomeSection>\n<Columns>\n<Column side=\"left\">\n\nAjv is used by a large number of JavaScript applications and libraries in all JavaScript environments - Node.js, browser, Electron apps, WeChat mini-apps etc.\n\nIt allows implementing complex data validation logic via declarative schemas for your JSON data, without writing code.\n\nOut of the box, Ajv supports [JSON Schema](./json-schema.md) (drafts 04, 06, 07, 2019-09 and 2020-12) and [JSON Type Definition](./json-type-definition.md) ([RFC8927](https://datatracker.ietf.org/doc/rfc8927/)).\n\n<br/>\n\n<Button link=\"/guide/getting-started.html\">Learn Ajv</Button>\n\n<br/>\n\n</Column>\n\n<Column side=\"right\">\n<code-group>\n<code-block title=\"JSON Schema\">\n```javascript\nconst Ajv = require(\"ajv\")\nconst ajv = new Ajv()\n\nconst schema = {\n  type: \"object\",\n  properties: {\n    foo: {type: \"integer\"},\n    bar: {type: \"string\"}\n  },\n  required: [\"foo\"],\n  additionalProperties: false\n}\n\nconst data = {foo: 1, bar: \"abc\"}\nconst valid = ajv.validate(schema, data)\nif (!valid) console.log(ajv.errors)\n```\n</code-block>\n\n<code-block title=\"JSON Type Definition\">\n```javascript\nconst Ajv = require(\"ajv/dist/jtd\")\nconst ajv = new Ajv()\n\nconst schema = {\n  properties: {\n    foo: {type: \"int32\"}\n  },\n  optionalProperties: {\n    bar: {type: \"string\"}\n  }\n}\n\n\nconst data = {foo: 1, bar: \"abc\"}\nconst valid = ajv.validate(schema, data)\nif (!valid) console.log(ajv.errors)\n```\n</code-block>\n</code-group>\n</Column>\n</Columns>\n</HomeSection>\n\n<HomeSection section=\"testimonials\">\n\n## What users say\n\n<Testimonials>\n<Testimonial color=\"green\">\n\nAjv stands out as the implementation of choice - it provides a rich API which many thousands of people use in production... Ajv is partly responsible for the success of JSON Schema.\n\n[Ben Hutton](https://github.com/relequestual), JSON Schema Specification Lead\n\n</Testimonial>\n\n<Testimonial color=\"blue\">\n\n[ESLint](https://eslint.org/) has used Ajv for validating our complex configurations. Ajv has proven to be reliable over the years we’ve been using it and ESLint is proud to sponsor Ajv’s continued development.\n\n[Nicholas C. Zakas](https://github.com/nzakas), ESLint creator and TSC member\n\n</Testimonial>\n</Testimonials>\n\n<span style=\"float:right;\">[All quotes](./testimonials.md)</span>\n\n</HomeSection>\n\n<HomeSection>\n\n## News\n\n<NewsHome/>\n\n</HomeSection>\n\n<HomeSection>\n\n## Who uses Ajv\n\n<Projects>\n[![eslint](./projects/eslint.png)](https://eslint.org)\n[![stoplight](./projects/stoplight.png)](https://stoplight.io)\n[![webpack](./projects/webpack.svg)](https://webpack.js.org)\n[table](https://github.com/gajus/table)\n[![fastify](./projects/fastify.png)](https://www.fastify.io)\n[restbase](https://github.com/wikimedia/restbase)\n[objection.js](https://github.com/vincit/objection.js)\n[![Taskcluster](./projects/taskcluster.png)](https://taskcluster.net)\n[![RxDB](./projects/rxdb.svg)](https://rxdb.info)\n[![react-jsonschema-form](./projects/rjsf.png)](https://github.com/rjsf-team/react-jsonschema-form)\n[![autorest](./projects/autorest.png)](https://github.com/Azure/autorest)\n[![node-red](./projects/nodered.png)](https://github.com/node-red/node-red)\n[![MDN](./projects/mdn.svg)](https://developer.mozilla.org)\n[![quicktype](./projects/quicktype.svg)](https://github.com/quicktype/quicktype)\n[![vue-form-generator](./projects/vue-form-generator.png)](https://github.com/vue-generators/vue-form-generator)\n[![teambit](./projects/teambit.png)](https://github.com/teambit/bit)\n[React Page](https://react-page.github.io)\n[![Backstage](./projects/backstage.svg)](https://backstage.io)\n[![rushstack](./projects/rushstack.svg)](https://github.com/microsoft/rushstack)\n[JupyterLab](https://github.com/jupyterlab/jupyterlab)\n[![0x](./projects/0x.png)](https://github.com/davidmarkclements/0x)\n[Plank.js](https://piqnt.com/planck.js/)\n[![fast](./projects/fast.svg)](https://www.fast.design)\n[![netlify cms](./projects/netlify-cms.png)](https://www.netlifycms.org)\n[![ng-alain](./projects/ng-alain.svg)](https://ng-alain.com/en)\n[![Vercel](./projects/vercel.svg)](https://vercel.com)\n[![AWS Amplify](./projects/aws-amplify.png)](https://github.com/aws-amplify/amplify-cli)\n[![FB flipper](./projects/flipper.png)](https://github.com/facebook/flipper)\n[![nx.dev](./projects/nx.svg)](https://nx.dev)\n[![express gateway](./projects/express-gateway.svg)](https://www.express-gateway.io)\n[![zigbee2mqtt](./projects/zigbee2mqtt.png)](https://www.zigbee2mqtt.io)\n[![dependency-cruiser](./projects/dependency-cruiser.png)](https://github.com/sverweij/dependency-cruiser)\n[![theia](./projects/theia.svg)](https://theia-ide.org)\n[![TSDoc](./projects/tsdoc.svg)](https://tsdoc.org)\n[![webhint](./projects/webhint.jpg)](https://webhint.io)\n[Vega-Lite](https://vega.github.io/vega-lite/)\n[![middy](./projects/middy.png)](https://middy.js.org)\n[JSDoc](https://github.com/jsdoc/jsdoc)\n[![Ts.ED](./projects/tsed.png)](https://tsed.io)\n\n</Projects>\n</HomeSection>\n\n<HomeSection section=\"contributors\">\n\n## Contributors\n\nAjv is free to use and open-source that many developers contributed to. Join us!\n\n<Contributors />\n\n</HomeSection>\n\n<HomeSection section=\"footer\">\n\n<FooterColumns>\n<FooterColumn type=\"ajv\">\n![ajv](/img/ajv.svg)\n\n</FooterColumn>\n\n<FooterColumn type=\"links\">\n\n[Learn Ajv](./guide/getting-started.md)\n\n[Reference](./api.md)\n\n[Security](./security.md)\n\n</FooterColumn>\n\n<FooterColumn type=\"links\">\n\n[JSON Schema](./json-schema.md)\n\n[JSON Type Definition](./json-type-definition.md)\n\n[Contributing](./contributing.md)\n\n</FooterColumn>\n\n<FooterColumn type=\"sponsors\">\n\n[![mozilla](/img/mozilla.svg)](https://www.mozilla.org)\n[![reserved](/img/reserved.svg)](https://opencollective.com/ajv)\n\n</FooterColumn>\n</FooterColumns>\n\n[&copy; 2015-2021](./license.md) | Ajv JSON schema validator | [ajv.validator@gmail.com](mailto:ajv.validator@gmail.com)\n\n</HomeSection>\n"
  },
  {
    "path": "docs/api.md",
    "content": "# API Reference\n\n[[toc]]\n\n## Ajv constructor and methods\n\n### new Ajv(options: object)\n\nCreate Ajv instance:\n\n```javascript\nconst ajv = new Ajv()\n```\n\nSee [Options](./options)\n\n### ajv.compile(schema: object): (data: any) => boolean | Promise < any >\n\nGenerate validating function and cache the compiled schema for future use.\n\nValidating function returns a boolean value (or promise for async schemas that must have `$async: true` property - see [Asynchronous validation](./guide/async-validation.md)). This function has properties `errors` and `schema`. Errors encountered during the last validation are assigned to `errors` property (it is assigned `null` if there was no errors). `schema` property contains the reference to the original schema.\n\nThe schema passed to this method will be validated against meta-schema unless `validateSchema` option is false. If schema is invalid, an error will be thrown. See [options](#options).\n\nIn typescript returned validation function can be a type guard if you pass type parameter:\n\n```typescript\ninterface Foo {\n  foo: number\n}\n\nconst FooSchema: JSONSchemaType<Foo> = {\n  type: \"object\",\n  properties: {foo: {type: \"number\"}},\n  required: [\"foo\"],\n  additionalProperties: false,\n}\n\nconst validate = ajv.compile<Foo>(FooSchema) // type of validate extends `(data: any) => data is Foo`\nconst data: any = {foo: 1}\nif (validate(data)) {\n  // data is Foo here\n  console.log(data.foo)\n} else {\n  console.log(validate.errors)\n}\n```\n\nSee more advanced example in [the test](https://github.com/ajv-validator/ajv/blob/master/spec/types/json-schema.spec.ts).\n\n<a name=\"jtd-serialize\"></a>\n\n### ajv.compileSerializer(schema: object): (data: any) => string <Badge text=\"NEW\" />\n\nGenerate serializing function based on the [JTD schema](./json-type-definition.md) (caches the schema) - only in JTD instance of Ajv (see example below).\n\nSerializers compiled from JTD schemas can be more than 10 times faster than using `JSON.stringify`, because they do not traverse all the data, only the properties that are defined in the schema.\n\nProperties not defined in the schema will not be included in serialized JSON, unless the schema has `additionalProperties: true` flag. It can also be beneficial from the application security point of view, as it prevents leaking accidentally/temporarily added additional properties to the API responses.\n\nIf you use JTD with typescript, the type for the schema can be derived from the data type, and generated serializer would only accept correct data type in this case:\n\n```typescript\nimport Ajv, {JTDSchemaType} from \"ajv/dist/jtd\"\nconst ajv = new Ajv()\n\ninterface MyData {\n  foo: number\n  bar?: string\n}\n\nconst mySchema: JTDSchemaType<MyData> = {\n  properties: {\n    foo: {type: \"int32\"} // any JTD number type would be accepted here\n  },\n  optionalProperties: {\n    bar: {type: \"string\"}\n  }\n}\n\nconst serializeMyData = ajv.compileSerializer(mySchema)\n\n// serializeMyData has type (x: MyData) => string\n// it prevents you from accidentally passing the wrong type\n```\n\n::: warning Compiled serializers do NOT validate data!\nIt is assumed that the data is valid according to the schema.\n:::\n\n<a name=\"jtd-parse\"></a>\n\n### ajv.compileParser(schema: object): (json: string) => any <Badge text=\"NEW\" />\n\nGenerate parsing function based on the [JTD schema](./json-type-definition.md) (caches the schema) - only in JTD instance of Ajv (see example below).\n\nParsers compiled from JTD schemas have comparable performance to `JSON.parse`<sup>\\*</sup> in case JSON string is valid according to the schema (and they do not just parse JSON - they ensure that parsed JSON is valid according to the schema as they parse), but they can be many times faster in case the string is invalid - for example, if schema expects an object, and JSON string is array the parser would fail on the first character.\n\nParsing will fail if there are properties not defined in the schema, unless the schema has `additionalProperties: true` flag.\n\nIf you use JTD with typescript, the type for the schema can be derived from the data type, and generated parser will return correct data type (see definitions example in the [serialize](#jtd-serialize) section):\n\n```typescript\nconst parseMyData = ajv.compileParser(mySchema)\n\n// parseMyData has type (s: string) => MyData | undefined\n// it returns correct data type in case parsing is successful and undefined if not\n\nconst validData = parseMyData('{\"foo\":1}') // {foo: 1} - success\n\nconst invalidData = parseMyData('{\"x\":1}') // undefined - failure\nconsole.log(parseMyData.position) // 4\nconsole.log(parseMyData.message) // property x not allowed\n```\n\n<sup>\\*</sup> As long as empty schema `{}` is not used - there is a possibility to improve performance in this case. Also, the performance of parsing `discriminator` schemas depends on the position of discriminator tag in the schema - the best parsing performance will be achieved if the tag is the first property - this is how compiled JTD serializers generate JSON in case of discriminator schemas.\n\n<a name=\"api-compileAsync\"></a>\n\n### ajv.compileAsync(schema: object, meta?: boolean): Promise < Function >\n\nAsynchronous version of `compile` method that loads missing remote schemas using asynchronous function in `options.loadSchema`. This function returns a Promise that resolves to a validation function. An optional callback passed to `compileAsync` will be called with 2 parameters: error (or null) and validating function. The returned promise will reject (and the callback will be called with an error) when:\n\n- missing schema can't be loaded (`loadSchema` returns a Promise that rejects).\n- a schema containing a missing reference is loaded, but the reference cannot be resolved.\n- schema (or some loaded/referenced schema) is invalid.\n\nThe function compiles schema and loads the first missing schema (or meta-schema) until all missing schemas are loaded.\n\nYou can asynchronously compile meta-schema by passing `true` as the second parameter.\n\nSimilarly to `compile`, it can return type guard in typescript.\n\nSee example in [Asynchronous schema loading](./guide/managing-schemas.md#asynchronous-schema-loading).\n\n### ajv.validate(schemaOrRef: object | string, data: any): boolean\n\nValidate data using passed schema (it will be compiled and cached).\n\nInstead of the schema you can use the key that was previously passed to `addSchema`, the schema id if it was present in the schema or any previously resolved reference.\n\nValidation errors will be available in the `errors` property of Ajv instance (`null` if there were no errors).\n\nIn typescript this method can act as a type guard (similarly to function returned by `compile` method - see example there).\n\n::: warning Save errors property\nEvery time this method is called the errors are overwritten so you need to copy them to another variable if you want to use them later.\n:::\n\nIf the schema is asynchronous (has `$async` keyword on the top level) this method returns a Promise. See [Asynchronous validation](./guide/async-validation.md).\n\n<a id=\"add-schema\"></a>\n\n### ajv.addSchema(schema: object | object[], key?: string): Ajv\n\nAdd schema(s) to validator instance. This method does not compile schemas (but it still validates them). Because of that dependencies can be added in any order and circular dependencies are supported. It also prevents unnecessary compilation of schemas that are containers for other schemas but not used as a whole.\n\nArray of schemas can be passed (schemas should have ids), the second parameter will be ignored.\n\nKey can be passed that can be used to reference the schema and will be used as the schema id if there is no id inside the schema. If the key is not passed, the schema id will be used as the key.\n\nOnce the schema is added, it (and all the references inside it) can be referenced in other schemas and used to validate data.\n\nAlthough `addSchema` does not compile schemas, explicit compilation is not required - the schema will be compiled when it is used first time.\n\nBy default the schema is validated against meta-schema before it is added, and if the schema does not pass validation the exception is thrown. This behaviour is controlled by `validateSchema` option.\n\n::: tip Method chaining\nAjv returns its instance for chaining from all methods prefixed `add*` and `remove*`:\n\n```javascript\nconst validate = new Ajv().addSchema(schema).addFormat(name, regex).getSchema(uri)\n```\n:::\n\n### ajv.addMetaSchema(schema: object | object[], key?: string): Ajv\n\nAdds meta schema(s) that can be used to validate other schemas. That function should be used instead of `addSchema` because there may be instance options that would compile a meta schema incorrectly (at the moment it is `removeAdditional` option).\n\nThere is no need to explicitly add draft-07 meta schema (http://json-schema.org/draft-07/schema) - it is added by default, unless option `meta` is set to `false`. You only need to use it if you have a changed meta-schema that you want to use to validate your schemas. See `validateSchema`.\n\n<a name=\"api-validateschema\"></a>\n\n### ajv.validateSchema(schema: object): boolean\n\nValidates schema. This method should be used to validate schemas rather than `validate` due to the inconsistency of `uri` format in JSON Schema standard.\n\nBy default this method is called automatically when the schema is added, so you rarely need to use it directly.\n\nIf schema doesn't have `$schema` property, it is validated against draft 6 meta-schema (option `meta` should not be false).\n\nIf schema has `$schema` property, then the schema with this id (that should be previously added) is used to validate passed schema.\n\nErrors will be available at `ajv.errors`.\n\n### ajv.getSchema(key: string): undefined | ((data: any) => boolean | Promise < any >)\n\nRetrieve compiled schema previously added with `addSchema` by the key passed to `addSchema` or by its full reference (id). The returned validating function has `schema` property with the reference to the original schema.\n\n### ajv.removeSchema(schemaOrRef: object | string | RegExp): Ajv\n\nRemove added/cached schema. Even if schema is referenced by other schemas it can be safely removed as dependent schemas have local references.\n\nSchema can be removed using:\n\n- key passed to `addSchema`\n- it's full reference (id)\n- RegExp that should match schema id or key (meta-schemas won't be removed)\n- actual schema object (that will be optionally serialized) to remove schema from cache\n\nIf no parameter is passed all schemas but meta-schemas will be removed and the cache will be cleared.\n\n<a name=\"api-addformat\"></a>\n\n### ajv.addFormat(name: string, format: Format): Ajv\n\n```typescript\ntype Format =\n  | true // to ignore this format (and pass validation)\n  | string // will be converted to RegExp\n  | RegExp\n  | (data: string) => boolean\n  | Object // format definition (see below and in types)\n```\n\nAdd format to validate strings or numbers.\n\nIf object is passed it should have properties `validate`, `compare` and `async`:\n\n```typescript\ninterface FormatDefinition { // actual type definition is more precise - see types.ts\n  validate: string | RegExp | (data: number | string) => boolean | Promise<boolean>\n  compare: (data1: string, data2: string): number // an optional function that accepts two strings\n    // and compares them according to the format meaning.\n    // This function is used with keywords `formatMaximum`/`formatMinimum`\n    // (defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package).\n    // It should return `1` if the first value is bigger than the second value,\n    // `-1` if it is smaller and `0` if it is equal.\n  async?: true // if `validate` is an asynchronous function\n  type?: \"string\" | \"number\" // \"string\" is default. If data type is different, the validation will pass.\n}\n```\n\nFormats can be also added via `formats` option.\n\n<a name=\"api-addkeyword\"></a>\n\n### ajv.addKeyword(definition: string | object): Ajv\n\nAdd validation keyword to Ajv instance.\n\nKeyword should be different from all standard JSON Schema keywords and different from previously defined keywords. There is no way to redefine keywords or to remove keyword definition from the instance.\n\nKeyword must start with an ASCII letter, `_` or `$`, and may continue with ASCII letters, numbers, `_`, `$`, `-`, or `:`.\nIt is recommended to use an application-specific prefix for keywords to avoid current and future name collisions.\n\nExample Keywords:\n\n- `\"xyz-example\"`: valid, and uses prefix for the xyz project to avoid name collisions.\n- `\"example\"`: valid, but not recommended as it may collide with future versions of JSON Schema etc.\n- `\"3-example\"`: invalid as numbers are not allowed to be the first character in a keyword\n\nKeyword definition is an object with the following properties:\n\n```typescript\ninterface KeywordDefinition {\n  // actual type definition is more precise - see types.ts\n  keyword: string // keyword name\n  type?: string | string[] // JSON data type(s) the keyword applies to. Default - all types.\n  schemaType?: string | string[] // the required schema JSON type\n  code?: Function // function to generate code, used for all pre-defined keywords\n  validate?: Function // validating function\n  compile?: Function // compiling function\n  macro?: Function // macro function\n  error?: object // error definition object - see types.ts\n  schema?: false // used with \"validate\" keyword to not pass schema to function\n  metaSchema?: object // meta-schema for keyword schema\n  dependencies?: string[] // properties that must be present in the parent schema -\n  // it will be checked during schema compilation\n  implements?: string[] // keyword names to reserve that this keyword implements\n  modifying?: true // MUST be passed if keyword modifies data\n  valid?: boolean // to pre-define validation result, validation function result will be ignored -\n  // this option MUST NOT be used with `macro` keywords.\n  $data?: true // to support [\\$data reference](./guide/combining-schemas.md#data-reference) as the value of keyword.\n  // The reference will be resolved at validation time. If the keyword has meta-schema,\n  // it would be extended to allow $data and it will be used to validate the resolved value.\n  // Supporting $data reference requires that keyword has `code` or `validate` function\n  // (the latter can be used in addition to `compile` or `macro`).\n  $dataError?: object // error definition object for invalid \\$data schema - see types.ts\n  async?: true // if the validation function is asynchronous\n  // (whether it is returned from `compile` or passed in `validate` property).\n  // It should return a promise that resolves with a value `true` or `false`.\n  // This option is ignored in case of \"macro\" and \"code\" keywords.\n  errors?: boolean | \"full\" // whether keyword returns errors.\n  // If this property is not passed Ajv will determine\n  // if the errors were set in case of failed validation.\n}\n```\n\nIf only the property `keyword` is provided in the definition object, you can also pass the keyword name as the argument.\n\n`compile`, `macro` and `code` are mutually exclusive, only one should be used at a time. `validate` can be used separately or in addition to `compile` or `macro` to support [\\$data reference](./guide/combining-schemas.md#data-reference).\n\n::: tip Keyword is validated only for applicable data types\nIf the keyword is validating data type that is different from the type(s) in its definition, the validation function will not be called (and expanded macro will not be used), so there is no need to check for data type inside validation function or inside schema returned by macro function (unless you want to enforce a specific type and for some reason do not want to use a separate `type` keyword for that). In the same way as standard keywords work, if the keyword does not apply to the data type being validated, the validation of this keyword will succeed.\n:::\n\nSee [User defined keywords](./keywords.md) for more details.\n\n### ajv.getKeyword(keyword: string): object | boolean\n\nReturns keyword definition, `false` if the keyword is unknown.\n\n### ajv.removeKeyword(keyword: string): Ajv\n\nRemoves added or pre-defined keyword so you can redefine them.\n\nWhile this method can be used to extend pre-defined keywords, it can also be used to completely change their meaning - it may lead to unexpected results.\n\n::: warning Compiled schemas and removed keywords\nThe schemas compiled before the keyword is removed will continue to work without changes. To recompile schemas use `removeSchema` method and compile them again.\n:::\n\n### ajv.errorsText(errors?: object[], options?: object): string\n\nReturns the text with all errors in a String.\n\nOptions can have properties `separator` (string used to separate errors, \", \" by default) and `dataVar` (the variable name that instancePath is prefixed with, \"data\" by default).\n\n## Validation errors\n\nIn case of validation failure, Ajv assigns the array of errors to `errors` property of validation function (or to `errors` property of Ajv instance when `validate` or `validateSchema` methods were called). In case of [asynchronous validation](./guide/async-validation.md), the returned promise is rejected with exception `Ajv.ValidationError` that has `errors` property.\n\n### Error objects\n\nEach reported error is an object with the following properties:\n\n```typescript\ninterface ErrorObject {\n  keyword: string // validation keyword.\n  instancePath: string // JSON Pointer to the location in the data instance (e.g., `\"/prop/1/subProp\"`).\n  schemaPath: string // JSON Pointer to the location of the failing keyword in the schema\n  params: object // type is defined by keyword value, see below\n                 // params property is the object with the additional information about error\n                 // it can be used to generate error messages\n                 // (e.g., using [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package).\n                 // See below for parameters set by all keywords.\n  propertyName?: string // set for errors in `propertyNames` keyword schema.\n                        // `instancePath` still points to the object in this case.\n  message?: string // the error message (can be excluded with option `messages: false`).\n  // Options below are added with `verbose` option:\n  schema?: any // the value of the failing keyword in the schema.\n  parentSchema?: object // the schema containing the keyword.\n  data?: any // the data validated by the keyword.\n}\n```\n\nFor [JTD](./json-type-definition.md) schemas `instancePath` and `schemaPath` depend on the nature of the failure - the errors are consistent with [RFC8927](https://datatracker.ietf.org/doc/rfc8927/).\n\n### Error parameters\n\nProperties of `params` object in errors depend on the keyword that failed validation.\n\nIn typescript, the ErrorObject is a discriminated union that allows to determine the type of error parameters based on the value of keyword:\n\n```typescript\nconst ajv = new Ajv()\nconst validate = ajv.compile<MyData>(schema)\nif (validate(data)) {\n  // data is MyData here\n  // ...\n} else {\n  // DefinedError is a type for all pre-defined keywords errors,\n  // validate.errors has type ErrorObject[] - to allow user-defined keywords with any error parameters.\n  // Users can extend DefinedError to include the keywords errors they defined.\n  for (const err of validate.errors as DefinedError[]) {\n    switch (err.keyword) {\n      case \"maximum\":\n        console.log(err.limit)\n        break\n      case \"pattern\":\n        console.log(err.pattern)\n        break\n      // ...\n    }\n  }\n}\n```\n\nAlso see an example in [this test](https://github.com/ajv-validator/ajv/blob/master/spec/types/error-parameters.spec.ts)\n\n- `maxItems`, `minItems`, `maxLength`, `minLength`, `maxProperties`, `minProperties`:\n\n```typescript\ntype ErrorParams = {limit: number} // keyword value\n```\n\n- `additionalItems`:\n\n```typescript\n// when `items` is an array of schemas and `additionalItems` is false:\ntype ErrorParams = {limit: number} // the maximum number of allowed items\n```\n\n- `additionalProperties`:\n\n```typescript\ntype ErrorParams = {additionalProperty: string}\n// the property not defined in `properties` and `patternProperties` keywords\n```\n\n- `dependencies`:\n\n```typescript\ntype ErrorParams = {\n  property: string // dependent property,\n  missingProperty: string // required missing dependency - only the first one is reported\n  deps: string // required dependencies, comma separated list as a string (TODO change to string[])\n  depsCount: number // the number of required dependencies\n}\n```\n\n- `format`:\n\n```typescript\ntype ErrorParams = {format: string} // keyword value\n```\n\n- `maximum`, `minimum`, `exclusiveMaximum`, `exclusiveMinimum`:\n\n```typescript\ntype ErrorParams = {\n  limit: number // keyword value\n  comparison: \"<=\" | \">=\" | \"<\" | \">\" // operation to compare the data to the limit,\n  // with data on the left and the limit on the right\n}\n```\n\n- `multipleOf`:\n\n```typescript\ntype ErrorParams = {multipleOf: number} // keyword value\n```\n\n- `pattern`:\n\n```typescript\ntype ErrorParams = {pattern: string} // keyword value\n```\n\n- `required`:\n\n```typescript\ntype ErrorParams = {missingProperty: string} // required property that is missing\n```\n\n- `propertyNames`:\n\n```typescript\ntype ErrorParams = {propertyName: string} // invalid property name\n```\n\nUser-defined keywords can define other keyword parameters.\n\n### Errors i18n\n\nYou can use [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package to generate errors in other languages.\n\n### Error logging\n\nA logger instance can be passed via `logger` option to Ajv constructor. The use of other logging packages is supported as long as the package or its associated wrapper exposes the required methods. If any of the required methods are missing an exception will be thrown.\n\n- **Required Methods**: `log`, `warn`, `error`\n\n```javascript\nconst otherLogger = new OtherLogger()\nconst ajv = new Ajv({\n  logger: {\n    log: console.log.bind(console),\n    warn: function warn() {\n      otherLogger.logWarn.apply(otherLogger, arguments)\n    },\n    error: function error() {\n      otherLogger.logError.apply(otherLogger, arguments)\n      console.error.apply(console, arguments)\n    },\n  },\n})\n```\n\n##### Options\n\nThis section is moved to [Initialization options](./options.md) page\n"
  },
  {
    "path": "docs/codegen.md",
    "content": "# Code generation design\n\n[[toc]]\n\nStarting from v7 Ajv uses [CodeGen module](https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen/index.ts) that replaced [doT](https://github.com/olado/dot) templates used earlier.\n\nThe motivations for this change:\n\n- doT templates were difficult to maintain and to change, particularly for the occasional contributors.\n- they discouraged modularity within validation keywords code and also led to implicit dependencies between different parts of code.\n- they had risks of remote code execution in case untrusted schemas were used, even though all identified issues were patched.\n- ES6 template literals that are now widely supported offer a great alternative to both ASTs and to plain string concatenation - this option was not available when Ajv started.\n\n## Safe code generation\n\nCodeGen module defines two tagged templates that should be passed to all code generation methods and used in other tagged templates:\n\n- `_` - to create instances of private \\_Code class that will not be escaped when used in code or other tagged templates.\n- `str` - to create code for string expressions.\n\nFor example, this code:\n\n```typescript\nconst x = 0\n// Name is a subclass of _Code that can be safely used in code - it only allows valid identifiers\n// gen.const creates a unique variable name with the prefix \"num\".\nconst num: Name = gen.const(\"num\", 5)\ngen.if(\n  // _`...` returns the instance of _Code with safe interpolation of `num` and `x`.\n  // if `x` was a string, it would be inserted into code as a quoted string value rather than as a code fragment,\n  // so if `x` contained some code, it would not be executed.\n  _`${num} > ${x}`,\n  () => log(\"greater\"),\n  () => log(\"smaller or equal\")\n)\n\nfunction log(comparison: string): void {\n  // msg creates a string expression with concatenation - see generated code below\n  // type Code = _Code | Name, _Code can only be constructed with template literals\n  const msg: Code = str`${num} is ${comparison} than ${x}`\n  // msg is _Code instance, so it will be inserted via another template without quotes\n  gen.code(_`console.log(${msg})`)\n}\n```\n\ngenerates this javascript code:\n\n```javascript\nconst num0 = 5\nif (num0 > 0) {\n  console.log(num0 + \" is greater than 0\")\n} else {\n  console.log(num0 + \" is smaller or equal than 0\")\n}\n```\n\n`.const`, `.if` and `.code` above are methods of CodeGen class that generate code inside class instance `gen` - see [source code](https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen/index.ts) for all available methods and [tests](https://github.com/ajv-validator/ajv/blob/master/spec/codegen.spec.ts) for other code generation examples.\n\nThese methods only accept instances of private class `_Code`, other values will be rejected by Typescript compiler - the risk to pass unsafe string is mitigated on type level.\n\nIf a string variable were used in `_` template literal, its value would be safely wrapped in quotes - in many cases it is quite useful, as it allows to inject values that can be either string or number via the same template. In the worst case, the generated code could be invalid, but it will prevent the risk of code execution that attacker could pass via untrusted schema as a string value that should be inserted in code (e.g., instead of a number). Also see the comment in the example.\n\n## Code optimization\n\nCodeGen class generates code trees and performs several optimizations before the code is rendered:\n\n1. removes empty and unreachable branches (e.g. `else` branch after `if(true)`, etc.).\n2. removes unused variable declarations.\n3. replaces variables that are used only once and assigned expressions that are explicitly marked as \"constant\" (i.e. having referential transparency) with the expressions themselves.\n\n::: warning Optimizations assume no side effects\nThese optimizations assume that the expressions in `if` conditions, `for` statement headers and assigned expressions are free of any side effects - this is the case for all pre-defined validation keywords.\n:::\n\nSee [these tests](https://github.com/ajv-validator/ajv/blob/master/spec/codegen.spec.ts) for examples.\n\nBy default Ajv does 1-pass optimization - based on the test suite it reduces the code size by 10.5% and the number of tree nodes by 16.7% (TODO benchmark the validation time). The second optimization pass changes it by less than 0.1%, so you won't need it unless you have really complex schemas or if you generate standalone code and want it to pass relevant eslint rules.\n\nOptimization mode can be changed with [options](./api.md#options):\n\n- `{code: {optimize: false}}` - to disable (e.g., when schema compilation time is more important),\n- `{code: {optimize: 2}}` - 2-pass optimization.\n\n## User-defined keywords\n\nWhile tagged template literals wrap passed strings based on their run-time values, CodeGen class methods rely on types to ensure safety of passed parameters - there is no run-time checks that the passed value is an instance of \\_Code class.\n\nIt is strongly recommended to define additional keywords only with Typescript - using plain JavaScript would still allow passing unsafe strings to code generation methods.\n\n::: warning Optimization and side-effects\nIf your user-defined keywords need to have side-effects that are removed by optimization (see above), you may need to disable it.\n:::\n"
  },
  {
    "path": "docs/coercion.md",
    "content": "# Type coercion rules\n\nTo enable type coercion pass option `coerceTypes` to Ajv with `true` or `array` (it is `false` by default). See [example](./guide/modifying-data.md#coercing-data-types).\n\nThe coercion rules are different from JavaScript:\n\n- to validate user input as expected\n- to have the coercion reversible\n- to correctly validate cases where different types are required in subschemas (e.g., in `anyOf`).\n\nType coercion only happens if there is `type` keyword and if without coercion the validation would have failed. If coercion to the required type succeeds then the validation continues to other keywords, otherwise the validation fails.\n\nIf there are multiple types allowed in `type` keyword the coercion will only happen if none of the types match the data and some of the scalar types are present (coercion to/from `object`/`array` is not possible). In this case the validating function will try coercing the data to each type in order until some of them succeeds.\n\nApplication of these rules can have some unexpected consequences. Ajv may coerce the same value multiple times (this is why coercion reversibility is required) as needed at different points in the schema. This is particularly evident when using `oneOf`, which must test all of the subschemas. Ajv will coerce the type for each subschema, possibly resulting in unexpected failure if it can coerce to match more than one of the subschemas. Even if it succeeds, Ajv will not backtrack, so you'll get the type of the final coercion even if that's not the one that allowed the data to pass validation. If possible, structure your schema with `anyOf`, which won't validate subsequent subschemas as soon as it encounters one subschema that matches.\n\nPossible type coercions:\n\n| from&nbsp;type&nbsp;&rarr;<br>to&nbsp;type&nbsp;&darr; |                                     string                                      |                      number                       |                    boolean                     |         null         |                    array\\*                     |\n| ------------------------------------------------------ | :-----------------------------------------------------------------------------: | :-----------------------------------------------: | :--------------------------------------------: | :------------------: | :--------------------------------------------: |\n| string                                                 |                                        -                                        |                  `x`&rarr;`\"\"+x`                  | `false`&rarr;`\"false\"`<br>`true`&rarr;`\"true\"` |   `null`&rarr;`\"\"`   |                 `[x]`&rarr;`x`                 |\n| number /<br>integer                                    |                  Valid number /<br>integer: `x`&rarr;`+x`<br>                   |                         -                         |      `false`&rarr;`0`<br>`true`&rarr;`1`       |   `null`&rarr;`0`    |                 `[x]`&rarr;`x`                 |\n| boolean                                                | `\"false\"`&rarr;`false`<br>`\"true\"`&rarr;`true`<br>`\"abc\"`&#8696;<br>`\"\"`&#8696; | `0`&rarr;`false`<br>`1`&rarr;`true`<br>`x`&#8696; |                       -                        | `null`&rarr;`false`  | `[false]`&rarr;`false`<br>`[true]`&rarr;`true` |\n| null                                                   |              `\"\"`&rarr;`null`<br>`\"null\"`&#8696;<br>`\"abc\"`&#8696;              |           `0`&rarr;`null`<br>`x`&#8696;           |      `false`&rarr;`null`<br>`true`&#8696;      |          -           |              `[null]`&rarr;`null`              |\n| array\\*                                                |                                 `x`&rarr;`[x]`                                  |                  `x`&rarr;`[x]`                   | `false`&rarr;`[false]`<br>`true`&rarr;`[true]` | `null`&rarr;`[null]` |                       -                        |\n\n\\* Requires option `{coerceTypes: \"array\"}`\n\n## Coercion from string values\n\n#### To number type\n\nCoercion to `number` is possible if the string is a valid number, `+data` is used.\n\n#### To integer type\n\nCoercion to `integer` is possible if the string is a valid number without fractional part (`data % 1 === 0`).\n\n#### To boolean type\n\nUnlike JavaScript, only these strings can be coerced to `boolean`:\n\n- `\"true\"` -> `true`\n- `\"false\"` -> `false`\n\n#### To null type\n\nEmpty string is coerced to `null`, other strings can't be coerced.\n\n## Coercion from number values\n\n#### To string type\n\nAlways possible, `'' + data` is used\n\n#### To boolean type\n\nUnlike JavaScript, only these numbers can be coerced to `boolean`:\n\n- `1` -> `true`\n- `0` -> `false`\n\n#### To null type\n\n`0` coerces to `null`, other numbers can't be coerced.\n\n## Coercion from boolean values\n\n#### To string type\n\n- `true` -> `\"true\"`\n- `false` -> `\"false\"`\n\n#### To number/integer types\n\n- `true` -> `1`\n- `false` -> `0`\n\n#### To null type\n\n`false` coerces to `null`, `true` can't be coerced.\n\n## Coercion from null\n\n#### To string type\n\n`null` coerces to the empty string.\n\n#### To number/integer types\n\n`null` coerces to `0`\n\n#### To boolean type\n\n`null` coerces to `false`\n\n## Coercion to and from array\n\nThese coercions require that the option `coerceTypes` is `\"array\"`.\n\nIf a scalar data is present and array is required, Ajv wraps scalar data in an array.\n\nIf an array with one item is present and a scalar is required, Ajv coerces array into its item.\n\n- `\"foo\"` -> `[ \"foo\" ]`\n- `[ \"foo\" ]` -> `\"foo\"`\n"
  },
  {
    "path": "docs/components.md",
    "content": "# Code components\n\n[[toc]]\n\n## Ajv classes\n\n[lib/core.ts](https://github.com/ajv-validator/ajv/blob/master/lib/core.ts) - core Ajv class without any keywords. All Ajv methods for managing schemas and extensions are defined in this class.\n\n[lib/ajv.ts](https://github.com/ajv-validator/ajv/blob/master/lib/ajv.ts) - subclass of Ajv core with JSON Schema draft-07 keywords.\n\n[lib/2019.ts](https://github.com/ajv-validator/ajv/blob/master/lib/2019.ts) - subclass of Ajv core with JSON Schema draft-2019-09 keywords.\n\n[lib/jtd.ts](https://github.com/ajv-validator/ajv/blob/master/lib/jtd.ts) - subclass of Ajv core with JSON Type Definition support.\n\n## Schema compilation\n\n[lib/compile](https://github.com/ajv-validator/ajv/blob/master/lib/compile) - code for schema compilation\n\n[lib/compile/index.ts](https://github.com/ajv-validator/ajv/blob/master/lib/compile/index.ts) - the main recursive function code for schema compilation, functions for reference resolution, the interface for schema compilation context (`SchemaCxt`).\n\n[lib/compile/context.ts](https://github.com/ajv-validator/ajv/blob/master/lib/compile/context.ts) - the class for keyword code generation `KeywordCxt`. All pre-defined keywords and user-defined keywords that use `code` function are passed an instance of this class.\n\n[lib/compile/rules.ts](https://github.com/ajv-validator/ajv/blob/master/lib/compile/rules.ts) - data structure to store references to all all keyword definitions that were added to Ajv instance, organised by data type.\n\n[lib/compile/subschema.ts](https://github.com/ajv-validator/ajv/blob/master/lib/compile/subschema.ts) - creates schema context (`SchemaCxt`) to generate code for subschemas - used by all applicator keywords in [lib/vocabularies/applicator](https://github.com/ajv-validator/ajv/blob/master/lib/vocabularies/applicator).\n\n[lib/compile/codegen](https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen) - the api for [code generation](./codegen.md).\n\n[lib/compile/validate](https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate) - code to iterate the schema to generate code of validation function.\n\n## Other components\n\n[lib/standalone](https://github.com/ajv-validator/ajv/blob/master/lib/standalone) - module to generate [standalone validation code](./standalone.md).\n\n[lib/vocabularies](https://github.com/ajv-validator/ajv/blob/master/lib/vocabularies) - pre-defined validation keywords.\n\n[lib/refs](https://github.com/ajv-validator/ajv/blob/master/lib/refs) - JSON Schema meta-schemas.\n"
  },
  {
    "path": "docs/faq.md",
    "content": "# Frequently Asked Questions\n\nThe purpose of this document is to help find answers quicker. I am happy to continue the discussion about these issues, so please comment on some of the issues mentioned below or create a new issue if it seems more appropriate.\n\n[[toc]]\n\n## Using JSON schema\n\nAjv implements JSON schema specification. Before submitting the issue about the behaviour of any validation keywords please review them in:\n\n- [JSON Schema specification](https://tools.ietf.org/html/draft-handrews-json-schema-validation-00) (draft-07)\n- [JSON Schema reference](./json-schema.md) in Ajv documentation\n- [JSON Schema tutorial](https://spacetelescope.github.io/understanding-json-schema/) (for draft-04)\n\n#### Why Ajv validates empty object as valid?\n\n\"properties\" keyword does not require the presence of any properties, you need to use \"required\" keyword. It also doesn't require that the data is an object, so any other type of data will also be valid. To require a specific type use \"type\" keyword. [Strict types mode](./strict-mode.md#strict-types) introduced in v7 requires presence of \"type\" when \"properties\" are used, so the mistakes are less likely.\n\n#### Why Ajv validates only the first item of the array?\n\n\"items\" keyword support [two syntaxes](./json-schema.md#items) - 1) when the schema applies to all items; 2) when there is a different schema for each item in the beginning of the array. This problem means you are using the second syntax.\n\nIn v7 with option `strictTuples` (`\"log\"` by default) this problem is less likely to happen, as Ajv would log warning about missing \"minItems\" and other keywords that are required to constrain tuple size.\n\n## Ajv API for returning validation errors\n\nSee [#65](https://github.com/ajv-validator/ajv/issues/65), [#212](https://github.com/ajv-validator/ajv/issues/212), [#236](https://github.com/ajv-validator/ajv/issues/236), [#242](https://github.com/ajv-validator/ajv/issues/242), [#256](https://github.com/ajv-validator/ajv/issues/256).\n\n#### Why Ajv assigns errors as a property of validation function (or instance) instead of returning an object with validation results and errors?\n\nThe reasons are history (other fast validators with the same api) and performance (returning boolean is faster). Although more code is written to process errors than to handle successful results, almost all server-side validations pass. The existing API is more efficient from the performance point of view.\n\nAjv also supports asynchronous validation (with asynchronous formats and keywords) that returns a promise that either resolves to `true` or rejects with an error.\n\n#### Would errors get overwritten in case of \"concurrent\" validations?\n\nNo. There is no parallel execution in JavaScript, and the cooperative concurrency model of javascript makes this pattern safe. While a validation is run, no other JavaScript code that can access the same memory can be executed. As long as the errors are used in the same execution block, the errors will not be overwritten.\n\n#### Can we change / extend API to add a method that would return errors (rather than assign them to `errors` property)?\n\nNo. In many cases there is a module responsible for the validation in the application, usually to load schemas and to process errors. This module is the right place to introduce any user-defined API. Convenience is a subjective thing, changing or extending API purely because of convenience would either break backward compatibility (even if it's done in a new major version it still complicates migration) or bloat API (making it more difficult to maintain).\n\n#### Why don't `\"additionalProperties\": false` errors display the property name?\n\nDoing this would create a precedent where validated data is used in error messages, creating a vulnerability (e.g., when ajv is used to validate API data/parameters and error messages are logged).\n\nSince the property name is already in the params object, in an application you can modify the messages in any way you need. ajv-errors package allows modifying messages as well.\n\n## Additional properties inside compound keywords anyOf, oneOf, etc.\n\nSee [#127](https://github.com/ajv-validator/ajv/issues/127), [#129](https://github.com/ajv-validator/ajv/issues/129), [#134](https://github.com/ajv-validator/ajv/issues/134), [#140](https://github.com/ajv-validator/ajv/issues/140), [#193](https://github.com/ajv-validator/ajv/issues/193), [#205](https://github.com/ajv-validator/ajv/issues/205), [#238](https://github.com/ajv-validator/ajv/issues/238), [#264](https://github.com/ajv-validator/ajv/issues/264).\n\n#### Why the keyword `additionalProperties: false` fails validation when some properties are \"declared\" inside a subschema in `anyOf`/etc.?\n\nThe keyword `additionalProperties` creates the restriction on validated data based on its own value (`false` or schema object) and on the keywords `properties` and `patternProperties` in the SAME schema object. JSON Schema validators must NOT take into account properties used in other schema objects.\n\nWhile you can expect that the schema below would allow the objects either with properties `foo` and `bar` or with properties `foo` and `baz` and all other properties will be prohibited, this schema will only allow objects with one property `foo` (an empty object and any non-objects will also be valid):\n\n```javascript\n{\n  type: \"object\",\n  properties: {foo: {type: \"number\"}},\n  additionalProperties: false,\n  oneOf: [\n    {properties: {bar: {type: \"number\"}}},\n    {properties: {baz: {type: \"number\"}}}\n  ]\n}\n```\n\nThe reason for that is that `additionalProperties` keyword ignores properties inside `oneOf` keyword subschemas. That's not the limitation of Ajv or any other validator, that's how it must work according to the standard.\n\nThere are several ways to implement the described logic that would allow two properties, please see the suggestions in the issues mentioned above.\n\n#### Why the validation fails when I use option `removeAdditional` with the keyword `anyOf`/etc.?\n\nThis problem is related to the problem explained above - properties treated as additional in the sense of `additionalProperties` keyword, based on `properties`/`patternProperties` keyword in the same schema object.\n\nSee the example in the [Removing Additional Data](https://ajv.js.org/guide/modifying-data.html#removing-additional-properties) section of the docs.\n\n## Generating schemas with resolved references ($ref)\n\nSee [#22](https://github.com/ajv-validator/ajv/issues/22), [#125](https://github.com/ajv-validator/ajv/issues/125), [#146](https://github.com/ajv-validator/ajv/issues/146), [#228](https://github.com/ajv-validator/ajv/issues/228), [#336](https://github.com/ajv-validator/ajv/issues/336), [#454](https://github.com/ajv-validator/ajv/issues/454).\n\n#### Why Ajv does not replace references ($ref) with the actual referenced schemas as some validators do?\n\n1. The scope of Ajv is validating data against JSON Schemas; inlining referenced schemas is not necessary for validation. When Ajv generates code for validation it either inlines the code of referenced schema or uses function calls. Doing schema manipulation is more complex and out of scope.\n2. When schemas are recursive (or mutually recursive) resolving references would result in self-referencing recursive data-structures that can be difficult to process.\n3. There are cases when such inlining would also require adding (or modifying) `id` attribute in the inlined schema fragment to make the resulting schema equivalent.\n\nThere were many conversations about the meaning of `$ref` in [JSON Schema GitHub organisation](https://github.com/json-schema-org). The consensus is that while it is possible to treat `$ref` as schema inclusion with two caveats (above), this interpretation is unnecessary complex. A more efficient approach is to treat `$ref` as a delegation, i.e. a special keyword that validates the current data instance against the referenced schema. The analogy with programming languages is that `$ref` is a function call rather than a macro. See [here](https://github.com/json-schema-org/json-schema-spec/issues/279), for example.\n\n#### How can I generate a schema where `$ref` keywords are replaced with referenced schemas?\n\nThere are two possible approaches:\n\n1. Traverse schema (e.g. with json-schema-traverse) and replace every `$ref` with the referenced schema.\n2. Use a specially constructed JSON Schema with a [user-defined keyword](./keywords.md) to traverse and modify your schema.\n"
  },
  {
    "path": "docs/guide/async-validation.md",
    "content": "# Asynchronous validation\n\nYou can define formats and keywords that perform validation asynchronously by accessing database or some other service. You should add `async: true` in the keyword or format definition (see [addFormat](./api.md#api-addformat), [addKeyword](./api.md#api-addkeyword) and [User-defined keywords](./keywords.md)).\n\nIf your schema uses asynchronous formats/keywords or refers to some schema that contains them it should have `\"$async\": true` keyword so that Ajv can compile it correctly. If asynchronous format/keyword or reference to asynchronous schema is used in the schema without `$async` keyword Ajv will throw an exception during schema compilation.\n\n::: warning Use $async: true in referenced schemas\nAll asynchronous subschemas that are referenced from the current or other schemas should have `\"$async\": true` keyword as well, otherwise the schema compilation will fail.\n:::\n\nValidation function for an asynchronous format/keyword should return a promise that resolves with `true` or `false` (or rejects with `new Ajv.ValidationError(errors)` if you want to return errors from the keyword function).\n\nAjv compiles asynchronous schemas to [async functions](http://tc39.github.io/ecmascript-asyncawait/). Async functions are supported in Node.js 7+ and all modern browsers. You can supply a transpiler as a function via `processCode` option. See [Options](./api.md#options).\n\nThe compiled validation function has `$async: true` property (if the schema is asynchronous), so you can differentiate these functions if you are using both synchronous and asynchronous schemas.\n\nValidation result will be a promise that resolves with validated data or rejects with an exception `Ajv.ValidationError` that contains the array of validation errors in `errors` property.\n\nExample:\n\n```javascript\nconst ajv = new Ajv()\n\najv.addKeyword({\n  keyword: \"idExists\",\n  async: true,\n  type: \"number\",\n  validate: checkIdExists,\n})\n\nasync function checkIdExists(schema, data) {\n  // this is just an example, you would want to avoid SQL injection in your code\n  const rows = await sql(`SELECT id FROM ${schema.table} WHERE id = ${data}`)\n  return !!rows.length // true if record is found\n}\n\nconst schema = {\n  $async: true,\n  properties: {\n    userId: {\n      type: \"integer\",\n      idExists: {table: \"users\"},\n    },\n    postId: {\n      type: \"integer\",\n      idExists: {table: \"posts\"},\n    },\n  },\n}\n\nconst validate = ajv.compile(schema)\n\nvalidate({userId: 1, postId: 19})\n  .then(function (data) {\n    console.log(\"Data is valid\", data) // { userId: 1, postId: 19 }\n  })\n  .catch(function (err) {\n    if (!(err instanceof Ajv.ValidationError)) throw err\n    // data is invalid\n    console.log(\"Validation errors:\", err.errors)\n  })\n```\n\n### Using transpilers\n\n```javascript\nconst ajv = new Ajv({processCode: transpileFunc})\nconst validate = ajv.compile(schema) // transpiled es7 async function\nvalidate(data).then(successFunc).catch(errorFunc)\n```\n\nSee [Options](../options).\n"
  },
  {
    "path": "docs/guide/combining-schemas.md",
    "content": "# Combining schemas\n\n[[toc]]\n\n## <a name=\"ref\"></a>Combining schemas with $ref\n\nYou can structure your validation logic across multiple schema files and have schemas reference each other using `$ref` keyword.\n\nExample:\n\n```javascript\nconst schema = {\n  $id: \"http://example.com/schemas/schema.json\",\n  type: \"object\",\n  properties: {\n    foo: {$ref: \"defs.json#/definitions/int\"},\n    bar: {$ref: \"defs.json#/definitions/str\"},\n  },\n}\n\nconst defsSchema = {\n  $id: \"http://example.com/schemas/defs.json\",\n  definitions: {\n    int: {type: \"integer\"},\n    str: {type: \"string\"},\n  },\n}\n```\n\nNow to compile your schema you can either pass all schemas to Ajv instance:\n\n```javascript\nconst ajv = new Ajv({schemas: [schema, defsSchema]})\nconst validate = ajv.getSchema(\"http://example.com/schemas/schema.json\")\n```\n\nor use `addSchema` method:\n\n```javascript\nconst ajv = new Ajv()\nconst validate = ajv.addSchema(defsSchema).compile(schema)\n```\n\nSee [Options](../options.md) and [addSchema](../api.md#add-schema) method.\n\n::: tip Reference resolution\n- `$ref` is resolved as the uri-reference using schema \\$id as the base URI (see the example).\n- References can be recursive (and mutually recursive) to implement the schemas for different data structures (such as linked lists, trees, graphs, etc.).\n- You don't have to host your schema files at the URIs that you use as schema \\$id. These URIs are only used to identify the schemas, and according to JSON Schema specification validators should not expect to be able to download the schemas from these URIs.\n- The actual location of the schema file in the file system is not used.\n- You can pass the identifier of the schema as the second parameter of `addSchema` method or as a property name in `schemas` option. This identifier can be used instead of (or in addition to) schema \\$id.\n- You cannot have the same \\$id (or the schema identifier) used for more than one schema - the exception will be thrown.\n- You can implement dynamic resolution of the referenced schemas using `compileAsync` method. In this way you can store schemas in any system (files, web, database, etc.) and reference them without explicitly adding to Ajv instance. See [Asynchronous schema compilation](./managing-schemas.md#asynchronous-schema-compilation).\n:::\n\n## Extending recursive schemas\n\nWhile statically defined `$ref` keyword allows to split schemas to multiple files, it is difficult to extend recursive schemas - the recursive reference(s) in the original schema points to the original schema, and not to the extended one. So in JSON Schema draft-07 the only available solution to extend the recursive schema was to redefine all sections of the original schema that have recursion.\n\nIt was particularly repetitive when extending meta-schema, as it has many recursive references, but even in a schema with a single recursive reference extending it was very verbose.\n\nJSON Schema draft-2019-09 and the upcoming draft defined the mechanism for dynamic recursion using keywords `$recursiveRef`/`$recursiveAnchor` (draft-2019-09) or `$dynamicRef`/`$dynamicAnchor` (the next JSON Schema draft) that is somewhat similar to \"open recursion\" in functional programming.\n\nConsider this recursive schema with static recursion:\n\n```javascript\nconst treeSchema = {\n  $id: \"https://example.com/tree\",\n  type: \"object\",\n  required: [\"data\"],\n  properties: {\n    data: true,\n    children: {\n      type: \"array\",\n      items: {$ref: \"#\"},\n    },\n  },\n}\n```\n\nThe only way to extend this schema to prohibit additional properties is by adding `additionalProperties` keyword right in the schema - this approach can be impossible if you do not control the source of the original schema. Ajv also provided the additional keywords in [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) package to extend schemas by treating them as plain JSON data. While this approach may work for you, it is non-standard and therefore not portable.\n\nThe new keywords for dynamic recursive references allow extending this schema without modifying it:\n\n```javascript\nconst treeSchema = {\n  $id: \"https://example.com/tree\",\n  $recursiveAnchor: true,\n  type: \"object\",\n  required: [\"data\"],\n  properties: {\n    data: true,\n    children: {\n      type: \"array\",\n      items: {$recursiveRef: \"#\"},\n    },\n  },\n}\n\nconst strictTreeSchema = {\n  $id: \"https://example.com/strict-tree\",\n  $recursiveAnchor: true,\n  $ref: \"tree\",\n  unevaluatedProperties: false,\n}\n\nimport Ajv2019 from \"ajv/dist/2019\"\n// const Ajv2019 = require(\"ajv/dist/2019\")\nconst ajv = new Ajv2019({\n  schemas: [treeSchema, strictTreeSchema],\n})\nconst validate = ajv.getSchema(\"https://example.com/strict-tree\")\n```\n\nSee [dynamic-refs](https://github.com/ajv-validator/ajv/blob/master/spec/dynamic-ref.spec.ts) test for the example using `$dynamicAnchor`/`$dynamicRef`.\n\nAt the moment Ajv implements the spec for dynamic recursive references with these limitations:\n\n- `$recursiveAnchor`/`$dynamicAnchor` can only be used in the schema root.\n- `$recursiveRef`/`$dynamicRef` can only be hash fragments, without URI.\n\nAjv also does not support dynamic references in [asynchronous schemas](#asynchronous-validation) (Ajv extension) - it is assumed that the referenced schema is synchronous, and there is no validation-time check for it.\n\n## $data reference\n\nWith `$data` option you can use values from the validated data as the values for the schema keywords. See [proposal](https://github.com/json-schema-org/json-schema-spec/issues/51) for more information about how it works.\n\n`$data` reference is supported in the keywords: const, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties, formatMaximum / formatMinimum, formatExclusiveMaximum / formatExclusiveMinimum, multipleOf, pattern, required, uniqueItems.\n\nThe value of \"$data\" should be a [JSON-pointer](https://datatracker.ietf.org/doc/rfc6901/) to the data (the root is always the top level data object, even if the $data reference is inside a referenced subschema) or a [relative JSON-pointer](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00) (it is relative to the current point in data; if the \\$data reference is inside a referenced subschema it cannot point to the data outside of the root level for this subschema).\n\nExamples.\n\nThis schema requires that the value in property `smaller` is less or equal than the value in the property larger:\n\n```javascript\nconst ajv = new Ajv({$data: true})\n\nconst schema = {\n  properties: {\n    smaller: {\n      type: \"number\",\n      maximum: {$data: \"1/larger\"},\n    },\n    larger: {type: \"number\"},\n  },\n}\n\nconst validData = {\n  smaller: 5,\n  larger: 7,\n}\n\najv.validate(schema, validData) // true\n```\n\nThis schema requires that the properties have the same format as their field names:\n\n```javascript\nconst schema = {\n  additionalProperties: {\n    type: \"string\",\n    format: {$data: \"0#\"},\n  },\n}\n\nconst validData = {\n  \"date-time\": \"1963-06-19T08:30:06.283185Z\",\n  email: \"joe.bloggs@example.com\",\n}\n```\n\n`$data` reference is resolved safely - it won't throw even if some property is undefined. If `$data` resolves to `undefined` the validation succeeds (with the exclusion of `const` keyword). If `$data` resolves to incorrect type (e.g. not \"number\" for maximum keyword) the validation fails.\n\n## $merge and $patch keywords\n\nWith the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) you can use the keywords `$merge` and `$patch` that allow extending JSON Schemas with patches using formats [JSON Merge Patch (RFC 7396)](https://datatracker.ietf.org/doc/rfc7396/) and [JSON Patch (RFC 6902)](https://datatracker.ietf.org/doc/rfc6902/).\n\nTo add keywords `$merge` and `$patch` to Ajv instance use this code:\n\n```javascript\nrequire(\"ajv-merge-patch\")(ajv)\n```\n\nExamples.\n\nUsing `$merge`:\n\n```javascript\n{\n  $merge: {\n    source: {\n      type: \"object\",\n      properties: {p: {type: \"string\"}},\n      additionalProperties: false\n    },\n    with: {\n      properties: {q: {type: \"number\"}}\n    }\n  }\n}\n```\n\nUsing `$patch`:\n\n```javascript\n{\n  $patch: {\n    source: {\n      type: \"object\",\n      properties: {p: {type: \"string\"}},\n      additionalProperties: false\n    },\n    with: [{op: \"add\", path: \"/properties/q\", value: {type: \"number\"}}]\n  }\n}\n```\n\nThe schemas above are equivalent to this schema:\n\n```javascript\n{\n  type: \"object\",\n  properties: {\n    p: {type: \"string\"},\n    q: {type: \"number\"}\n  },\n  additionalProperties: false\n}\n```\n\nThe properties `source` and `with` in the keywords `$merge` and `$patch` can use absolute or relative `$ref` to point to other schemas previously added to the Ajv instance or to the fragments of the current schema.\n\nSee the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) for more information.\n"
  },
  {
    "path": "docs/guide/environments.md",
    "content": "# Execution environments\n\n[[toc]]\n\n## Server-side Node.js\n\nThe main consideration for using Ajv server-side is to [manage compiled schemas](./managing-schemas) correctly, ensuring that the same schema is not compiled more than once.\n\n## Short-lived environments\n\nDepending on the life-time of the environments, the benefits from \"compile once - validate many times\" model can be limited - you can consider using [standalone validation code](../standalone).\n\nIf you have a pre-defined set of schemas, you can:\n\n1. compile all schemas in the build step - you can either write your own script or use [ajv-cli](https://github.com/ajv-validator/ajv).\n2. generate and beautify standalone validation code - you can have all your schemas exported from one file.\n3. additionally, you can inline all dependencies on Ajv or ajv-formats using any bundling tools.\n4. deploy compiled schemas as part of your application or library (with or without dependency on Ajv, depending on whether you did step 3 and which validation keywords are used in the schemas)\n\nPlease see [gajus/table](https://github.com/gajus/table) package that pre-compiles schemas in this way.\n\nEven if your schemas need to be stored in the database, you can still compile schemas once and store your validation functions alongside schemas in the database as well, loading them on demand.\n\n## Browsers\n\nSee [Content Security Policy](../security.md#content-security-policy) to decide how best to use Ajv in the browser for your use case.\n\nWhether you compile schemas in the browser or use [standalone validation code](../standalone), it is recommended that you bundle them together with your application code.\n\nIf you need to use Ajv in several application bundles you can create a separate UMD bundles of Ajv using `npm run bundle` script.\n\nIn this case you need to load Ajv using the correct bundle, depending on which schema language and which version you need to use:\n\n<code-group>\n<code-block title=\"JSON Schema (draft-07)\">\n```html\n<script src=\"bundle/ajv7.min.js\"></script>\n<script>\n  ;(function () {\n    const Ajv = window.ajv7\n    const ajv = new Ajv()\n  })()\n</script>\n```\n</code-block>\n\n<code-block title=\"JSON Schema (draft-2019-09)\">\n```html\n<script src=\"bundle/ajv2019.min.js\"></script>\n<script>\n  ;(function () {\n    const Ajv = window.ajv2019\n    const ajv = new Ajv()\n  })()\n</script>\n```\n</code-block>\n\n<code-block title=\"JSON Type Definition\">\n```html\n<script src=\"bundle/ajvJTD.min.js\"></script>\n<script>\n  ;(function () {\n    const Ajv = window.ajvJTD\n    const ajv = new Ajv()\n  })()\n</script>\n```\n</code-block>\n</code-group>\n\nThis bundle can be used with different module systems; it creates global `ajv`/`ajv2019`/`ajvJTD` if no module system is found.\n\nThe browser bundles are available on [cdnjs](https://cdnjs.com/libraries/ajv).\n\n::: warning Some frameworks re-define require\nSome frameworks, e.g. Dojo, may redefine global require in a way that is not compatible with CommonJS module format. In this case Ajv bundle has to be loaded before the framework and then you can use global `ajv` (see issue [#234](https://github.com/ajv-validator/ajv/issues/234)).\n:::\n\n::: warning Internet Explorer 11\nAjv v8 in IE 11 will not work straight out of the box. To use it either [recompile it](../standalone.md), or set the options [unicodeRegExp](../options.md#unicoderegexp) to `false` and `code: { es5: true }`, and transpile the Ajv node module (see issue [#1585](https://github.com/ajv-validator/ajv/issues/1585#issuecomment-832486204)).\n:::\n\n## ES5 environments\n\nYou need to:\n\n- recompile Typescript to ES5 target - it is set to 2018 in the bundled compiled code.\n- generate ES5 validation code:\n\n```javascript\nconst ajv = new Ajv({code: {es5: true}})\n```\n\nSee [Advanced options](https://github.com/ajv-validator/ajv/blob/master/docs/api.md#advanced-options).\n\n## CJS vs ESM exports\n\nThe default configuration of AJV is to generate code in ES6 with Common JS (CJS) exports. This can be changed by setting \nthe ES Modules(ESM) flag.\n\n```javascript\nconst ajv = new Ajv({code: {esm: true}})\n```\n\n## Other JavaScript environments\n\nAjv is used in other JavaScript environments, including Electron apps, WeChat mini-apps and many others, where the same considerations apply as above:\n\n- compilation performance\n- restrictive content security policy\n- bundle size\n\nIf any of this is important, you may have better results with pre-compiled [standalone validation code](../standalone).\n\n## Command line interface\n\nAjv can be used from the terminal in any operating system supported by Node.js\n\nCLI is available as a separate npm package [ajv-cli](https://github.com/ajv-validator/ajv-cli).\n\nIt supports:\n\n- compiling JSON Schemas to test their validity\n- generating [standalone validation code](./docs/standalone.md) that exports validation function(s)\n- migrating schemas to draft-07 and draft-2019-09 (using [json-schema-migrate](https://github.com/epoberezkin/json-schema-migrate))\n- validating data file(s) against JSON Schema\n- testing expected validity of data against JSON Schema\n- referenced schemas\n- user-defined meta-schemas, validation keywords and formats\n- files in JSON, JSON5, YAML, and JavaScript format\n- all Ajv options\n- reporting changes in data after validation in [JSON-patch](https://datatracker.ietf.org/doc/rfc6902/) format\n"
  },
  {
    "path": "docs/guide/formats.md",
    "content": "# Format validation\n\n## String formats\n\nFrom version 7 Ajv does not include formats defined by JSON Schema specification - these and several other formats are provided by [ajv-formats](https://github.com/ajv-validator/ajv-formats) plugin.\n\nTo add all formats from this plugin:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv = require(\"ajv\")\nconst addFormats = require(\"ajv-formats\")\n\nconst ajv = new Ajv()\naddFormats(ajv)\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv from \"ajv\"\nimport addFormats from \"ajv-formats\"\n\nconst ajv = new Ajv()\naddFormats(ajv)\n```\n</code-block>\n</code-group>\n\nSee [ajv-formats](https://github.com/ajv-validator/ajv-formats) documentation for further details.\n\nIt is recommended NOT to use \"format\" keyword implementations with untrusted data, as they may use potentially unsafe regular expressions (even though known issues are fixed) - see [ReDoS attack](../security.md#redos-attack).\n\n::: danger Format validation of untrusted data\nIf you need to use \"format\" keyword to validate untrusted data, you MUST assess their suitability and safety for your validation scenarios.\n:::\n\nThe following formats are defined in [ajv-formats](https://github.com/ajv-validator/ajv-formats) for string validation with \"format\" keyword:\n\n- _date_: full-date according to [RFC3339](http://tools.ietf.org/html/rfc3339#section-5.6).\n- _time_: time with optional time-zone.\n- _date-time_: date-time from the same source (time-zone is mandatory).\n- _duration_: duration from [RFC3339](https://tools.ietf.org/html/rfc3339#appendix-A)\n- _uri_: full URI.\n- _uri-reference_: URI reference, including full and relative URIs.\n- _uri-template_: URI template according to [RFC6570](https://datatracker.ietf.org/doc/rfc6570/)\n- _url_ (deprecated): [URL record](https://url.spec.whatwg.org/#concept-url).\n- _email_: email address.\n- _hostname_: host name according to [RFC1034](http://tools.ietf.org/html/rfc1034#section-3.5).\n- _ipv4_: IP address v4.\n- _ipv6_: IP address v6.\n- _regex_: tests whether a string is a valid regular expression by passing it to RegExp constructor.\n- _uuid_: Universally Unique Identifier according to [RFC4122](https://datatracker.ietf.org/doc/rfc4122/).\n- _json-pointer_: JSON-pointer according to [RFC6901](https://datatracker.ietf.org/doc/rfc6901/).\n- _relative-json-pointer_: relative JSON-pointer according to [this draft](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00).\n\n::: warning Additional formats in ajv-formats-draft2019\nJSON Schema draft-07 also defines formats `iri`, `iri-reference`, `idn-hostname` and `idn-email` for URLs, hostnames and emails with international characters. These formats are available in [ajv-formats-draft2019](https://github.com/luzlab/ajv-formats-draft2019) plugin.\n:::\n\n## User-defined formats\n\nYou can add and replace any formats using [addFormat](../api.md#ajv-addformat-name-string-format-format-ajv) method:\n\n```javascript\najv.addFormat(\"identifier\", /^a-z\\$_[a-zA-Z$_0-9]*$/)\n```\n\nAjv also allows defining the formats that would be applied to numbers only:\n\n```javascript\najv.addFormat(\"byte\", {\n  type: \"number\",\n  validate: (x) => x >= 0 && x <= 255 && x % 1 == 0,\n})\n```\n\n## Formats and standalone validation code\n\nIf you use formats from [ajv-formats](https://github.com/ajv-validator/ajv-formats) package, [standalone validation code](../standalone) will be supported out of the box.\n\n::: warning Standalone code and Ajv versions\nYou need to make sure that ajv-formats imports the same version and the same code of ajv as the one you use in your application for standalone validation code to work (because of `instanceof` check that is currently used).\n\n`npm` and other package managers may not update the version of ajv dependency of ajv-formats when you update version of ajv in your application - the workaround is to use clean npm installation.\n:::\n\nIf you define your own formats, for standalone code generation to work you need to pass the code snippet that evaluates to an object with all defined formats to the option `code.formats`:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst {default: Ajv, _} = require(\"ajv\")\nconst ajv = new Ajv({code: {formats: _`require(\"./my_formats\")`}})\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv, {_} from \"ajv\"\nconst ajv = new Ajv({code: {formats: _`require(\"./my_formats\")`}})\n```\n</code-block>\n</code-group>\n"
  },
  {
    "path": "docs/guide/getting-started.md",
    "content": "# Getting started\n\n[[toc]]\n\n## Install\n\n::: tip Node REPL\nYou can try Ajv without installing it in the Node.js REPL: [https://runkit.com/npm/ajv](https://runkit.com/npm/ajv)\n:::\n\nTo install Ajv version 8:\n\n```bash\nnpm install ajv\n```\n\nIf you need to use Ajv with [JSON Schema draft-04](./schema-language#draft-04), you need to install Ajv version 6:\n\n```bash\nnpm install ajv@6\n```\n\nSee [Contributing](../CONTRIBUTING.md) on how to run the tests locally\n\n## Basic data validation\n\nAjv takes a schema for your JSON data and converts it into a very efficient JavaScript code\nthat validates your data according to the schema. To create a schema you can use either\n[JSON Schema](../json-schema) or [JSON Type Definition](../json-type-definition) - check out [Choosing schema language](./schema-language), they have\ndifferent advantages and disadvantages.\n\nFor example, to validate an object that has a required property \"foo\" (an integer number), an optional property \"bar\" (a string) and no other properties:\n\n<code-group>\n<code-block title=\"JSON Schema\">\n```javascript\nconst Ajv = require(\"ajv\")\nconst ajv = new Ajv() // options can be passed, e.g. {allErrors: true}\n\nconst schema = {\n  type: \"object\",\n  properties: {\n    foo: {type: \"integer\"},\n    bar: {type: \"string\"}\n  },\n  required: [\"foo\"],\n  additionalProperties: false\n}\n\nconst validate = ajv.compile(schema)\n\nconst data = {\n  foo: 1,\n  bar: \"abc\"\n}\n\nconst valid = validate(data)\nif (!valid) console.log(validate.errors)\n```\n</code-block>\n\n<code-block title=\"JSON Type Definition\">\n```javascript\nconst Ajv = require(\"ajv/dist/jtd\")\nconst ajv = new Ajv() // options can be passed, e.g. {allErrors: true}\n\nconst schema = {\n  properties: {\n    foo: {type: \"int32\"}\n  },\n  optionalProperties: {\n    bar: {type: \"string\"}\n  }\n}\n\n\nconst validate = ajv.compile(schema)\n\nconst data = {\n  foo: 1,\n  bar: \"abc\"\n}\n\nconst valid = validate(data)\nif (!valid) console.log(validate.errors)\n```\n</code-block>\n</code-group>\n\nAjv compiles schemas to functions and caches them in all cases (using the schema itself as a key in a Map), so that the next time the same schema object is used it won't be compiled again.\n\n::: tip Best performance: compile and getSchema methods\nThe best performance is achieved when using compiled functions returned by `compile` or `getSchema` methods.\n\nWhile execution of the compiled validation function is very fast, its compilation is\nrelatively slow, so you need to make sure that you compile schemas only once and\nre-use compiled validation functions. See [Managing multiple schemas](./managing-schemas).\n:::\n\n::: warning Save errors property\nEvery time a validation function (or `ajv.validate`) is called the `errors` property is overwritten. You need to copy the `errors` array reference to another variable if you want to use it later (e.g. in the callback). See [Validation errors](../api.md#validation-errors).\n:::\n\n## Parsing and serializing JSON <Badge text=\"New\" />\n\nAjv can compile efficient parsers and serializers from [JSON Type Definition](../json-type-definition) schemas.\n\nSerializing the data with a function specialized to your data shape can be more than 10x compared with `JSON.stringify`.\n\nParsing the data replaces the need for separate validation after generic parsing with `JSON.parse` (although validation itself is usually much faster than parsing). In case your JSON string is valid, the specialized parsing is approximately as fast as JSON.parse, but in case your JSON is invalid, the specialized parsing would fail much faster - so it can be very efficient in some scenarios.\n\nFor the same data structure, you can compile parser and serializer in this way:\n\n<code-group>\n<code-block title=\"JSON Type Definition\">\n```javascript\nconst Ajv = require(\"ajv/dist/jtd\")\nconst ajv = new Ajv() // options can be passed, e.g. {allErrors: true}\n\nconst schema = {\n  properties: {\n    foo: {type: \"int32\"}\n  },\n  optionalProperties: {\n    bar: {type: \"string\"}\n  }\n}\n\nconst serialize = ajv.compileSerializer(schema)\n\nconst data = {\n  foo: 1,\n  bar: \"abc\"\n}\n\nconsole.log(serialize(data))\n\nconst parse = ajv.compileParser(schema)\n\nconst json = '{\"foo\": 1, \"bar\": \"abc\"}'\nconst invalidJson = '{\"unknown\": \"abc\"}'\n\nparseAndLog(json) // logs {foo: 1, bar: \"abc\"}\nparseAndLog(invalidJson) // logs error and position\n\nfunction parseAndLog(json) {\n  const data = parse(json)\n  if (data === undefined) {\n    console.log(parse.message) // error message from the last parse call\n    console.log(parse.position) // error position in string\n  } else {\n    console.log(data)\n  }\n}\n```\n</code-block>\n</code-group>\n\n::: tip Lower parsing performance of empty schemas\nYou would have smaller performance benefits in case your schema contains some properties or other parts that are empty schemas (`{}`) - parser would call `JSON.parse` in this case.\n:::\n\n::: warning JTD discriminator schema\nThe performance of parsing discriminator schemas depends on the position of discriminator tag in the schema - the best parsing performance will be achieved if the tag is the first property - this is how compiled JTD serializers generate JSON in case of discriminator schemas.\n\nAlso, if discriminator tag were to be repeated in JSON, the second value would be ignored and the object still validated according to the first tag.\n:::\n\n::: warning Compiled parsers do NOT throw exceptions\nCompiled parsers, unlike JSON.parse, do not throw the exception in case JSON string is not a valid JSON or in case data is invalid according to the schema. As soon as the parser determines that either JSON or data is invalid, it returns `undefined` and reports error and position via parsers properties `message` and `position`.\n:::\n"
  },
  {
    "path": "docs/guide/managing-schemas.md",
    "content": "# Managing schemas\n\n[[toc]]\n\n## Re-using validation functions\n\nAjv validation model is optimized for server side execution, when schema compilation happens only once and validation happens multiple times - this has a substantial performance benefit comparing with validators that interpret the schema in the process of validation.\n\nTransition from template-based code generation in Ajv v6 to the tree-based in v7 brought:\n\n- type-level safety against code injection via untrusted schemas\n- more efficient validation code (via [tree optimizations](../codegen.md#code-optimization))\n- smaller memory footprint of compiled functions (schemas are no longer serialized)\n- smaller bundle size\n- more maintainable code\n\nThese improvements cost slower schema compilation, and increased chance of re-compilation in case you pass a different schema object (see [#1413](https://github.com/ajv-validator/ajv/issues/1413)), so it is very important to manage schemas correctly, so they are only compiled once.\n\nThere are several approaches to manage compiled schemas.\n\n## Standalone validation code\n\nThe motivation to pre-compile schemas:\n\n- faster startup times\n- lower memory footprint/bundle size\n- compatible with strict content security policies\n- almost no risk to compile schema more than once\n- better for short-lived environments\n\nSee [Standalone validation code](../standalone) for the details.\n\nThere are scenarios when it can be not possible or difficult:\n\n- dynamic or user-provided schemas - while you can do caching, it can be either difficult to implement or inefficient.\n- user-defined keywords that use closures that are difficult to serialize as code.\n\n## Compiling during initialization\n\nThe simplest approach is to compile all your schemas when the application starts, outside of the code that handles requests. It can be done simply in the module scope:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv = require(\"ajv\").default\nconst schema_user = require(\"./schema_user.json\")\nconst ajv = new Ajv()\nconst validate_user = ajv.compile(schema_user)\n\n\n\n\n\n// this is just some abstract API framework\napp.post(\"/user\", async (cxt) => {\n  if (validate_user(cxt.body)) {\n    // create user\n  } else {\n    // report error\n    cxt.status(400)\n  }\n})\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```javascript\nimport Ajv from \"ajv\"\nimport * as schema_user from \"./schema_user.json\"\nconst ajv = new Ajv()\nconst validate_user = ajv.compile<User>(schema_user)\n\ninterface User {\n  username: string\n}\n\n// this is just some abstract API framework\napp.post(\"/user\", async (cxt) => {\n  if (validate_user(cxt.body)) {\n    // create user\n  } else {\n    // report error\n    cxt.status(400)\n  }\n})\n```\n</code-block>\n</code-group>\n\n::: warning Use single Ajv instance\nIt is recommended to use a single Ajv instance for the whole application, so if you use validation in more than one module, you should:\n\n- require Ajv in a separate module responsible for validation\n- compile all validators there\n- export them to be used in multiple modules of your application\n:::\n\n## Using Ajv instance cache\n\nAnother, more effective approach, is to use Ajv instance cache to have all compiled validators available anywhere in your application from a single import.\n\nIn this case you would have a separate module where you instantiate Ajv and use this instance in your application.\n\nYou can load all schemas and add them to Ajv instance in a single `validation` module:\n\n<code-group>\n<code-block title=\"validation.js\">\n```javascript\nconst Ajv = require(\"ajv\")\nconst schema_user = require(\"./schema_user.json\")\nconst schema_document = require(\"./schema_document.json\")\nconst ajv = exports.ajv = new Ajv()\najv.addSchema(schema_user, \"user\")\najv.addSchema(schema_document, \"document\")\n```\n</code-block>\n\n<code-block title=\"validation.ts\">\n```typescript\nimport Ajv from \"ajv\"\nimport * as schema_user from \"./schema_user.json\"\nimport * as schema_document from \"./schema_document.json\"\nexport const ajv = new Ajv()\najv.addSchema(schema_user, \"user\")\najv.addSchema(schema_document, \"document\")\n```\n</code-block>\n</code-group>\n\nAnd then you can import Ajv instance and access any schema in any application module, for example `user` module:\n\n<code-group>\n<code-block title=\"user.js\">\n```javascript\nconst {ajv} = require(\"./validation\")\n\n\n\n\n\n// this is just some abstract API framework\napp.post(\"/user\", async (cxt) => {\n  const validate = ajv.getSchema(\"user\")\n  if (validate(cxt.body)) {\n    // create user\n  } else {\n    // report error\n    cxt.status(400)\n  }\n})\n```\n</code-block>\n\n<code-block title=\"users.ts\">\n```javascript\nimport ajv from \"./validation\"\n\ninterface User {\n  username: string\n}\n\n// this is just some abstract API framework\napp.post(\"/user\", async (cxt) => {\n  const validate = ajv.getSchema<User>(\"user\")\n  if (validate(cxt.body)) {\n    // create user\n  } else {\n    // report error\n    cxt.status(400)\n  }\n})\n```\n</code-block>\n</code-group>\n\n::: tip On-demand vs preliminary compilation\nIn the example above, schema compilation happens only once, on the first API call, not at the application start-up time. It means that the application would start a bit faster, but the first API call would be a bit slower. If this is undesirable, you could, for example, call `getSchema` for all added schemas after they are added, then when `getSchema` is called inside route handler it would simply get compiled validation function from the instance cache.\n:::\n\n### Cache key: schema vs key vs $id\n\nIn the example above, the key passed to the `addSchema` method was used to retrieve schemas from the cache. Other options are:\n\n- use schema root $id attribute. While it usually looks like URI, it does not mean Ajv downloads it from this URI - this is simply $id used to identify and access the schema. You can though configure Ajv to download schemas on demand - see [Asynchronous schema loading](#asynchronous-schema-loading)\n- use schema object itself as a key to the cache (it is possible, because Ajv uses Map). This approach is not recommended, because it would only work if you pass the same instance of the schema object that was passed to `addSchema` method - it is easy to make a mistake that would result in schema being compiled every time it is used.\n\n### Pre-adding all schemas vs adding on demand\n\nIn the example above all schemas were added in advance. It is also possible, to add schemas as they are used - it can be helpful if there are many schemas. In this case, you need to check first whether the schema is already added by calling `getSchema` method - it would return `undefined` if not:\n\n```javascript\nconst schema_user = require(\"./schema_user.json\")\nlet validate = ajv.getSchema(\"user\")\nif (!validate) {\n  ajv.addSchema(schema_user, \"user\")\n  validate = ajv.getSchema(\"user\")\n}\n```\n\nIf your schema has `$id` attribute, for example:\n\n<code-group>\n<code-block title=\"schema_user.json\">\n```json\n{\n  \"$id\": \"https://example.com/user.json\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"username\": {\"type\": \"string\"}\n  },\n  required: [\"username\"]\n}\n```\n</code-block>\n</code-group>\n\nthen the above logic can be simpler:\n\n```javascript\nconst schema_user = require(\"./schema_user.json\")\nconst validate = ajv.getSchema(\"https://example.com/user.json\")\n              || ajv.compile(schema_user)\n```\n\nThe above is possible because when the schema has `$id` attribute `compile` method both compiles the schema (returning the validation function) and adds it to the Ajv instance cache at the same time.\n\n### Asynchronous schema loading\n\nThere are cases when you need to have a large collection of schemas stored in some database or on the remote server. In this case you are likely to use schema `$id` as some resource identifier to retrieve it - either network URI or database ID.\n\nYou can use `compileAsync` [method](./api.md#api-compileAsync) to asynchronously load the schemas as they are compiled, loading the schemas that are referenced from compiled schemas on demand. Ajv itself does not do any IO operations, it uses the function you supply via `loadSchema` [option](./api.md#options) to load schema from the passed ID. This function should return `Promise` that resolves to the schema (you can use async function, as in the example).\n\nExample:\n\n```javascript\nconst ajv = new Ajv({loadSchema: loadSchema})\n\najv.compileAsync(schema).then(function (validate) {\n  const valid = validate(data)\n  // ...\n})\n\nasync function loadSchema(uri) {\n  const res = await request.json(uri)\n  if (res.statusCode >= 400) throw new Error(\"Loading error: \" + res.statusCode)\n  return res.body\n}\n```\n\n## Caching schemas in your code\n\nYou can maintain cache of compiled schemas in your application independently from Ajv. It can be helpful in cases when you have multiple Ajv instances because, for example:\n\n- you need to compile different schemas with different options\n- you use both JSON Schema and JSON Type Definition schemas in one application\n- you have $id conflicts between different third party schemas you do not control\n\nWhatever approach you use, you need to ensure that each schema is compiled only once.\n"
  },
  {
    "path": "docs/guide/modifying-data.md",
    "content": "# Modifying data during validation\n\n[[toc]]\n\n## General considerations\n\nAjv has several options that allow to modify data during validation:\n\n- removeAdditional - to remove properties not defined in the schema object.\n- useDefaults - to assign defaults from the schema to the validated data properties.\n- coerceTypes - to change data type, when possible, to match the type(s) in the schema.\n\nYou can also define keywords that modify data.\n\n::: tip NOT possible to modify root data\nIt is not possible to modify the root data instance passed to the validation function, only data properties can be modified. This is related to how JavaScript passes parameters, and not a limitation of Ajv.\n:::\n\n::: warning Non-portable functionality\nThis functionality is non-standard - this is likely to be unsupported in other JSON Schema validator implementations.\n:::\n\n::: danger Unexpected results when modifying data\nWhile pure schema validation produces the results independent of the keywords and subschema order, enabling any feature that may modify the data makes validation impure and its results are likely to depend on the order of evaluation of keywords and subschemas.\n\nThe order of evaluation of subschemas in keywords like `allOf` is always the same as the order of subschemas in the array.\n\nOn another hand, the order of evaluation of keywords, while consistent between validations and not dependent on how schema object is created, is neither documented nor guaranteed, so it can change in the future major versions (and, in rare cases, it can change in minor version - e.g. when there is bug that needs to be fixed).\n\nIt is strongly recommended to always put user-defined keywords that can mutate data in separate subschemas inside `allOf` keyword to make the order of evaluation unambiguous. The exceptions to this recommendation are pre-defined `default` and `type` keywords - they must remain in the same schema as other keywords.\n:::\n\n## Removing additional properties\n\nWith [option `removeAdditional`](./api.md#options) (added by [andyscott](https://github.com/andyscott)) you can filter data during the validation.\n\nThis option modifies original data.\n\nExample:\n\n```javascript\nconst ajv = new Ajv({removeAdditional: true})\nconst schema = {\n  additionalProperties: false,\n  properties: {\n    foo: {type: \"number\"},\n    bar: {\n      additionalProperties: {type: \"number\"},\n      properties: {\n        baz: {type: \"string\"},\n      },\n    },\n  },\n}\n\nconst data = {\n  foo: 0,\n  additional1: 1, // will be removed; `additionalProperties` == false\n  bar: {\n    baz: \"abc\",\n    additional2: 2, // will NOT be removed; `additionalProperties` != false\n  },\n}\n\nconst validate = ajv.compile(schema)\n\nconsole.log(validate(data)) // true\nconsole.log(data) // { \"foo\": 0, \"bar\": { \"baz\": \"abc\", \"additional2\": 2 }\n```\n\nIf `removeAdditional` option in the example above were `\"all\"` then both `additional1` and `additional2` properties would have been removed.\n\nIf the option were `\"failing\"` then property `additional1` would have been removed regardless of its value and property `additional2` would have been removed only if its value were failing the schema in the inner `additionalProperties` (so in the example above it would have stayed because it passes the schema, but any non-number would have been removed).\n\n::: warning Unexpected results when using removeAdditional with anyOf/oneOf\nIf you use `removeAdditional` option with `additionalProperties` keyword inside `anyOf`/`oneOf` keywords your validation can fail with this schema. To make it work as you expect, you have to use discriminated union with [discriminator](../json-schema.md#discriminator) keyword (requires `discriminator` option).\n:::\n\nFor example, with this non-discriminated union you will have unexpected results:\n\n```javascript\n{\n  type: \"object\",\n  oneOf: [\n    {\n      properties: {\n        foo: {type: \"string\"}\n      },\n      required: [\"foo\"],\n      additionalProperties: false\n    },\n    {\n      properties: {\n        bar: {type: \"integer\"}\n      },\n      required: [\"bar\"],\n      additionalProperties: false\n    }\n  ]\n}\n```\n\nThe intention of the schema above is to allow objects with either the string property \"foo\" or the integer property \"bar\", but not with both and not with any other properties.\n\nWith the option `removeAdditional: true` the validation will pass for the object `{ \"foo\": \"abc\"}` but will fail for the object `{\"bar\": 1}`. It happens because while the first subschema in `oneOf` is validated, the property `bar` is removed because it is an additional property according to the standard (because it is not included in `properties` keyword in the same schema).\n\nWhile this behaviour is unexpected (issues [#129](https://github.com/ajv-validator/ajv/issues/129), [#134](https://github.com/ajv-validator/ajv/issues/134)), it is correct. To have the expected behaviour (both objects are allowed and additional properties are removed) the schema has to be refactored in this way:\n\n```javascript\n{\n  type: \"object\",\n  properties: {\n    foo: {type: \"string\"},\n    bar: {type: \"integer\"}\n  },\n  additionalProperties: false,\n  oneOf: [{required: [\"foo\"]}, {required: [\"bar\"]}]\n}\n```\n\nThe schema above is also more efficient - it will compile into a faster function.\n\nFor discriminated unions you could schemas with [discriminator](../json-schema.md#discriminator) keyword (it requires `discriminator: true` option):\n\n```javascript\n{\n  type: \"object\",\n  discriminator: {propertyName: \"tag\"},\n  required: [\"tag\"],\n  oneOf: [\n    {\n      properties: {\n        tag: {const: \"foo\"},\n        foo: {type: \"string\"}\n      },\n      required: [\"foo\"],\n      additionalProperties: false\n    },\n    {\n      properties: {\n        tag: {const: \"bar\"},\n        bar: {type: \"integer\"}\n      },\n      required: [\"bar\"],\n      additionalProperties: false\n    }\n  ]\n}\n```\n\nWith this schema, only one subschema in `oneOf` will be evaluated, so `removeAdditional` option will work as expected.\n\nSee [discriminator](../json-schema.md#discriminator) keyword.\n\n## Assigning defaults\n\nWith [option `useDefaults`](./options.md#options) Ajv will assign values from `default` keyword in the schemas of `properties` and `items` (when it is the array of schemas) to the missing properties and items.\n\nWith the option value `\"empty\"` properties and items equal to `null` or `\"\"` (empty string) will be considered missing and assigned defaults.\n\nThis option modifies original data.\n\n::: warning Defaults are deep-cloned\nThe default value is inserted in the generated validation code as a literal, so the value inserted in the data will be the deep clone of the default in the schema.\n:::\n\nExample 1 (`default` in `properties`):\n\n```javascript\nconst ajv = new Ajv({useDefaults: true})\nconst schema = {\n  type: \"object\",\n  properties: {\n    foo: {type: \"number\"},\n    bar: {type: \"string\", default: \"baz\"},\n  },\n  required: [\"foo\", \"bar\"],\n}\n\nconst data = {foo: 1}\n\nconst validate = ajv.compile(schema)\n\nconsole.log(validate(data)) // true\nconsole.log(data) // { \"foo\": 1, \"bar\": \"baz\" }\n```\n\nExample 2 (`default` in `items`):\n\n```javascript\nconst schema = {\n  type: \"array\",\n  items: [{type: \"number\"}, {type: \"string\", default: \"foo\"}],\n}\n\nconst data = [1]\n\nconst validate = ajv.compile(schema)\n\nconsole.log(validate(data)) // true\nconsole.log(data) // [ 1, \"foo\" ]\n```\n\nWith `useDefaults` option `default` keywords throws exception during schema compilation when used in:\n\n- not in `properties` or `items` subschemas\n- in schemas inside `anyOf`, `oneOf` and `not` (see [#42](https://github.com/ajv-validator/ajv/issues/42))\n- in `if` schema\n- in schemas generated by user-defined _macro_ keywords\n\nThe strict mode option can change the behaviour for these unsupported defaults (`strict: false` to ignore them, `\"log\"` to log a warning).\n\nSee [Strict mode](../strict-mode.md).\n\n::: tip Default with discriminator keyword\nDefaults will be assigned in schemas inside `oneOf` in case [discriminator](../json-schema.md#discriminator) keyword is used.\n:::\n\n## Coercing data types\n\nWhen you are validating user inputs all your data properties are usually strings. The option `coerceTypes` allows you to have your data types coerced to the types specified in your schema `type` keywords, both to pass the validation and to use the correctly typed data afterwards.\n\nThis option modifies original data.\n\n::: warning Type coercion with scalar values\nIf you pass a scalar value to the validating function its type will be coerced and it will pass the validation, but the value of the variable you pass won't be updated because scalars are passed by value.\n:::\n\nExample 1:\n\n```javascript\nconst ajv = new Ajv({coerceTypes: true})\nconst schema = {\n  type: \"object\",\n  properties: {\n    foo: {type: \"number\"},\n    bar: {type: \"boolean\"},\n  },\n  required: [\"foo\", \"bar\"],\n}\n\nconst data = {foo: \"1\", bar: \"false\"}\n\nconst validate = ajv.compile(schema)\n\nconsole.log(validate(data)) // true\nconsole.log(data) // { \"foo\": 1, \"bar\": false }\n```\n\nExample 2 (array coercions):\n\n```javascript\nconst ajv = new Ajv({coerceTypes: \"array\"})\nconst schema = {\n  properties: {\n    foo: {type: \"array\", items: {type: \"number\"}},\n    bar: {type: \"boolean\"},\n  },\n}\n\nconst data = {foo: \"1\", bar: [\"false\"]}\n\nconst validate = ajv.compile(schema)\n\nconsole.log(validate(data)) // true\nconsole.log(data) // { \"foo\": [1], \"bar\": false }\n```\n\nThe coercion rules, as you can see from the example, are different from JavaScript both to validate user input as expected and to have the coercion reversible (to correctly validate cases where different types are defined in subschemas of \"anyOf\" and other compound keywords).\n\nSee [Type coercion rules](../coercion.md) for details.\n"
  },
  {
    "path": "docs/guide/schema-language.md",
    "content": "---\ntags:\n  - JTD\n---\n\n# Choosing schema language\n\n[[toc]]\n\n## JSON Type Definition\n\nAjv supports the new specification focussed on defining cross-platform types of JSON messages/payloads - JSON Type Definition (JTD). See the informal reference of [JTD schema forms](../json-type-definition) and formal specification [RFC8927](https://datatracker.ietf.org/doc/rfc8927/).\n\n## JSON Schema\n\nAjv supports most widely used drafts of JSON Schema specification. Please see the informal reference of available [JSON Schema validation keywords](../json-schema) and [specification drafts](https://json-schema.org/specification.html).\n\n### draft-04\n\nDraft-04 is not included in Ajv v7, because of some differences it has with the following drafts:\n\n- different schema member for schema identifier (`id` in draft-04 instead of `$id`)\n- different syntax of exclusiveMaximum/Minimum\n\nYou can still use draft-04 schemas with Ajv v6 - while this is no longer actively developed, any security related issues would still be supported at least until 30/06/2021.\n\nTo install v6:\n\n```bash\nnpm install ajv@6\n```\n\nYou can migrate schemas from draft-04 to draft-07 using [ajv-cli](https://github.com/ajv-validator/ajv-cli).\n\n### draft-07 (and draft-06)\n\nThese are the most widely used versions of JSON Schema specification, and they are supported with the main ajv export.\n\n```javascript\nimport Ajv from \"ajv\"\nconst ajv = new Ajv()\n```\n\nIf you need to support draft-06 schemas you need to add additional meta-schema, but you may just change (or remove) `$schema` attribute in your schemas - no other changes are needed:\n\n```javascript\nconst draft6MetaSchema = require(\"ajv/dist/refs/json-schema-draft-06.json\")\najv.addMetaSchema(draft6MetaSchema)\n```\n\n### draft 2019-09 (and draft-2020-12)\n\nThe main advantage of this JSON Schema version over draft-07 is the ability to spread the definition of records that do not allow additional properties across multiple schemas. If you do not need it, you might be better off with draft-07.\n\nTo use Ajv with the support of all JSON Schema draft-2019-09/2020-12 features you need to use a different export:\n\n```javascript\nimport Ajv2019 from \"ajv/dist/2019\"\nconst ajv = new Ajv2019()\n```\n\nOptionally, you can add draft-07 meta-schema, to use both draft-07 and draft-2019-09 schemas in one Ajv instance:\n\n```javascript\nconst draft7MetaSchema = require(\"ajv/dist/refs/json-schema-draft-07.json\")\najv.addMetaSchema(draft7MetaSchema)\n```\n\nDraft-2019-09 support is provided via a separate export in order to avoid increasing the bundle and generated code size for draft-07 users.\n\nWith this import Ajv supports the following features:\n\n- keywords [`unevaluatedProperties`](../json-schema.md#unevaluatedproperties) and [`unevaluatedItems`](../json-schema.md#unevaluateditems)\n- keywords [`dependentRequired`](../json-schema.md#dependentrequired), [`dependentSchemas`](../json-schema.md#dependentschemas), [`maxContains`/`minContains`](../json-schema.md#maxcontains-mincontains)\n- dynamic recursive references with [`recursiveAnchor`/`recursiveReference`] - see [Extending recursive schemas](./combining-schemas.md#extending-recursive-schemas)\n- draft-2019-09 meta-schema is the default.\n\n::: warning Draft-2019-09 features performance cost (even when not used)\nSupporting dynamic recursive references and `unevaluatedProperties`/`unevaluatedItems` keywords adds additional generated code even to the validation functions where these features are not used (when possible, Ajv determines which properties/items are \"unevaluated\" at compilation time, but support for dynamic references always adds additional generated code). If you are not using these features in your schemas it is recommended to use default Ajv export with JSON-Schema draft-07 support.\n:::\n\n## Comparison\n\nBoth [JSON Schema](../json-schema.md) and [JSON Type Definition](../json-type-definition.md) are cross-platform specifications with implementations in multiple programming languages that define the shape of your JSON data.\n\nYou can see the difference between the two specifications in [Getting started](./getting-started) section examples.\n\nThis section compares their pros/cons to help decide which specification fits your application better.\n\n### JSON Schema\n\n**Pros**:\n\n- Wide specification adoption.\n- Used as part of OpenAPI specification.\n- Support of complex validation scenarios:\n  - untagged unions and boolean logic\n  - conditional schemas and dependencies\n  - restrictions on the number ranges and the size of strings, arrays and objects\n  - semantic validation with formats, patterns and content keywords\n  - distribute strict record definitions across multiple schemas (with unevaluatedProperties)\n- Can be effectively used for validation of any JavaScript objects and configuration files.\n\n**Cons**:\n\n- Defines the collection of restrictions on the data, rather than the shape of the data.\n- No standard support for tagged unions.\n- Complex and error prone for the new users (Ajv has [strict mode](../strict-mode) enabled by default to compensate for it, but it is not cross-platform).\n- Some parts of specification are difficult to implement, creating the risk of implementations divergence:\n  - reference resolution model\n  - unevaluatedProperties/unevaluatedItems\n  - dynamic recursive references\n- Internet draft status (rather than RFC)\n\nSee [JSON Schema](../json-schema.md) for more information and the list of defined keywords.\n\n### JSON Type Definition\n\n**Pros**:\n\n- Aligned with type systems of many languages - can be used to generate type definitions and efficient parsers and serializers to/from these types.\n- Very simple, enforcing the best practices for cross-platform JSON API modelling.\n- Simple to implement, ensuring consistency across implementations.\n- Defines the shape of JSON data via strictly defined schema forms (rather than the collection of restrictions).\n- Effective support for tagged unions.\n- Designed to protect against user mistakes.\n- Supports compilation of schemas to efficient [serializers and parsers](./getting-started.md#parsing-and-serializing-json) (no need to validate as a separate step).\n- Approved as [RFC8927](https://datatracker.ietf.org/doc/rfc8927/).\n- Substantial industry adoption since it was standardized in 2020, Ajv v8.12.0 fixed all reported JTD bugs.\n\n**Cons**:\n\n- Limited, compared with JSON Schema - no support for untagged unions<sup>1</sup>, conditionals, references between different schema files<sup>2</sup>, etc.\n- No meta-schema in the specification<sup>3</sup>.\n\n<sup>1</sup> Ajv defines non-standard keyword \"union\" that can be used inside \"metadata\" object.\n\n<sup>2</sup> You can still combine schemas from multiple files in the application code.\n\n<sup>3</sup> Ajv defines meta-schema for JTD schemas.\n\nSee [JSON Type Definition](../json-type-definition.md) for more information and the list of defined schema forms.\n"
  },
  {
    "path": "docs/guide/typescript.md",
    "content": "# Using with TypeScript\n\n[[toc]]\n\n## Additional functionality\n\nAjv takes advantage of TypeScript type system to provide additional functionality that is not possible in JavaScript:\n\n- utility types `JSONSchemaType` and `JTDSchemaType` to convert data type into the schema type to simplify writing schemas, both for [JSON Schema](../json-schema.md) (but without union support) and for [JSON Type Definition](../json-type-definition) (with tagged unions support).\n- utility type `JTDDataType` to convert JSON Type Definition schema into the type of data that it defines.\n- compiled validation functions are type guards that narrow the type after successful validation.\n- validation errors for JSON Schema are defined as tagged unions, for type-safe error handling.\n- when utility type is used, compiled JTD serializers only accept data of correct type (as they do not validate that the data is valid) and compiled parsers return correct data type.\n\n## Utility types for schemas\n\nFor the same example as in [Getting started](./getting-started):\n - ensure strictNullChecks is true\n\n<code-group>\n<code-block title=\"JSON Schema\">\n```typescript\nimport Ajv, {JSONSchemaType} from \"ajv\"\nconst ajv = new Ajv()\n\ninterface MyData {\n  foo: number\n  bar?: string\n}\n\nconst schema: JSONSchemaType<MyData> = {\n  type: \"object\",\n  properties: {\n    foo: {type: \"integer\"},\n    bar: {type: \"string\", nullable: true}\n  },\n  required: [\"foo\"],\n  additionalProperties: false\n}\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema)\n\n// or, if you did not use type annotation for the schema,\n// type parameter can be used to make it type guard:\n// const validate = ajv.compile<MyData>(schema)\n\nconst data = {\n  foo: 1,\n  bar: \"abc\"\n}\n\nif (validate(data)) {\n  // data is MyData here\n  console.log(data.foo)\n} else {\n  console.log(validate.errors)\n}\n```\n</code-block>\n\n<code-block title=\"JSON Type Definition\">\n```typescript\nimport Ajv, {JTDSchemaType} from \"ajv/dist/jtd\"\nconst ajv = new Ajv()\n\ninterface MyData {\n  foo: number\n  bar?: string\n}\n\nconst schema: JTDSchemaType<MyData> = {\n  properties: {\n    foo: {type: \"int32\"}\n  },\n  optionalProperties: {\n    bar: {type: \"string\"}\n  }\n}\n\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema)\n\n// or, if you did not use type annotation for the schema,\n// type parameter can be used to make it type guard:\n// const validate = ajv.compile<MyData>(schema)\n\nconst data = {\n  foo: 1,\n  bar: \"abc\"\n}\n\nif (validate(data)) {\n  // data is MyData here\n  console.log(data.foo)\n} else {\n  console.log(validate.errors)\n}\n```\n</code-block>\n</code-group>\n\nSee [this test](https://github.com/ajv-validator/ajv/tree/master/spec/types/json-schema.spec.ts) for an advanced example.\n\n## Utility type for JTD data type\n\nYou can use JTD schema to construct the type of data using utility type `JTDDataType`\n\n<code-group>\n<code-block title=\"JSON Type Definition\">\n```typescript\nimport Ajv, {JTDDataType} from \"ajv/dist/jtd\"\nconst ajv = new Ajv()\n\nconst schema = {\n  properties: {\n    foo: {type: \"int32\"}\n  },\n  optionalProperties: {\n    bar: {type: \"string\"}\n  }\n} as const\n\ntype MyData = JTDDataType<typeof schema>\n\n// type inference is not supported for JTDDataType yet\nconst validate = ajv.compile<MyData>(schema)\n\nconst validData = {\n  foo: 1,\n  bar: \"abc\"\n}\n\nif (validate(validData)) {\n  // data is MyData here\n  console.log(validData.foo)\n} else {\n  console.log(validate.errors)\n}\n```\n</code-block>\n</code-group>\n \n\n::: warning TypeScript limitation\nNote that it's currently not possible for `JTDDataType` to know whether the compiler is inferring timestamps as strings or Dates, and so it conservatively types any timestamp as `string | Date`. This is accurate, but often requires extra validation on the part of the user to confirm they're getting the appropriate data type.\n:::\n\n## Type-safe error handling\n\nWith both [JSON Schema](../json-schema.md) and [JSON Type Definition](../json-type-definition.md), the validation error type is an open union, but it can be cast to tagged unions (using validation keyword as tag) for easier error handling.\n\nContinuing the example above:\n\n<code-group>\n<code-block title=\"JSON Schema\">\n```typescript\nimport {DefinedError} from \"ajv\"\n\n// ...\n\nif (validate(data)) {\n  // data is MyData here\n  console.log(data.foo)\n} else {\n  // The type cast is needed, as Ajv uses a wider type to allow extension\n  // You can extend this type to include your error types as needed.\n  for (const err of validate.errors as DefinedError[]) {\n    switch (err.keyword) {\n      case \"type\":\n        // err type is narrowed here to have \"type\" error params properties\n        console.log(err.params.type)\n      break\n        // ...\n    }\n  }\n}\n```\n</code-block>\n\n<code-block title=\"JSON Type Definition\">\n```typescript\nimport {JTDErrorObject} from \"ajv/dist/jtd\"\n\n// ...\n\nif (validate(data)) {\n  // data is MyData here\n  console.log(data.foo)\n} else {\n  // The type cast is needed, as Ajv uses a wider type to allow extension\n  // You can extend this type to include your error types as needed.\n  for (const err of validate.errors as JTDErrorObject[]) {\n    switch (err.keyword) {\n      case \"type\":\n        // err type is narrowed here to have \"type\" error params properties\n        console.log(err.params.type)\n      break\n        // ...\n    }\n  }\n}\n```\n</code-block>\n</code-group>\n\n## Type-safe parsers and serializers\n\nWith typescript, your compiled parsers and serializers can be type-safe, either taking their type from schema type or from type parameter passed to compilation functions.\n\nThis example uses the same data and schema types as above:\n\n<code-group>\n<code-block title=\"JSON Type Definition\">\n```typescript\nimport Ajv, {JTDSchemaType} from \"ajv/dist/jtd\"\nconst ajv = new Ajv()\n\ninterface MyData {\n  foo: number\n  bar?: string\n}\n\nconst schema: JTDSchemaType<MyData> = {\n  properties: {\n    foo: {type: \"int32\"}\n  },\n  optionalProperties: {\n    bar: {type: \"string\"}\n  }\n}\n\n// serialize will only accept data compatible with MyData\nconst serialize = ajv.compileSerializer(schema)\n\n// parse will return MyData or undefined\nconst parse = ajv.compileParser(schema)\n\n// types of parse and serialize are inferred from schema,\n// they can also be defined explicitly:\n// const parse = ajv.compileParser<MyData>(schema)\n\nconst data = {\n  foo: 1,\n  bar: \"abc\"\n}\n\nconst invalidData = {\n  unknown: \"abc\"\n}\n\nconsole.log(serialize(data))\nconsole.log(serialize(invalidData)) // type error\n\nconst json = '{\"foo\": 1, \"bar\": \"abc\"}'\nconst invalidJson = '{\"unknown\": \"abc\"}'\n\nconsole.log(parseAndLogFoo(json)) // logs property\nconsole.log(parseAndLogFoo(invalidJson)) // logs error and position\n\nfunction parseAndLogFoo(json: string): void {\n  const data = parse(json) // MyData | undefined\n  if (data === undefined) {\n    console.log(parse.message) // error message from the last parse call\n    console.log(parse.position) // error position in string\n  } else {\n    // data is MyData here\n    console.log(data.foo)\n  }\n}\n```\n</code-block>\n</code-group>\n\n## Type-safe unions\n\nJSON Type Definition only supports tagged unions, so unions in JTD are fully supported for `JTDSchemaType` and `JTDDataType`.\nJSON Schema is more complex and so `JSONSchemaType` has limited support for type safe unions.\n\n`JSONSchemaType` will type check unions where each union element is fully specified as an element of an `anyOf` array or `oneOf` array.\nAdditionally, unions of primitives will type check appropriately if they're combined into an array `type`, e.g. `{type: [\"string\", \"number\"]}`.\n\n::: warning TypeScript limitation\nNote that due to current limitation of TypeScript, JSONSchemaType cannot verify that every element of the union is present, and the following example is still valid `const schema: JSONSchemaType<number | string> = {type: \"string\"}`.\n:::\n\nHere's a more detailed example showing several union types:\n\n<code-group>\n<code-block title=\"JSON Schema\">\n```typescript\nimport Ajv, {JSONSchemaType} from \"ajv\"\nconst ajv = new Ajv()\n\ntype MyUnion = {prop: boolean} | string | number\n\nconst schema: JSONSchemaType<MyUnion> = {\n  anyOf: [\n    {\n      type: \"object\",\n      properties: { prop: { type: \"boolean\" } },\n      required: [\"prop\"],\n    },\n    {\n      type: [\"string\", \"number\"]\n    }\n  ]\n}\n```\n</code-block>\n</code-group>\n"
  },
  {
    "path": "docs/guide/user-keywords.md",
    "content": "# User-defined keywords\n\nYou can extend keyword available in Ajv by defining your own keywords.\n\nThe advantages of defining keywords are:\n\n- allow creating validation scenarios that cannot be expressed using pre-defined keywords\n- simplify your schemas\n- help bringing a bigger part of the validation logic to your schemas\n- make your schemas more expressive, less verbose and closer to your application domain\n- implement data processors that modify your data (`modifying` option MUST be used in keyword definition) and/or create side effects while the data is being validated\n\nIf a keyword is used only for side-effects and its validation result is pre-defined, use option `valid: true/false` in keyword definition to simplify both generated code (no error handling in case of `valid: true`) and your keyword functions (no need to return any validation result).\n\n::: warning User-defined keywords make schemas non-portable\nWhen extending JSON Schema standard with additional keywords, you have several potential concerns to be aware of:\n\n- portability of your schemas - they would only work with JavaScript or TypeScript applications where you can use Ajv.\n- additional documentation required to maintain your schemas.\n:::\n\n::: danger Avoid using non-standard keywords with JTD schemas\nWhile it is possible to define additional keywords for JSON Type Definition schemas (these keywords can only be used in `metadata` member of the schema), it is strongly recommended not to do it - JTD is specifically designed for cross-platform APIs.\n:::\n\nYou can define keywords with [addKeyword](./api.md#api-addkeyword) method. Keywords are defined on the `ajv` instance level - new instances will not have previously defined keywords.\n\nAjv allows defining keywords with:\n\n- code generation function (used by all pre-defined keywords)\n- validation function\n- compilation function\n- macro function\n\nExample. `range` and `exclusiveRange` keywords using compiled schema:\n\n```javascript\najv.addKeyword({\n  keyword: \"range\",\n  type: \"number\",\n  schemaType: \"array\",\n  implements: \"exclusiveRange\",\n  compile: ([min, max], parentSchema) =>\n    parentSchema.exclusiveRange === true\n      ? (data) => data > min && data < max\n      : (data) => data >= min && data <= max,\n})\n\nconst schema = {range: [2, 4], exclusiveRange: true}\nconst validate = ajv.compile(schema)\nconsole.log(validate(2.01)) // true\nconsole.log(validate(3.99)) // true\nconsole.log(validate(2)) // false\nconsole.log(validate(4)) // false\n```\n\nSeveral keywords (typeof, instanceof, range and propertyNames) are defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package - they can be used for your schemas and as a starting point for your own keywords.\n\nSee [User-defined keywords](../keywords.md) reference for more details.\n"
  },
  {
    "path": "docs/guide/why-ajv.md",
    "content": "# Why use AJV\n\n## Write less code\n\n**Ensure your data is valid as soon as it's received**\n\nInstead of having your data validation and sanitization logic written as lengthy code, you can declare the requirements to your data with concise, easy to read and cross-platform [JSON Schema](https://json-schema.org) or [JSON Type Definition](https://jsontypedef.com) specifications and validate the data as soon as it arrives to your application.\n\nTypeScript users can use validation functions as type guards, having type level guarantee that if your data is validated - it is correct.\n\nRead more in [Getting started](./getting-started.md) and [Using with TypeScript](./typescript.md)\n\n## Super fast & secure\n\n**Compiles your schemas to optimized JavaScript code**\n\nAjv generates code to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization.\n\nCurrently Ajv is the fastest and the most standard compliant validator according to these benchmarks:\n\n- [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark) - 50% faster than the second place\n- [jsck benchmark](https://github.com/pandastrike/jsck#benchmarks) - 20-190% faster\n- [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html)\n- [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html)\n\nAjv was designed at the time when there were no validators fully complying with JSON Schema specification, aiming to achieve the best possibly validation performance via just-in-time compilation of JSON schemas to code. Ajv achieved both speed and rigour, but initially security was an afterthought - many security flaws have been fixed thanks to the reports from its users.\n\nAjv version 7 was rebuilt to have secure code generation embedded in its design as the primary objective - even if you use untrusted schemas (which is still not recommended) there are type-level guarantees against remote code execution.\n\nRead more in [Code generation design](../codegen.md)\n\n## Multi-standard\n\n**Use JSON Type Definition or JSON Schema**\n\nIn addition to the multiple [JSON Schema](../json-schema.md) drafts, including the latest draft 2020-12, Ajv has support for [JSON Type Definition](../json-type-definition.md) - a new [RFC8927](https://datatracker.ietf.org/doc/rfc8927/) that offers a much simpler alternative to JSON Schema. Designed to be well-aligned with type systems, JTD has tools for both validation and type code generation for multiple languages.\n\nRead more in [Choosing schema language](./schema-language.md)\n"
  },
  {
    "path": "docs/json-schema.md",
    "content": "# JSON Schema\n\nIn a simple way, JSON Schema is an object with validation keywords.\n\nThe keywords and their values define what rules the data should satisfy to be valid.\n\n[[toc]]\n\n## JSON Schema versions\n\n### draft-07 <Badge text=\"default\" />\n\nThis version is provided as default export:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv = require(\"ajv\")\nconst ajv = new Ajv()\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv from \"ajv\"\nconst ajv = new Ajv()\n```\n</code-block>\n</code-group>\n\n::: tip draft-07 has better performance\nUnless you need the new features of later versions, you would have more efficient generated code with this draft.\n:::\n\n### draft-2019-09 <Badge text=\"NEW\" />\n\nAjv supports all new keywords of JSON Schema draft-2019-09:\n\n- [unevaluatedProperties](#unevaluatedproperties)\n- [unevaluatedItems](#unevaluateditems)\n- [dependentRequired](#dependentrequired)\n- [dependentSchemas](#dependentschemas)\n- [maxContains/minContains](#maxcontains--mincontains)\n- [$recursiveAnchor/$recursiveRef](./guide/combining-schemas.md#extending-recursive-schemas)\n\nTo use draft-2019-09 schemas you need to import a different Ajv class:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv2019 = require(\"ajv/dist/2019\")\nconst ajv = new Ajv2019()\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv2019 from \"ajv/dist/2019\"\nconst ajv = new Ajv2019()\n```\n</code-block>\n</code-group>\n\nYou can use draft-07 schemas with this Ajv instance as well, draft-2019-09 is backwards compatible. If your schemas use `$schema` keyword, you need to add draft-07 meta-schema to Ajv instance:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst draft7MetaSchema = require(\"ajv/dist/refs/json-schema-draft-07.json\")\najv.addMetaSchema(draft7MetaSchema)\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport * as draft7MetaSchema from \"ajv/dist/refs/json-schema-draft-07.json\"\najv.addMetaSchema(draft7MetaSchema)\n```\n</code-block>\n</code-group>\n\n### draft-2020-12 <Badge text=\"BREAKING\" type=\"warning\" />\n\n::: warning draft-2020-12 is not backwards compatible\nYou cannot use draft-2020-12 and previous JSON Schema versions in the same Ajv instance.\n:::\n\nAjv supports all keywords of JSON Schema draft-2020-12:\n\n- [prefixItems](#prefixItems) that replaced array form of items keyword\n- changed [items](#items-in-draft-2020-12) keyword that combined parts of functionality of items and additionalItems\n- [$dynamicAnchor/$dynamicRef](./guide/combining-schemas.md#extending-recursive-schemas)\n\nTo use draft-2020-12 schemas you need to import a different Ajv class:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv2020 = require(\"ajv/dist/2020\")\nconst ajv = new Ajv2020()\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv2020 from \"ajv/dist/2020\"\nconst ajv = new Ajv2020()\n```\n</code-block>\n</code-group>\n\n### draft-06\n\nYou can use JSON Schema draft-06 schemas with Ajv v7/8. If your schemas use `$schema` keyword, you need to add draft-06 meta-schema to Ajv instance. This example shows how to support both draft-06 and draft-07 schemas:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv = require(\"ajv\")\nconst draft6MetaSchema = require(\"ajv/dist/refs/json-schema-draft-06.json\")\n\nconst ajv = new Ajv()\najv.addMetaSchema(draft6MetaSchema)\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv from \"ajv\"\nimport * as draft6MetaSchema from \"ajv/dist/refs/json-schema-draft-06.json\"\n\nconst ajv = new Ajv()\najv.addMetaSchema(draft6MetaSchema)\n```\n</code-block>\n</code-group>\n\n### draft-04\n\nYou can use JSON Schema draft-04 schemas with Ajv from v8.5.0 and the additional package [ajv-draft-04](https://github.com/ajv-validator/ajv-draft-04) (both ajv and ajv-draft-04 should be installed).\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv = require(\"ajv-draft-04\")\nconst ajv = new Ajv()\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv from \"ajv-draft-04\"\nconst ajv = new Ajv()\n```\n</code-block>\n</code-group>\n\n::: warning Ajv cannot combine multiple JSON Schema versions\nYou can only use this import with JSON Schema draft-04, you cannot combine multiple JSON Schema versions in this ajv instance.\n:::\n\n## OpenAPI support\n\nAjv supports these additional [OpenAPI specification](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md) keywords:\n- [nullable](#nullable) - to avoid using `type` keyword with array of types.\n- [discriminator](#discriminator) -  to optimize validation and error reporting of tagged unions\n\n## JSON data type\n\n### `type`\n\n`type` keyword requires that the data is of certain type (or some of types). Its value can be a string (the allowed type) or an array of strings (multiple allowed types).\n\nType can be: `number`, `integer`, `string`, `boolean`, `array`, `object` or `null`.\n\n**Examples**\n\n1.  _schema_: `{type: \"number\"}`\n\n    _valid_: `1`, `1.5`\n\n    _invalid_: `\"abc\"`, `\"1\"`, `[]`, `{}`, `null`, `true`\n\n2)  _schema_: `{type: \"integer\"}`\n\n    _valid_: `1`, `2`\n\n    _invalid_: `\"abc\"`, `\"1\"`, `1.5`, `[]`, `{}`, `null`, `true`\n\n3.  _schema_: `{type: [\"number\", \"string\"]}`\n\n    _valid_: `1`, `1.5`, `\"abc\"`, `\"1\"`\n\n    _invalid_: `[]`, `{}`, `null`, `true`\n\nAll examples above are JSON Schemas that only require data to be of certain type to be valid.\n\nMost other keywords apply only to a particular type of data. If the data is of different type, the keyword will not apply and the data will be considered valid.\n\nIn v7 Ajv introduced [Strict types](./strict-mode.md#strict-types) mode that makes these mistakes less likely by requiring that types are constrained with type keyword whenever another keyword that applies to specific type is used.\n\n### nullable <Badge text=\"OpenAPI\" />\n\nThis keyword can be used to allow `null` value in addition to the defined `type`.\n\nAjv supports it by default, without additional options. These two schemas are equivalent, but the first one is better supported by some tools and is also compatible with `strictTypes` option (see [Strict types](./strict-mode.md#strict-types))\n\n```json\n{\n  \"type\": \"string\",\n  \"nullable\": true\n}\n```\n\nand\n\n```json\n{\n  \"type\": [\"string\", \"null\"]\n}\n```\n\n::: warning nullable does not extend enum and const\nIf you use [enum](#enum) or [const](#const) keywords, `\"nullable\": true` would not extend the list of allowed values - `null` value has to be explicitly added to `enum` (and `const` would fail, unless it is `\"const\": null`)\n\nThis is different from how `nullable` is defined in [JSON Type Definition](./json-type-definition.md), where `\"nullable\": true` allows `null` value in addition to any data defined by the schema.\n:::\n\n## Keywords for numbers\n\n### `maximum` / `minimum` and `exclusiveMaximum` / `exclusiveMinimum`\n\nThe value of keyword `maximum` (`minimum`) should be a number. This value is the maximum (minimum) allowed value for the data to be valid.\n\nThe value of keyword `exclusiveMaximum` (`exclusiveMinimum`) should be a number. This value is the exclusive maximum (minimum) allowed value for the data to be valid (the data equal to this keyword value is invalid).\n\n::: warning NO support for boolean keyword values\nBoolean values for keywords `exclusiveMaximum` (`exclusiveMinimum`) are not supported.\n:::\n\n**Examples**\n\n1.  _schema_: `{type: \"number\", maximum: 5}`\n\n    _valid_: `4`, `5`\n\n    _invalid_: `6`, `7`\n\n2.  _schema_: `{type: \"number\", minimum: 5}`\n\n    _valid_: `5`, `6`\n\n    _invalid_: `4`, `4.5`\n\n3.  _schema_: `{type: \"number\", exclusiveMinimum: 5}`\n\n    _valid_: `6`, `7`\n\n    _invalid_: `4.5`, `5`\n\n### `multipleOf`\n\nThe value of the keyword should be a number. The data to be valid should be a multiple of the keyword value (i.e. the result of division of the data on the value should be integer).\n\n**Examples**\n\n1.  _schema_: `{type: \"number\", multipleOf: 5}`\n\n    _valid_: `5`, `10`\n\n    _invalid_: `1`, `4`\n\n2)  _schema_: `{type: \"number\", multipleOf: 2.5}`\n\n    _valid_: `2.5`, `5`, `7.5`\n\n    _invalid_: `1`, `4`\n\n## Keywords for strings\n\n### `maxLength` / `minLength`\n\n::: warning Grapheme clusters will count as multiple characters\nCertain charsets have characters that are made up of multiple Unicode code points. These [grapheme clusters](https://www.unicode.org/reports/tr29/tr29-17.html#Grapheme_Cluster_Boundaries) are counted as multiple in length calculations.\n:::\n\nThe value of the keywords should be a number. The data to be valid should have length satisfying this rule. Unicode pairs are counted as a single character.\n\n**Examples**\n\n1.  _schema_: `{type: \"string\", maxLength: 5}`\n\n    _valid_: `\"abc\"`, `\"abcde\"`\n\n    _invalid_: `\"abcdef\"`\n\n2)  _schema_: `{type: \"string\", minLength: 2}`\n\n    _valid_: `\"ab\"`, `\"😀😀\"`\n\n    _invalid_: `\"a\"`, `\"😀\"`\n\n### `pattern`\n\nThe value of the keyword should be a string. The data to be valid should match the regular expression defined by the keyword value.\n\nAjv uses `new RegExp(value, \"u\")` to create the regular expression that will be used to test data.\n\n**Example**\n\n_schema_: `{type: \"string\", pattern: \"[abc]+\"}`\n\n_valid_: `\"a\"`, `\"abcd\"`, `\"cde\"`\n\n_invalid_: `\"def\"`, `\"\"`\n\n### `format`\n\nThe value of the keyword should be a string. The data to be valid should match the format with this name.\n\nAjv does not include any formats, they can be added with [ajv-formats](https://github.com/ajv-validator/ajv-formats) plugin.\n\n**Example**\n\n_schema_: `{type: \"string\", format: \"ipv4\"}`\n\n_valid_: `\"192.168.0.1\"`\n\n_invalid_: `\"abc\"`\n\n## Keywords for arrays\n\n### `maxItems` / `minItems`\n\nThe value of the keywords should be a number. The data array to be valid should not have more (less) items than the keyword value.\n\n**Example**\n\n_schema_: `{type: \"array\", maxItems: 3}`\n\n_valid_: `[]`, `[1]`, `[\"1\", 2, \"3\"]`\n\n_invalid_: `[1, 2, 3, 4]`\n\n### `uniqueItems`\n\nThe value of the keyword should be a boolean. If the keyword value is `true`, the data array to be valid should have unique items.\n\n**Example**\n\n_schema_: `{type: \"array\", uniqueItems: true}`\n\n_valid_: `[]`, `[1]`, `[\"1\", 2, \"3\"]`\n\n_invalid_: `[1, 2, 1]`, `[{a: 1, b: 2}, {b: 2, a: 1}]`\n\n### `items`\n\n#### `items` in draft-04, -06, -07 and -2019-09 \n\n::: warning items keyword changed in JSON Schema draft-2020-12\nThis section describes `items` keyword in all JSON Schema versions prior to draft-2020-12.\n:::\n\nThe value of the keyword should be a schema or an array of schemas.\n\nIf the keyword value is a schema, then for the data array to be valid each item of the array should be valid according to the schema. In this case the `additionalItems` keyword is ignored.\n\nIf the keyword value is an array, then items with indices less than the number of items in the keyword should be valid according to the schemas with the same indices. Whether additional items are valid will depend on `additionalItems` keyword.\n\n**Examples**\n\n1.  _schema_: `{type: \"array\", items: {type: \"integer\"}}`\n\n    _valid_: `[1,2,3]`, `[]`\n\n    _invalid_: `[1,\"abc\"]`\n\n2.  _schema_:\n\n    ```javascript\n    {\n      type: \"array\",\n      items: [{type: \"integer\"}, {type: \"string\"}]\n    }\n    ```\n\n    _valid_: `[1]`, `[1, \"abc\"]`, `[1, \"abc\", 2]`, `[]`\n\n    _invalid_: `[\"abc\", 1]`, `[\"abc\"]`\n\nThe schema in example 2 will log warning by default (see `strictTuples` option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use `minItems` and `additionalItems` keywords (see example 1 in `additionalItems`).\n\n#### `items` in draft-2020-12 <Badge text=\"NEW\" />\n\n::: warning items keyword changed in JSON Schema draft-2020-12\nThis section describes `items` keyword in JSON draft-2020-12.\n:::\n\nThe value of the keyword must be a schema.\n\nFor the data array to be valid:\n- if [prefixItems](#prefixItems) keyword is not used in the schema, then each item of the array must be valid according to the schema in `items`.\n- if [prefixItems](#prefixItems) keyword is used in the schema, then each item with the index starting from the size of `prefixItems` schema must be valid according to the schema in `items`\n\n**Examples**\n\n1.  _schema_: `{type: \"array\", items: {type: \"integer\"}}`\n\n    _valid_: `[1,2,3]`, `[]`\n\n    _invalid_: `[1,\"abc\"]`\n\n2.  _schema_:\n\n    ```javascript\n    {\n      type: \"array\",\n      prefixItems: [{type: \"integer\"}, {type: \"integer\"}],\n      minItems: 2\n      items: false\n    }\n    ```\n\n    _valid_: `[1, 2]`\n\n    _invalid_: `[]`, `[1]`, `[1, 2, 3]`, `[1, \"abc\"]` (any wrong number of items or wrong type)\n\n3.  _schema_:\n\n    ```javascript\n    {\n      type: \"array\",\n      prefixItems: [{type: \"integer\"}, {type: \"integer\"}],\n      items: {type: \"string\"}\n    }\n    ```\n\n    _valid_: `[]`, `[1, 2]`, `[1, 2, \"abc\"]`\n\n    _invalid_: `[\"abc\"]`, `[1, 2, 3]`\n    ```\n\n    _valid_: `[1]`, `[1, \"abc\"]`, `[1, \"abc\", 2]`, `[]`\n\n    _invalid_: `[\"abc\", 1]`, `[\"abc\"]`\n\nThe schema in example 3 will log warning by default (see `strictTuples` option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use `minItems` and `items` keywords (see example 2).\n\n### `prefixItems` <Badge text=\"NEW: draft 2020-12\" />\n\nThe value of the keyword must be an array of schemas.\n\nFor the data array to be valid, the items with indices less than the number of schemas in this keyword must be valid according to the schemas with the same indices. Whether additional items are valid will depend on `items` keyword.\n\n**Examples**\n\n_schema_:\n\n```javascript\n{\n  type: \"array\",\n  prefixItems: [{type: \"integer\"}, {type: \"string\"}]\n}\n```\n\n_valid_: `[1]`, `[1, \"abc\"]`, `[1, \"abc\", 2]`, `[]`\n\n_invalid_: `[\"abc\", 1]`, `[\"abc\"]`\n\nThe schema in example will log warning by default (see `strictTuples` option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use [minItems](#minitems) and [items](#items-in-draft-2020-12) keywords (see example 2 in [items](#items-in-draft-2020-12)).\n\n### `additionalItems`\n\n::: warning additionalItems is not supported in JSON Schema draft-2020-12\nTo create and equivalent schema in draft-2020-12 use keywords [prefixItems](#prefixItems) and the new [items](#items-in-draft-2020-12) keyword\n:::\n\nThe value of the keyword should be a boolean or an object.\n\n`additionalItems` keyword is ignored if `items` keyword is not present or is an object. By default Ajv will throw exception in this case - see [Strict mode](./strict-mode.md)\n\n`additionalItems` keyword is ignored if `items` keyword has more elements than data array.\n\nIf the data array has more elements than the `items` keyword value then the result of the validation depends on the value of `additionalItems` keyword:\n\n- `false`: data is invalid\n- `true`: data is valid\n- an object: data is valid if all additional items (i.e. items with indices greater or equal than \"items\" keyword value length) are valid according to the schema in \"additionalItems\" keyword.\n\nThe schemas in examples 2-3 log warning by default, use option `strictTuples: false` to allow)\n\n**Examples**\n\n1.  _schema_:\n\n    ```javascript\n    {\n      type: \"array\",\n      items: [{type: \"integer\"}, {type: \"integer\"}],\n      minItems: 2\n      additionalItems: false\n    }\n    ```\n\n    _valid_: `[1, 2]`\n\n    _invalid_: `[]`, `[1]`, `[1, 2, 3]`, `[1, \"abc\"]` (any wrong number of items or wrong type)\n\n2.  _schema_:\n\n    ```javascript\n    {\n      type: \"array\",\n      items: [{type: \"integer\"}, {type: \"integer\"}],\n      additionalItems: true\n    }\n    ```\n\n    _valid_: `[]`, `[1, 2]`, `[1, 2, 3]`, `[1, 2, \"abc\"]`\n\n    _invalid_: `[\"abc\"]`, `[1, \"abc\", 3]`\n\n3.  _schema_:\n\n    ```javascript\n    {\n      type: \"array\",\n      items: [{type: \"integer\"}, {type: \"integer\"}],\n      additionalItems: {type: \"string\"}\n    }\n    ```\n\n    _valid_: `[]`, `[1, 2]`, `[1, 2, \"abc\"]`\n\n    _invalid_: `[\"abc\"]`, `[1, 2, 3]`\n\n### `contains`\n\nThe value of the keyword is a JSON Schema. The array is valid if it contains at least one item that is valid according to this schema.\n\n**Example**\n\n_schema_: `{type: \"array\", contains: {type: \"integer\"}}`\n\n_valid_: `[1]`, `[1, \"foo\"]`, any array with at least one integer\n\n_invalid_: `[]`, `[\"foo\", \"bar\"]`, any array without integers\n\n### `maxContains` / `minContains` <Badge text=\"NEW: draft 2019-09\" />\n\nThe value of these keywords should be an integer.\n\nWithout `contains` keyword they are ignored (logs error or throws exception in ajv [strict mode](./strict-mode.md)).\n\nThe array is valid if it contains at least `minContains` items and no more than `maxContains` items that are valid against the schema in `contains` keyword.\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"array\",\n  contains: {type: \"integer\"},\n  minContains: 2,\n  maxContains: 3\n}\n```\n\n_valid_: `[1, 2]`, `[1, 2, 3, \"foo\"]`, any array with 2 or 3 integers\n\n_invalid_: `[]`, `[1, \"foo\"]`, `[1, 2, 3, 4]`, any array with fewer than 2 or more than 3 integers\n\n### `unevaluatedItems` <Badge text=\"NEW: draft 2019-09\" />\n\nThe value of this keyword is a JSON Schema (can be a boolean).\n\nThis schema will be applied to all array items that were not evaluated by other keywords for items (`items`, `additionalItems` and `contains`) in the current schema and all sub-schemas that were valid for this data instance. It includes:\n\n- all subschemas schemas in `allOf` and `$ref` keywords\n- valid sub-schemas in `oneOf` and `anyOf` keywords\n- sub-schema in `if` keyword\n- sub-schemas in `then` or `else` keywords that were applied based on the validation result by `if` keyword.\n\nThe only scenario when this keyword would be applied to some items is when `items` keyword value is an array of schemas and `additionalItems` was not present (or did not apply, in case it was present in some invalid subschema).\n\nSome user-defined keywords can also make items \"evaluated\".\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"array\",\n  items: [\n    {type: \"number\"},\n    {type: \"number\"}\n  ],\n  unevaluatedItems: false,\n  anyOf: [\n    {items: [true, true, {type: \"number\"}]},\n    {items: [true, true, {type: \"boolean\"}]}\n  ]\n}\n```\n\n_valid_: `[1, 2, 3]`, `[1, 2, true]`\n\n_invalid_:\n\n- `[1, 2]` - the third item is not present\n- `[1, 2, \"3\"]` - the third item is \"unevaluated\"\n\nSee [tests](https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft2019-09/unevaluatedItems.json) for `unevaluatedItems` keyword for other examples.\n\n## Keywords for objects\n\n### `maxProperties` / `minProperties`\n\nThe value of the keywords should be a number. The data object to be valid should have not more (less) properties than the keyword value.\n\n**Example**\n\n_schema_: `{type: \"object\", maxProperties: 2 }`\n\n_valid_: `{}`, `{a: 1}`, `{a: \"1\", b: 2}`\n\n_invalid_: `{a: 1, b: 2, c: 3}`\n\n### `required`\n\nThe value of the keyword should be an array of unique strings. The data object to be valid should contain all properties with names equal to the elements in the keyword value.\n\n**Example**\n\n_schema_: `{type: \"object\", required: [\"a\", \"b\"]}`\n\n_valid_: `{a: 1, b: 2}`, `{a: 1, b: 2, c: 3}`\n\n_invalid_: `{}`, `{a: 1}`, `{c: 3, d: 4}`\n\n### `properties`\n\nThe value of the keyword should be a map with keys equal to data object properties. Each value in the map should be a JSON Schema. For data object to be valid the corresponding values in data object properties should be valid according to these schemas.\n\n::: warning Properties are not required\n`properties` keyword does not require that the properties mentioned in it are present in the object (see examples).\n:::\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"object\",\n  properties: {\n    foo: {type: \"string\"},\n    bar: {\n      type: \"number\",\n      minimum: 2\n    }\n  }\n}\n```\n\n_valid_: `{}`, `{foo: \"a\"}`, `{foo: \"a\", bar: 2}`\n\n_invalid_: `{foo: 1}`, `{foo: \"a\", bar: 1}`\n\n### `patternProperties`\n\nThe value of this keyword should be a map where keys should be regular expressions and the values should be JSON Schemas. For data object to be valid the values in data object properties that match regular expression(s) should be valid according to the corresponding schema(s).\n\nWhen the value in data object property matches multiple regular expressions it should be valid according to all the schemas for all matched regular expressions.\n\n::: warning Unexpected validation results\n1. `patternProperties` keyword does not require that properties matching patterns are present in the object (see examples).\n2. By default, Ajv does not allow schemas where patterns in `patternProperties` match any property name in `properties` keyword - that leads to unexpected validation results. It can be allowed with option `allowMatchingProperties`. See [Strict mode](./strict-mode.md)\n:::\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"object\",\n  patternProperties: {\n    \"^fo.*$\": {type: \"string\"},\n    \"^ba.*$\": {type: \"number\"}\n  }\n}\n```\n\n_valid_: `{}`, `{foo: \"a\"}`, `{foo: \"a\", bar: 1}`\n\n_invalid_: `{foo: 1}`, `{foo: \"a\", bar: \"b\"}`\n\n### `additionalProperties`\n\nThe value of the keyword should be either a boolean or a JSON Schema.\n\nIf the value is `true` the keyword is ignored.\n\nIf the value is `false` the data object to be valid should not have \"additional properties\" (i.e. properties other than those used in \"properties\" keyword and those that match patterns in \"patternProperties\" keyword).\n\nIf the value is a schema for the data object to be valid the values in all \"additional properties\" should be valid according to this schema.\n\n**Examples**\n\n1.  _schema_:\n\n    ```javascript\n    {\n      type: \"object\",\n      properties: {\n        foo: {type: \"number\"}\n      },\n      patternProperties: {\n        \"^.*r$\": {type: \"number\"}\n      },\n      additionalProperties: false\n    }\n    ```\n\n    _valid_: `{}`, `{foo: 1}`, `{foo: 1, bar: 2}`\n\n    _invalid_: `{a: 3}`, `{foo: 1, baz: 3}`\n\n2.  _schema_:\n\n    ```javascript\n    {\n      type: \"object\",\n      properties: {\n        foo: {type: \"number\"}\n      },\n      patternProperties: {\n        \"^.*r$\": {type: \"number\"}\n      },\n      additionalProperties: {type: \"string\"}\n    }\n    ```\n\n    _valid_: `{}`, `{a: \"b\"}`, `{foo: 1}`, `{foo: 1, bar: 2}`, `{foo: 1, bar: 2, a: \"b\"}`\n\n    _invalid_: `{a: 3}`, `{foo: 1, baz: 3}`\n\n3.  _schema_:\n\n    ```javascript\n    {\n      type: \"object\",\n      properties: {\n        foo: {type: \"number\"}\n      },\n      additionalProperties: false,\n      anyOf: [\n        {\n          properties: {\n            bar: {type: \"number\"}\n          }\n        },\n        {\n          properties: {\n            baz: {type: \"number\"}\n          }\n        }\n      ]\n    }\n    ```\n\n    _valid_: `{}`, `{foo: 1}`\n\n    _invalid_: `{bar: 2}`, `{baz: 3}`, `{foo: 1, bar: 2}`, etc.\n\n### `dependencies` <Badge text=\"deprecated in draft 2019-09\" type=\"warning\" />\n\nThis keyword is deprecated. The same functionality is available with keywords `dependentRequired` and `dependentSchemas`.\n\nThe value of the keyword is a map with keys equal to data object properties. Each value in the map should be either an array of unique property names (\"property dependency\" - see [`dependentRequired`](#`dependentrequired`) keyword) or a JSON Schema (\"schema dependency\" - see [`dependentSchemas`](#`dependentschemas`) keyword).\n\nFor property dependency, if the data object contains a property that is a key in the keyword value, then to be valid the data object should also contain all properties from the array of properties.\n\nFor schema dependency, if the data object contains a property that is a key in the keyword value, then to be valid the data object itself (NOT the property value) should be valid according to the schema.\n\n**Examples**\n\n1.  _schema (property dependency)_:\n\n    ```javascript\n    {\n      type: \"object\",\n      dependencies: {\n        foo: [\"bar\", \"baz\"]\n      }\n    }\n    ```\n\n    _valid_: `{foo: 1, bar: 2, baz: 3}`, `{}`, `{a: 1}`\n\n    _invalid_: `{foo: 1}`, `{foo: 1, bar: 2}`, `{foo: 1, baz: 3}`\n\n2.  _schema (schema dependency)_:\n\n    ```javascript\n    {\n      type: \"object\",\n      dependencies: {\n        foo: {\n          properties: {\n            bar: {type: \"number\"}\n          }\n        }\n      }\n    }\n    ```\n\n    _valid_: `{}`, `{foo: 1}`, `{foo: 1, bar: 2}`, `{a: 1}`\n\n    _invalid_: `{foo: 1, bar: \"a\"}`\n\n### `dependentRequired` <Badge text=\"NEW: draft 2019-09\" />\n\nThe value of this keyword should be a map with keys equal to data object properties. Each value in the map should be an array of unique property names.\n\nIf the data object contains a property that is a key in the keyword value, then to be valid the data object should also contain all properties from the corresponding array of properties in this keyword.\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"object\",\n  dependentRequired: {\n    foo: [\"bar\", \"baz\"]\n  }\n}\n```\n\n_valid_: `{foo: 1, bar: 2, baz: 3}`, `{}`, `{a: 1}`\n\n_invalid_: `{foo: 1}`, `{foo: 1, bar: 2}`, `{foo: 1, baz: 3}`\n\n### `dependentSchemas` <Badge text=\"NEW: draft 2019-09\" />\n\nThe value of the keyword should be a map with keys equal to data object properties. Each value in the map should be a JSON Schema.\n\nIf the data object contains a property that is a key in the keyword value, then to be valid the data object itself (NOT the property value) should be valid according to the corresponding schema in this keyword.\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"object\",\n  dependentSchemas: {\n    foo: {\n      properties: {\n        bar: {type: \"number\"}\n      }\n    }\n  }\n}\n```\n\n_valid_: `{}`, `{foo: 1}`, `{foo: 1, bar: 2}`, `{a: 1}`\n\n_invalid_: `{foo: 1, bar: \"a\"}`\n\n### `propertyNames`\n\nThe value of this keyword is a JSON Schema.\n\nFor data object to be valid each property name in this object should be valid according to this schema.\n\n**Example**\n\n_schema_ (requires `email` format from [ajv-formats](https://github.com/ajv-validator/ajv-formats)):\n\n```javascript\n{\n  type: \"object\",\n  propertyNames: {\n    format: \"email\"\n  }\n}\n```\n\n_valid_: `{\"foo@bar.com\": \"any\", \"bar@bar.com\": \"any\"}`\n\n_invalid_: `{foo: \"any value\"}`\n\n### `unevaluatedProperties` <Badge text=\"NEW: draft 2019-09\" />\n\nThe value of this keyword is a JSON Schema (can be a boolean).\n\nThis schema will be applied to all properties that were not evaluated by other keywords for properties (`properties`, `patternProperties` and `additionalProperties`) in the current schema and all sub-schemas that were valid for this data instance. It includes:\n\n- all subschemas schemas in `allOf` and `$ref` keywords\n- valid sub-schemas in `oneOf` and `anyOf` keywords\n- sub-schema in `if` keyword\n- sub-schemas in `then` or `else` keywords that were applied based on the validation result by `if` keyword.\n\nSome user-defined keywords can also make properties \"evaluated\".\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"object\",\n  required: [\"foo\"],\n  properties: {foo: {type: \"number\"}},\n  unevaluatedProperties: false,\n  anyOf: [\n    {\n      required: [\"bar\"],\n      properties: {bar: {type: \"number\"}}\n    }\n    {\n      required: [\"baz\"],\n      properties: {baz: {type: \"number\"}}\n    }\n  ]\n}\n```\n\n_valid_: `{foo: 1, bar: 2}`, `{foo: 1, baz: 2}`, `{foo: 1, bar: 2, baz: 3}`\n\n_invalid_:\n\n- `{foo: 1}` - neither `bar` nor `baz` are present\n- `{foo: 1, bar: 2, boo: 3}` - `boo` is unevaluated\n- `{foo: 1, bar: 2, baz: \"3\"}` - not valid against the 2nd subschema, so `baz` is \"unevaluated\".\n\nSee [tests](https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft2019-09/unevaluatedProperties.json) for `unevaluatedProperties` keyword for other examples.\n\n### discriminator <Badge text=\"NEW: OpenAPI\" />\n\nAjv has a limited support for `discriminator` keyword: to optimize validation, error handling, and [modifying data](./guide/modifying-data.md) with [oneOf](#oneof) keyword.\n\nIts value should be an object with a property `propertyName` - the name of the property used to discriminate between union members.\n\nWhen using discriminator keyword only one subschema in `oneOf` will be used, determined by the value of discriminator property.\n\n::: warning Use option discriminator\nTo use `discriminator` keyword you have to use option `discriminator: true` with Ajv constructor - it is not enabled by default.\n:::\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"object\",\n  discriminator: {propertyName: \"foo\"},\n  required: [\"foo\"],\n  oneOf: [\n    {\n      properties: {\n        foo: {const: \"x\"},\n        a: {type: \"string\"},\n      },\n      required: [\"a\"],\n    },\n    {\n      properties: {\n        foo: {enum: [\"y\", \"z\"]},\n        b: {type: \"string\"},\n      },\n      required: [\"b\"],\n    },\n  ],\n}\n```\n\n_valid_: `{foo: \"x\", a: \"any\"}`, `{foo: \"y\", b: \"any\"}`, `{foo: \"z\", b: \"any\"}`\n\n_invalid_:\n\n- `{}`, `{foo: 1}` - discriminator tag must be string\n- `{foo: \"bar\"}` - discriminator tag value must be in oneOf subschema\n- `{foo: \"x\", b: \"b\"}`, `{foo: \"y\", a: \"a\"}` - invalid object\n\nFrom the perspective of validation result `discriminator` is defined as no-op (that is, removing discriminator will not change the validity of the data), but errors reported in case of invalid data will be different.\n\nThere are following requirements and limitations of using `discriminator` keyword:\n- `mapping` in discriminator object is not supported.\n- [oneOf](#oneof) keyword must be present in the same schema.\n- discriminator property should be [required](#required) either on the top level, as in the example, or in all `oneOf` subschemas.\n- each `oneOf` subschema must have [properties](#properties) keyword with discriminator property. The subschemas should be either inlined or included as direct references (only `$ref` keyword without any extra keywords is allowed). \n- schema for discriminator property in each `oneOf` subschema must be [const](#const) or [enum](#enum), with unique values across all subschemas.\n\nNot meeting any of these requirements would fail schema compilation.\n\n## Keywords for all types\n\n### `enum`\n\nThe value of the keyword should be an array of unique items of any types. The data is valid if it is deeply equal to one of items in the array.\n\n**Example**\n\n_schema_: `{enum: [2, \"foo\", {foo: \"bar\" }, [1, 2, 3]]}`\n\n_valid_: `2`, `\"foo\"`, `{foo: \"bar\"}`, `[1, 2, 3]`\n\n_invalid_: `1`, `\"bar\"`, `{foo: \"baz\"}`, `[1, 2, 3, 4]`, any value not in enum\n\n### `const`\n\nThe value of this keyword can be anything. The data is valid if it is deeply equal to the value of the keyword.\n\n**Example**\n\n_schema_: `{const: \"foo\"}`\n\n_valid_: `\"foo\"`\n\n_invalid_: any other value\n\nThe same can be achieved with `enum` keyword using the array with one item. But `const` keyword is more than just a syntax sugar for `enum`. In combination with the [$data reference](./guide/combining-schemas.md#data-reference) it allows to define equality relations between different parts of the data. This cannot be achieved with `enum` keyword even with `$data` reference because `$data` cannot be used in place of one item - it can only be used in place of the whole array in `enum` keyword.\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"object\",\n  properties: {\n    foo: {type: \"number\"},\n    bar: {const: {$data: \"1/foo\"}}\n  }\n}\n```\n\n_valid_: `{foo: 1, bar: 1}`, `{}`\n\n_invalid_: `{foo: 1}`, `{bar: 1}`, `{foo: 1, bar: 2}`\n\n## Compound keywords\n\n### `not`\n\nThe value of the keyword should be a JSON Schema. The data is valid if it is invalid according to this schema.\n\n**Example**\n\n_schema_: `{type: \"number\", not: {minimum: 3}}`\n\n_valid_: `1`, `2`\n\n_invalid_: `3`, `4`\n\n### `oneOf`\n\nThe value of the keyword should be an array of JSON Schemas. The data is valid if it matches exactly one JSON Schema from this array. Validators have to validate data against all schemas to establish validity according to this keyword.\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"number\",\n  oneOf: [{maximum: 3}, {type: \"integer\"}]\n}\n```\n\n_valid_: `1.5`, `2.5`, `4`, `5`\n\n_invalid_: `2`, `3`, `4.5`, `5.5`\n\n### `anyOf`\n\nThe value of the keyword should be an array of JSON Schemas. The data is valid if it is valid according to one or more JSON Schemas in this array. Validators only need to validate data against schemas in order until the first schema matches (or until all schemas have been tried). For this reason validating against this keyword is faster than against \"oneOf\" keyword in most cases.\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"number\",\n  anyOf: [{maximum: 3}, {type: \"integer\"}]\n}\n```\n\n_valid_: `1.5`, `2`, `2.5`, `3`, `4`, `5`\n\n_invalid_: `4.5`, `5.5`\n\n### `allOf`\n\nThe value of the keyword should be an array of JSON Schemas. The data is valid if it is valid according to all JSON Schemas in this array.\n\n**Example**\n\n_schema_:\n\n```javascript\n{\n  type: \"number\",\n  allOf: [{maximum: 3}, {type: \"integer\"}]\n}\n```\n\n_valid_: `2`, `3`\n\n_invalid_: `1.5`, `2.5`, `4`, `4.5`, `5`, `5.5`\n\n### `if`/`then`/`else`\n\nThese keywords allow to implement conditional validation. Their values should be valid JSON Schemas (object or boolean).\n\nIf `if` keyword is absent, the validation succeeds.\n\nIf the data is valid against the sub-schema in `if` keyword, then the validation result is equal to the result of data validation against the sub-schema in `then` keyword (if `then` is absent, the validation succeeds).\n\nIf the data is invalid against the sub-schema in `if` keyword, then the validation result is equal to the result of data validation against the sub-schema in `else` keyword (if `else` is absent, the validation succeeds).\n\n**Examples**\n\n1.  _schema_:\n\n    ```javascript\n    {\n      type: \"object\",\n      if: {properties: {foo: {minimum: 10}}},\n      then: {required: [\"bar\"]},\n      else: {required: [\"baz\"]}\n    }\n    ```\n\n    _valid_:\n\n    - `{foo: 10, bar: true }`\n    - `{}`\n    - `{foo: 1, baz: true }`\n\n    _invalid_:\n\n    - `{foo: 10}` (`bar` is required)\n    - `{foo: 10, baz: true }` (`bar` is required)\n    - `{foo: 1}` (`baz` is required)\n\n2)  _schema_:\n\n    ```javascript\n    {\n      type: \"integer\",\n      minimum: 1,\n      maximum: 1000,\n      if: {minimum: 100},\n      then: {multipleOf: 100},\n      else: {\n        if: {minimum: 10},\n        then: {multipleOf: 10}\n      }\n    }\n    ```\n\n    _valid_: `1`, `5`, `10`, `20`, `50`, `100`, `200`, `500`, `1000`\n\n    _invalid_:\n\n    - `-1`, `0` (<1)\n    - `2000` (>1000)\n    - `11`, `57`, `123` (any integer with more than one non-zero digit)\n    - non-integers\n\n## Metadata keywords\n\nJSON Schema specification defines several metadata keywords that describe the schema itself but do not perform any validation.\n\n- `title` and `description`: information about the data represented by that schema\n- `$comment`: information for developers. With option `$comment` Ajv logs or passes the comment string to the user-supplied function. See [Options](./api.md#options).\n- `default`: a default value of the data instance, see [Assigning defaults](./guide/modifying-data.md#assigning-defaults).\n- `examples`: an array of data instances. Ajv does not check the validity of these instances against the schema.\n- `readOnly` and `writeOnly`: marks data-instance as read-only or write-only in relation to the source of the data (database, api, etc.).\n- `contentEncoding`: [RFC 2045](https://tools.ietf.org/html/rfc2045#section-6.1), e.g., \"base64\".\n- `contentMediaType`: [RFC 2046](https://datatracker.ietf.org/doc/rfc2046/), e.g., \"image/png\".\n\n::: warning Ignored keywords\nAjv does not implement validation of the keywords `examples`, `contentEncoding` and `contentMediaType` but it reserves them. If you want to create a plugin that implements any of them, it should remove these keywords from the instance.\n:::\n"
  },
  {
    "path": "docs/json-type-definition.md",
    "content": "# JSON Type Definition\n\nThis document informally describes JSON Type Definition (JTD) specification to help Ajv users to start using it. For formal definition please refer to [RFC8927](https://datatracker.ietf.org/doc/rfc8927/). Please report any contradictions in this document with the specification.\n\nTo use JTD schemas you need to import a different Ajv class:\n\n<code-group>\n<code-block title=\"JavaScript\">\n```javascript\nconst Ajv = require(\"ajv/dist/jtd\")\nconst ajv = new Ajv()\n```\n</code-block>\n\n<code-block title=\"TypeScript\">\n```typescript\nimport Ajv from \"ajv/dist/jtd\"\nconst ajv = new Ajv()\n```\n</code-block>\n</code-group>\n\n[[toc]]\n\n## JTD schema forms\n\nJTD specification defines 8 different forms that the schema for JSON can take for one of most widely used data types in JSON messages (API requests and responses).\n\nAll forms require that:\n\n- schema is an object with different members, depending on the form\n- each form can have:\n  - an optional member `nullable` with a boolean value that allows data instance to be JSON `null`.\n  - an optional member `metadata` with an object value that allows to pass any additional information or extend the specification (Ajv defines keyword \"union\" that can be used inside `metadata`)\n\nRoot schema can have member `definitions` that has a dictionary of schemas that can be references from any other schemas using form `ref`\n\n### Type form <Badge text=\"primitive values\" />\n\nThis form defines a primitive value.\n\nIt has a required member `type` and an optional members `nullable` and `metadata`, no other members are allowed.\n\n`type` can have one of the following values:\n\n- `\"string\"` - defines a string\n- `\"boolean\"` - defines boolean value `true` or `false`\n- `\"timestamp\"` - defines timestamp ( accepting either an [RFC3339](https://datatracker.ietf.org/doc/rfc3339/) JSON string or a Date object, configurable via the `timestamp` Ajv option)\n- `type` values that define integer numbers:\n  - `\"int8\"` - signed byte value (-128 .. 127)\n  - `\"uint8\"` - unsigned byte value (0 .. 255)\n  - `\"int16\"` - signed word value (-32768 .. 32767),\n  - `\"uint16\"` - unsigned word value (0 .. 65535)\n  - `\"int32\"` - signed 32-bit integer value\n  - `\"uint32\"` - unsigned 32-bit integer value\n- `type` values that define floating point numbers:\n  - `\"float32\"` - 32-bit real number\n  - `\"float64\"` - 64-bit real number\n\nUnlike JSON Schema, JTD does not allow defining values that can take one of several types, but they can be defined as `nullable`.\n\n**Example**\n\n```javascript\n{\n  type: \"string\"\n}\n```\n\n### Enum form\n\nThis form defines a string that can take one of the values from the list (the values in the list must be unique).\n\nIt has a required member `enum` and optional members `nullable` and `metadata`, no other members are allowed.\n\nUnlike JSON Schema, JTD does not allow defining `enum` with values of any other type than string.\n\n**Example**\n\n```javascript\n{\n  enum: [\"foo\", \"bar\"]\n}\n```\n\n### Elements form <Badge text=\"arrays\" />\n\nThis form defines a homogenous array of any size (possibly empty) with the elements that satisfy a given schema.\n\nIt has a required member `elements` (schema that elements should satisfy) and optional members `nullable` and `metadata`, no other members are allowed.\n\nUnlike JSON Schema, the data instance must be JSON array (without using additional `type` keyword), and there is no way to enforce the restrictions that cannot be present on type level of most languages, such as array size and uniqueness of items.\n\n**Example**\n\nSchema:\n\n```javascript\n{\n  elements: {\n    type: \"string\"\n  }\n}\n```\n\nValid data: `[]`, `[\"foo\"]`, `[\"foo\", \"bar\"]`\n\nInvalid data: `[\"foo\", 1]`, any type other than array\n\n### Properties form <Badge text=\"objects\" />\n\nThis form defines record (JSON object) that has defined required and optional properties.\n\nIt is required that this form has either `properties` member, or `optionalProperties`, or both, in which case the cannot have overlapping properties. Additional properties can be allowed by adding an optional boolean member `additionalProperties` with a value `true`. This form, as all other, can have optional `nullable` and `metadata` members.\n\nUnlike JSON Schema, all properties defined in `properties` schema member are required, the data instance must be JSON object (without using additional `type` keyword) and by default additional properties are not allowed (with the exception of discriminator tag - see the next section). This strictness minimises user mistakes.\n\n**Example 1.**\n\nSchema:\n\n```javascript\n{\n  properties: {\n    foo: {\n      type: \"string\"\n    }\n  }\n}\n```\n\nValid data: `{foo: \"bar\"}`\n\nInvalid data: `{}`, `{foo: 1}`, `{foo: \"bar\", bar: 1}`, any type other than object\n\n**Example 2.**\n\nSchema:\n\n```javascript\n{\n  properties: {\n    foo: {type: \"string\"}\n  },\n  optionalProperties: {\n    bar: {enum: [\"1\", \"2\"]}\n  },\n  additionalProperties: true\n}\n```\n\nValid data: `{foo: \"bar\"}`, `{foo: \"bar\", bar: \"1\"}`, `{foo: \"bar\", additional: 1}`\n\nInvalid data: `{}`, `{foo: 1}`, `{foo: \"bar\", bar: \"3\"}`, any type other than object\n\n**Example 3: invalid schema (overlapping required and optional properties)**\n\n```javascript\n{\n  properties: {\n    foo: {type: \"string\"}\n  },\n  optionalProperties: {\n    foo: {type: \"string\"}\n  }\n}\n```\n\n### Discriminator form <Badge text=\"tagged union\" />\n\nThis form defines discriminated (tagged) union of different record types.\n\nIt has required members `discriminator` and `mapping` and optional members `nullable` and `metadata`, no other members are allowed.\n\nThe string value of `discriminator` schema member contains the name of the data member that is the tag of the union. `mapping` schema member contains the dictionary of schemas that are applied according to the value of the tag member in the data. Schemas inside `mapping` must have \"properties\" form.\n\nProperties forms inside `mapping` cannot be `nullable` and cannot define the same property as discriminator tag.\n\n**Example 1.**\n\nSchema:\n\n```javascript\n{\n  discriminator: \"version\",\n  mapping: {\n    \"1\": {\n      properties: {\n        foo: {type: \"string\"}\n      }\n    },\n    \"2\": {\n      properties: {\n        foo: {type: \"uint8\"}\n      }\n    }\n  }\n}\n```\n\nValid data: `{version: \"1\", foo: \"1\"}`, `{version: \"2\", foo: 1}`\n\nInvalid data: `{}`, `{foo: \"1\"}`, `{version: 1, foo: \"1\"}`, any type other than object\n\n**Example 3: invalid schema (discriminator tag member defined in mapping)**\n\n```javascript\n{\n  discriminator: \"version\",\n  mapping: {\n    \"1\": {\n      properties: {\n        version: {enum: [\"1\"]},\n        foo: {type: \"string\"}\n      }\n    },\n    \"2\": {\n      properties: {\n        version: {enum: [\"2\"]},\n        foo: {type: \"uint8\"}\n      }\n    }\n  }\n}\n```\n\n### Values form <Badge text=\"dictionary\" />\n\nThis form defines a homogenous dictionary where the values of members satisfy a given schema.\n\nIt has a required member `values` (schema that member values should satisfy) and optional members `nullable` and `metadata`, no other members are allowed.\n\nUnlike JSON Schema, the data instance must be JSON object (without using additional `type` keyword), and there is no way to enforce size restrictions.\n\n**Example**\n\nSchema:\n\n```javascript\n{\n  values: {\n    type: \"uint8\"\n  }\n}\n```\n\nValid data: `{}`, `{\"foo\": 1}`, `{\"foo\": 1, \"bar\": 2}`\n\nInvalid data: `{\"foo\": \"bar\"}`, any type other than object\n\n### Ref form <Badge text=\"reference definitions\" />\n\nThis form defines a reference to the schema that is present in the corresponding key in the `definitions` member of the root schema.\n\nIt has a required member `ref` (member of `definitions` object in the root schema) and optional members `nullable` and `metadata`, no other members are allowed.\n\nUnlike JSON Schema, JTD does not allow to reference:\n\n- any schema fragment other than root level `definitions` member\n- root of the schema - there is another way to define a self-recursive schema (see Example 2)\n- another schema file (but you can still combine schemas from multiple files using JavaScript).\n\n**Example 1.**\n\n```javascript\n{\n  properties: {\n    propFoo: {ref: \"foo\", nullable: true}\n  },\n  definitions: {\n    foo: {type: \"string\"}\n  }\n}\n```\n\n**Example 2: self-referencing schema for binary tree**\n\n```javascript\n{\n  ref: \"tree\",\n  definitions: {\n    tree: {\n      properties: {\n        value: {type: \"int32\"}\n      },\n      optionalProperties: {\n        left: {ref: \"tree\"},\n        right: {ref: \"tree\"}\n      }\n    }\n  }\n}\n```\n\n**Example 3: invalid schema (missing reference)**\n\n```javascript\n{\n  ref: \"foo\",\n  definitions: {\n    bar: {type: \"string\"}\n  }\n}\n```\n\n### Empty form <Badge text=\"any data\" />\n\nEmpty JTD schema defines the data instance that can be of any type, including JSON `null` (even if `nullable` member is not present). It cannot have any member other than `nullable` and `metadata`.\n\n## JTDSchemaType\n\nThe type `JTDSchemaType` can be used to validate that the written schema matches the type you expect to validate. This type is strict such that if typescript compiles, you should require no further type guards. The downside of this is that the types that `JTDSchemaType` can verify are limited to the types that JTD can verify. If a type doesn't verify, `JTDSchemaType` should resolve to `never`, throwing an error when you try to assign to it. This means that types like `1 | 2 | 3`, or general untagged unions (outside of unions of string literals) cannot be used with `JTDSchemaType`.\n\n### Most Schemas\n\nMost straightforward types should work with `JTDSchemaType`, e.g.\n\n```typescript\ninterface MyType {\n  num: number\n  optionalStr?: string\n  nullableEnum: \"v1.0\" | \"v1.2\" | null\n  values: Record<string, number>\n}\n\nconst schema: JTDSchemaType<MyType> = {\n  properties: {\n    num: {type: \"float64\"},\n    nullableEnum: {enum: [\"v1.0\", \"v1.2\"], nullable: true},\n    values: {values: {type: \"int32\"}},\n  },\n  optionalProperties: {\n    optionalStr: {type: \"string\"},\n  },\n}\n```\n\nwill compile. Using `schema` with AJV will guarantee type safety.\n\n### Ref Schemas\n\nRef schemas are a little more advanced, because the types of every definition must be specified in advance.\nA simple ref schema is relatively straightforward:\n\n```typescript\nconst schema: JTDSchemaType<{val: number}, {num: number}> = {\n  definitions: {\n    num: {type: \"float64\"},\n  },\n  properties: {\n    val: {ref: \"num\"},\n  },\n}\n```\n\nnote that the type of all definitions was included as a second argument to `JTDSchemaType`.\n\nThis also works for recursive schemas:\n\n```typescript\ntype LinkedList = {val: number; next?: LinkedList}\nconst schema: JTDSchemaType<LinkedList, {node: LinkedList}> = {\n  definitions: {\n    node: {\n      properties: {\n        val: {type: \"float64\"},\n      },\n      optionalProperties: {\n        next: {ref: \"node\"},\n      },\n    },\n  },\n  ref: \"node\",\n}\n```\n\n### Notable Omissions\n\n`JTDSchemaType` currently validates that if the schema compiles it will verify an accurate type, but there are a few places with potentially unexpected behavior.\n`JTDSchemaType` doesn't verify the schema is correct. It won't reject schemas that definitions anywhere by the root, and it won't reject discriminator schemas that still define the descriminator in mapping properties. It also won't verify that enum schemas have every enum member as this isn't generally feasible in typescript yet.\n\n## Extending JTD\n\n### Metadata schema member\n\nEach schema form may have an optional member `metadata` that JTD reserves for implementation/application specific extensions. Ajv uses this member as a location where any non-standard keywords can be used, such as:\n\n- `union` keyword included in Ajv\n- any user-defined keywords, for example keywords defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package\n- JSON Schema keywords, as long as their names are different from standard JTD keywords. It can be used to enable a gradual migration from JSON Schema to JTD, should it be required.\n\n::: warning Extensions are non-portable\nAjv-specific extension to JTD are likely to be unsupported by other tools, so while it may simplify adoption, it undermines the cross-platform objective of using JTD. While it is ok to put some human readable information in `metadata` member, it is recommended not to add any validation logic there (even if it is supported by Ajv).\n:::\n\nAdditional restrictions that Ajv enforces on `metadata` schema member:\n\n- you cannot use standard JTD keywords there. While strictly speaking it is allowed by the specification, these keywords should be ignored inside `metadata` - the general approach of Ajv is to avoid anything that is ignored.\n- you need to define all members used in `metadata` as keywords. If they are no-op it can be done with `ajv.addKeyword(\"my-metadata-keyword\")`. This restriction can be removed by disabling [strict mode](https://github.com/ajv-validator/ajv/blob/master/docs/strict-mode.md), without affecting the strictness of JTD - unknown keywords would still be prohibited in the schema itself.\n\n### Union keyword\n\nAjv defines `union` keyword that is used in the schema that validates JTD schemas ([meta-schema](https://github.com/ajv-validator/ajv/blob/master/lib/refs/jtd-schema.ts)).\n\nThis keyword can be used only inside `metadata` schema member.\n\n::: warning Union keyword is non-portable\nThis keyword is non-standard and it is not supported in other JTD tools, so it is recommended NOT to use this keyword in schemas for your data if you want them to be cross-platform.\n:::\n\n### User-defined keywords\n\nAny user-defined keywords that can be used in JSON Schema schemas can also be used in JTD schemas, including the keywords in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package.\n\n::: warning User-defined keywords are non-portable\nIt is strongly recommended to only use it to simplify migration from JSON Schema to JTD and not to use non-standard keywords in the new schemas, as these keywords are not supported by any other tools.\n:::\n\n::: warning Parsing does NOT support non-standard JTD keywords\ncompileParser method does not support non-standard JTD keywords, you will have to use JSON.parse and then validates.\n:::\n\n## Validation errors\n\nTODO\n"
  },
  {
    "path": "docs/keywords.md",
    "content": "# User defined keywords\n\n[[toc]]\n\n## Common attributes of keyword definitions\n\nThe usual interface to define all keywords has these properties:\n\n```typescript\ninterface _KeywordDef {\n  keyword: string | string[]\n  type?: JSONType | JSONType[] // data type(s) that keyword applies to,\n  // if defined, it is usually \"string\", \"number\", \"object\" or \"array\"\n  schemaType?: JSONType | JSONType[] // the allowed type(s) of value that keyword must have in the schema\n  error?: {\n    message: string | ((cxt: KeywordCxt) => Code)\n    params?: (cxt: KeywordCxt) => Code\n  }\n}\n```\n\nKeyword definitions may have additional optional properties - see [types](https://github.com/ajv-validator/ajv/blob/master/lib/types/index.ts) and [KeywordCxt](https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate/index.ts).\n\n### Define keyword with code generation function <Badge text=\"recommended\" />\n\nStarting from v7 Ajv uses [CodeGen module](https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen/index.ts) for all pre-defined keywords - see [codegen.md](./codegen.md) for details.\n\nThis is the best approach for user defined keywords:\n\n- safe against code injection\n- best performance\n- the precise control over validation process\n- access to the parent data and the path to the currently validated data\n\nWhile Ajv can be safely used with plain JavaScript, it is strongly recommended to use Typescript for user-defined keywords that generate code - the prevention against code injection via untrusted schemas is partially based on the type system, not only on runtime checks.\n\nThe usual keyword definition for keywords generating code extends common interface with \"code\" function:\n\n```typescript\ninterface CodeKeywordDefinition extends _KeywordDef {\n  code: (cxt: KeywordCxt, ruleType?: string) => void // code generation function\n}\n```\n\nExample `even` keyword:\n\n```typescript\nimport {_, KeywordCxt} from Ajv\n\najv.addKeyword({\n  keyword: \"even\",\n  type: \"number\",\n  schemaType: \"boolean\",\n  // $data: true // to support [$data reference](./guide/combining-schemas.md#data-reference), ...\n  code(cxt: KeywordCxt) {\n    const {data, schema} = cxt\n    const op = schema ? _`!==` : _`===`\n    cxt.fail(_`${data} %2 ${op} 0`) // ... the only code change needed is to use `cxt.fail$data` here\n  },\n})\n\nconst schema = {even: true}\nconst validate = ajv.compile(schema)\nconsole.log(validate(2)) // true\nconsole.log(validate(3)) // false\n```\n\nExample `range` keyword:\n\n```typescript\nimport {_, nil, KeywordCxt} from Ajv\n\najv.addKeyword({\n  keyword: \"range\",\n  type: \"number\",\n  code(cxt: KeywordCxt) {\n    const {schema, parentSchema, data} = cxt\n    const [min, max] = schema\n    const eq: Code = parentSchema.exclusiveRange ? _`=` : nil\n    cxt.fail(_`${data} <${eq} ${min} || ${data} >${eq} ${max}`)\n  },\n  metaSchema: {\n    type: \"array\",\n    items: [{type: \"number\"}, {type: \"number\"}],\n    minItems: 2,\n    additionalItems: false,\n  },\n})\n```\n\nYou can review pre-defined Ajv keywords in [validation](https://github.com/ajv-validator/ajv/blob/master/lib/validation) folder for more advanced examples - it is much easier to define code generation keywords than it was in the previous version of Ajv.\n\nSee [KeywordCxt](https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate/index.ts) and [SchemaCxt](https://github.com/ajv-validator/ajv/blob/master/lib/compile/index.ts) type definitions for more information about properties you can use in your keywords.\n\n### Define keyword with \"validate\" function\n\nUsual keyword definition for validation keywords:\n\n```typescript\ninterface FuncKeywordDefinition extends _KeywordDef {\n  validate?: SchemaValidateFunction | DataValidateFunction // DataValidateFunction requires `schema: false` option\n  schema?: boolean // schema: false makes validate not to expect schema (DataValidateFunction)\n  modifying?: boolean\n  async?: boolean\n  valid?: boolean\n  errors?: boolean | \"full\"\n}\n\ninterface SchemaValidateFunction {\n  (schema: any, data: any, parentSchema?: AnySchemaObject, dataCxt?: DataValidationCxt):\n    | boolean\n    | Promise<any>\n  errors?: Partial<ErrorObject>[]\n}\n\ninterface DataValidateFunction {\n  (this: Ajv | any, data: any, dataCxt?: DataValidationCxt): boolean | Promise<any>\n  errors?: Partial<ErrorObject>[]\n}\n```\n\nThe function should return validation result as boolean. It can return an array of validation errors via `.errors` property of itself (otherwise a standard error will be used).\n\n`validate` keywords are suitable for:\n\n- testing your keywords before converting them to compiled/code keywords\n- defining keywords that do not depend on the schema value (e.g., when the value is always `true`). In this case you can add option `schema: false` to the keyword definition and the schemas won't be passed to the validation function, it will only receive the same parameters as compiled validation function.\n- defining keywords where the schema is a value used in some expression.\n- defining keywords that support [\\$data reference](./guide/combining-schemas.md#data-reference) - in this case `validate` or `code` function is required, either as the only option or in addition to `compile` or `macro`.\n\nExample: `constant` keyword (a synonym for draft-06 keyword `const`, it is equivalent to `enum` keyword with one item):\n\n```javascript\najv.addKeyword({\n  keyword: \"constant\",\n  validate: (schema, data) =>\n    typeof schema == \"object\" && schema !== null ? deepEqual(schema, data) : schema === data,\n  errors: false,\n})\n\nconst schema = {\n  constant: 2,\n}\nconst validate = ajv.compile(schema)\nconsole.log(validate(2)) // true\nconsole.log(validate(3)) // false\n\nconst schema = {\n  constant: {foo: \"bar\"},\n}\nconst validate = ajv.compile(schema)\nconsole.log(validate({foo: \"bar\"})) // true\nconsole.log(validate({foo: \"baz\"})) // false\n```\n\n`const` keyword is already available in Ajv.\n\n::: tip Keywords that do not define errors\nIf the keyword does not define errors (see [Reporting errors](./api.md#reporting-errors)) pass `errors: false` in its definition; it will make generated code more efficient.\n:::\n\nTo add asynchronous keyword pass `async: true` in its definition.\n\n### Define keyword with \"compile\" function\n\nThe keyword is similar to \"validate\", with the difference that \"compile\" property has function that will be called during schema compilation and should return validation function:\n\n```typescript\ninterface FuncKeywordDefinition extends _KeywordDef {\n  compile?: (schema: any, parentSchema: AnySchemaObject, it: SchemaObjCxt) => DataValidateFunction\n  schema?: boolean // schema: false makes validate not to expect schema (DataValidateFunction)\n  modifying?: boolean\n  async?: boolean\n  valid?: boolean\n  errors?: boolean | \"full\"\n}\n```\n\nIn some cases it is the best approach to define keywords, but it has the performance cost of an extra function call during validation. If keyword logic can be expressed via some other JSON Schema then `macro` keyword definition is more efficient (see below).\n\nExample. `range` and `exclusiveRange` keywords using compiled schema:\n\n```javascript\najv.addKeyword({\n  keyword: \"range\",\n  type: \"number\",\n  compile([min, max], parentSchema) {\n    return parentSchema.exclusiveRange === true\n      ? (data) => data > min && data < max\n      : (data) => data >= min && data <= max\n  },\n  errors: false,\n  metaSchema: {\n    // schema to validate keyword value\n    type: \"array\",\n    items: [{type: \"number\"}, {type: \"number\"}],\n    minItems: 2,\n    additionalItems: false,\n  },\n})\n\nconst schema = {\n  range: [2, 4],\n  exclusiveRange: true,\n}\nconst validate = ajv.compile(schema)\nconsole.log(validate(2.01)) // true\nconsole.log(validate(3.99)) // true\nconsole.log(validate(2)) // false\nconsole.log(validate(4)) // false\n```\n\nSee note on errors and asynchronous keywords in the previous section.\n\n### Define keyword with \"macro\" function\n\nKeyword definition:\n\n```typescript\ninterface MacroKeywordDefinition extends FuncKeywordDefinition {\n  macro: (schema: any, parentSchema: AnySchemaObject, it: SchemaCxt) => AnySchema\n}\n```\n\n\"Macro\" function is called during schema compilation. It is passed schema, parent schema and [schema compilation context](#schema-compilation-context) and it should return another schema that will be applied to the data in addition to the original schema.\n\nIt is an efficient approach (in cases when the keyword logic can be expressed with another JSON Schema), because it is usually easy to implement and there is no extra function call during validation.\n\nIn addition to the errors from the expanded schema macro keyword will add its own error in case validation fails.\n\nExample. `range` and `exclusiveRange` keywords from the previous example defined with macro:\n\n```javascript\najv.addKeyword({\n  keyword: \"range\",\n  type: \"number\",\n  macro: ([minimum, maximum]) => ({minimum, maximum}), // schema with keywords minimum and maximum\n  // metaSchema: the same as in the example above\n})\n```\n\nMacro keywords can be recursive - i.e. return schemas containing the same keyword. See the example of defining a recursive macro keyword `deepProperties` in the [test](https://github.com/ajv-validator/ajv/blob/master/spec/keyword.spec.ts#L316).\n\n## Schema compilation context\n\nSchema compilation context [SchemaCxt](https://github.com/ajv-validator/ajv/blob/master/lib/compile/index.ts) is available in property `it` of [KeywordCxt](https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate/index.ts) (and it is also the 3rd parameter of `compile` and `macro` keyword functions). See types in the source code on the properties you can use in this object.\n\n## Validation time variables\n\nAll function scoped variables available during validation are defined in [names](https://github.com/ajv-validator/ajv/blob/master/lib/compile/names.ts).\n\n## Reporting errors\n\nAll keywords can define error messages with `KeywordErrorDefinition` object passed as `error` property of keyword definition:\n\n```typescript\ninterface KeywordErrorDefinition {\n  message: string | ((cxt: KeywordErrorCxt) => Code)\n  params?: (cxt: KeywordErrorCxt) => Code\n}\n```\n\n`code` keywords can pass parameters to these functions via `cxt.setParams` (see implementations of pre-defined keywords), other keywords can only set a string message this way.\n\nAnother approach for reporting errors can be used for `validate` and `compile` keyword - they can define errors by assigning them to `.errors` property of the validation function. Asynchronous keywords can return promise that rejects with `new Ajv.ValidationError(errors)`, where `errors` is an array of validation errors (if you don't want to create errors in asynchronous keyword, its validation function can return the promise that resolves with `false`).\n\nEach error object in `errors` array should at least have properties `keyword`, `message` and `params`, other properties will be added.\n\nIf keyword doesn't define or return errors, the default error will be created in case the keyword fails validation.\n"
  },
  {
    "path": "docs/news/2020-08-14-mozilla-grant-openjs-foundation.md",
    "content": "---\nnews: true\ntitle: Mozilla MOSS grant and OpenJS Foundation\ndate: 2020-08-14\n---\n\n[<img src=\"/img/mozilla.svg\" width=\"240\" height=\"68\">](https://www.mozilla.org/en-US/moss/)<img src=\"/img/gap.svg\" width=\"5%\">[<img src=\"/img/openjs.png\" width=\"220\" height=\"68\">](https://openjsf.org/blog/2020/08/14/ajv-joins-openjs-foundation-as-an-incubation-project/)\n\nAjv has been awarded a grant from Mozilla’s [Open Source Support (MOSS) program](https://www.mozilla.org/en-US/moss/) in the “Foundational Technology” track! It will sponsor the development of Ajv support of [JSON Schema version 2019-09](https://tools.ietf.org/html/draft-handrews-json-schema-02) and of [JSON Type Definition (RFC8927)](https://datatracker.ietf.org/doc/rfc8927/).\n\nAjv also joined [OpenJS Foundation](https://openjsf.org/) – having this support will help ensure the longevity and stability of Ajv for all its users.\n\n<!-- more -->\n\nThis [blog post](https://www.poberezkin.com/posts/2020-08-14-ajv-json-validator-mozilla-open-source-grant-openjs-foundation.html) has more details.\n\nI am looking for the long term maintainers of Ajv – working with [ReadySet](https://www.thereadyset.co/), also sponsored by Mozilla, to establish clear guidelines for the role of a \"maintainer\" and the contribution standards, and to encourage a wider, more inclusive, contribution from the community.\n"
  },
  {
    "path": "docs/news/2020-12-15-ajv-version-7-released.md",
    "content": "---\nnews: true\ntitle: Ajv version 7 is released!\ndate: 2020-12-15\n---\n\nAjv version 7 has these new features:\n\n- support of JSON Schema draft-2019-09 features: <a href=\"/json-schema.html#keywords-for-objects\">unevaluatedProperties</a> and <a href=\"/json-schema.html#unevaluateditems\">unevaluatedItems</a>, <a href=\"/guide/combining-schemas.html#extending-recursive-schemas\">dynamic recursive references</a> and other <a href=\"/json-schema.html#json-schema-draft-2019-09\">additional keywords</a>.\n- to reduce the mistakes in JSON schemas and unexpected validation results, <a href=\"/strict-mode.html\">strict mode</a> is added - it prohibits ignored or ambiguous JSON Schema elements.\n- to make code injection from untrusted schemas impossible, <a href=\"/codegen.html\">code generation</a> is fully re-written to be safe and to allow code optimization (compiled schema code size is reduced by more than 10%).\n<!-- more -->\n- to simplify Ajv extensions, the new keyword API that is used by pre-defined keywords is available to user-defined keywords - it is much easier to define any keywords now, especially with subschemas. [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package was updated to use the new API (in [v4.0.0](https://github.com/ajv-validator/ajv-keywords/releases/tag/v4.0.0))\n- schemas are compiled to ES6 code (ES5 code generation is also supported with an option).\n- to improve reliability and maintainability the code is migrated to TypeScript.\n\n**Please note**:\n\n- the support for JSON-Schema draft-04 is removed - if you have schemas using \"id\" attributes you have to replace them with \"\\$id\" (or continue using [Ajv v6](https://github.com/ajv-validator/ajv/tree/v6) that will be supported until 02/28/2021).\n- all formats are separated to ajv-formats package - they have to be explicitly added if you use them.\n\nSee [release notes](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0) for the details.\n\nTo install the new version:\n\n```bash\nnpm install ajv\n```\n\nSee [Getting started](/guide/getting-started.md) for code examples.\n"
  },
  {
    "path": "docs/news/2021-03-07-ajv-supports-json-type-definition.md",
    "content": "---\nnews: true\ntitle: Ajv supports JSON Type Definition\ndate: 2021-03-07\n---\n\nJSON Type Definition (JTD) is a new specification for defining JSON structures that is very simple to use, comparing with JSON Schema, less error prone, and it is published as [RFC8927](https://datatracker.ietf.org/doc/rfc8927/).\n\nSee <a href=\"/guide/schema-language.html\">Choosing schema language</a> for a detailed comparison between JSON Schema and JSON Type definition and <a href=\"/json-type-definition.html\">informal specification</a>.\n\n<!-- more -->\n\nIn addition to validation, Ajv also supports:\n- generation of [serializers](/api.html#jtd-serialize) and [parsers](/api.html#jtd-parse) from JTD schemas/ This is more efficient than native JSON serialization/parsing - you can combine JSON string parsing and validation in one function call.\n- utility type [JTDSchemaType](/guide/typescript.html#utility-types-for-schemas) to convert your data type to the type of JTD schema and [JTDDataType](/guide/typescript.html#utility-type-for-jtd-data-type) to convert the type of schema to the type of data.\n"
  },
  {
    "path": "docs/news/2021-03-27-ajv-version-8-released.md",
    "content": "---\nnews: true\ntitle: Ajv version 8 is released!\ndate: 2021-03-27\n---\n\nAjv version 8 has these new features:\n\n- support of JSON Schema draft-2020-12: <a href=\"/json-schema.html#prefixitems\">prefixItems</a> keyword and changed semantics of <a href=\"/json-schema.html#items-in-draft-2020-12\">items</a> keyword, <a href=\"/guide/combining-schemas.html#extending-recursive-schemas\">dynamic recursive references</a>.\n- OpenAPI <a href=\"/json-schema.html#discriminator\">discriminator</a> keyword.\n- improved JSON Type Definition support:\n<!-- more -->\n  - errors consistent with JTD specification.\n  - error objects with additional properties to simplify error handling\n  - internationalized error messages with [ajv-i18n](/packages/ajv-i18n)\n- TypeScript: support type unions in [JSONSchemaType](/guide/typescript.html#type-safe-unions)\n\nSee [release notes](https://github.com/ajv-validator/ajv/releases/tag/v8.0.0) for the details.\n\nTo install the new version:\n\n```bash\nnpm install ajv\n```\n\nSee [Getting started](/guide/getting-started.md) for code examples.\n"
  },
  {
    "path": "docs/news/2021-04-24-ajv-online-event.md",
    "content": "---\nnews: true\ntitle: \"Ajv online event - May 20, 10am PT / 6pm UK\"\ndate: 2021-04-24\nmore: false\n---\n\nWe will talk about:\n- new features of Ajv version 8.\n- the improvements sponsored by Mozilla's MOSS grant.\n- how Ajv is used in JavaScript applications.\n\nSpeakers:\n- [Evgeny Poberezkin](https://github.com/epoberezkin), the creator of Ajv.\n- [Mehan Jayasuriya](https://github.com/mehan), Program Officer at Mozilla Foundation, leading the [MOSS](https://www.mozilla.org/en-US/moss/) and other programs investing in the open source and community ecosystems.\n- [Matteo Collina](https://github.com/mcollina), Technical Director at NearForm and Node.js Technical Steering Committee member, creator of Fastify web framework.\n- [Kin Lane](https://github.com/kinlane), Chief Evangelist at Postman. Studying the tech, business & politics of APIs since 2010. Presidential Innovation Fellow during the Obama administration.\n- [Ulysse Carion](https://github.com/ucarion), the creator of JSON Type Definition specification.\n\n[Gajus Kuizinas](https://github.com/gajus) will host the event.\n\nPlease [register here](https://us02web.zoom.us/webinar/register/4216192074976/WN_erJ_t4ICTHOnGC1SOybNnw).\n\n<!-- more -->\n"
  },
  {
    "path": "docs/news/2021-05-24-ajv-online-event-video.md",
    "content": "---\nnews: true\ntitle: Ajv online event video uploaded\ndate: 2021-05-24\nmore: false\n---\n\nHuge thanks to everybody who joined, and to the speakers! The video of the event is [available on YouTube](https://www.youtube.com/watch?v=KxSKqXEBB7A).\n\n<!-- more -->\n"
  },
  {
    "path": "docs/news/2021-07-22-ajv-microsoft-foss-fund-award.md",
    "content": "---\nnews: true\ntitle: Microsoft FOSS award\ndate: 2021-07-22\nmore: false\n---\n\nAjv was awarded a sponsorship from [Microsoft FOSS fund](https://github.com/microsoft/foss-fund/blob/main/README.md#2021) - huge thanks to Microsoft and the engineers who voted to support Ajv development. \n\nThis award will contribute to a long term maintenance of Ajv.\n\n<!-- more -->\n"
  },
  {
    "path": "docs/news/README.md",
    "content": "---\nnewsIndex: true\neditLink: false\n---\n\n# Ajv News\n\n<NewsIndex/>\n"
  },
  {
    "path": "docs/options.md",
    "content": "# Ajv options\n\n[[toc]]\n\n## Usage\n\nThis page describes properties of the options object that can be passed to Ajv constructor.\n\nFor example, to report all validation errors (rather than failing on the first errors) you should pass `allErrors` option to constructor:\n\n```javascript\nconst ajv = new Ajv({allErrors: true})\n```\n\n## Option defaults\n\n::: tip Do NOT pass default options\nPassing the value below for some of the options is equivalent to not passing this option at all. There is no need to pass default option values - it is recommended to only pass option values that are different from defaults.\n:::\n\n```javascript\n// see types/index.ts for actual types\nconst defaultOptions = {\n  // strict mode options (NEW)\n  strict: undefined, // *\n  strictSchema: true, // *\n  strictNumbers: true, // *\n  strictTypes: \"log\", // *\n  strictTuples: \"log\", // *\n  strictRequired: false, // *\n  allowUnionTypes: false, // *\n  allowMatchingProperties: false, // *\n  validateFormats: true, // *\n  // validation and reporting options:\n  $data: false, // *\n  allErrors: false,\n  verbose: false,\n  discriminator: false, // *\n  unicodeRegExp: true, // *\n  timestamp: undefined // **\n  parseDate: false // **\n  allowDate: false // **\n  int32range: true // **\n  $comment: false, // *\n  formats: {},\n  keywords: {},\n  schemas: {},\n  logger: undefined,\n  loadSchema: undefined, // *, function(uri: string): Promise {}\n  // options to modify validated data:\n  removeAdditional: false,\n  useDefaults: false, // *\n  coerceTypes: false, // *\n  // advanced options:\n  meta: true,\n  validateSchema: true,\n  addUsedSchema: true,\n  inlineRefs: true,\n  passContext: false,\n  loopRequired: 200, // *\n  loopEnum: 200, // NEW\n  ownProperties: false,\n  multipleOfPrecision: undefined, // *\n  messages: true, // false with JTD\n  uriResolver: undefined,\n  code: {\n    // NEW\n    es5: false,\n    esm: false,\n    lines: false,\n    source: false,\n    process: undefined, // (code: string) => string\n    optimize: true,\n    regExp: RegExp\n  },\n}\n```\n\n<sup>\\*</sup> only with JSON Schema\n\n<sup>\\**</sup> only with JSON Type Definition\n\n## Strict mode options <Badge text=\"v7\" />\n\n### strict\n\nBy default Ajv executes in strict mode, that is designed to prevent any unexpected behaviours or silently ignored mistakes in schemas (see [Strict Mode](./strict-mode.md) for more details). It does not change any validation results, but it makes some schemas invalid that would be otherwise valid according to JSON Schema specification.\n\nOption values:\n\n- `true` - throw an exception when any strict mode restriction is violated.\n- `\"log\"` - log warning when any strict mode restriction is violated.\n- `false` - ignore all strict mode violations.\n- `undefined` (default) - use defaults for options strictSchema, strictNumbers, strictTypes, strictTuples and strictRequired.\n\n### strictSchema\n\nPrevent unknown keywords, formats etc. (see [Strict schema](./strict-mode.md#strict-schema))\n\nOption values:\n\n- `true` (default) - throw an exception when any strict schema restriction is violated.\n- `\"log\"` - log warning when any strict schema restriction is violated.\n- `false` - ignore all strict schema violations.\n\n### strictNumbers\n\nWhether to accept `NaN` and `Infinity` as number types during validation.\n\nOption values:\n\n- `true` (default) - fail validation if `NaN` or `Infinity` is passed where number is expected.\n- `false` - allow `NaN` and `Infinity` as number.\n\n### strictTypes\n\nSee [Strict types](./strict-mode.md#strict-types)\n\nOption values:\n\n- `true` - throw an exception when any strict types restriction is violated.\n- `\"log\"` (default) - log warning when any strict types restriction is violated.\n- `false` - ignore all strict types violations.\n\n### strictTuples\n\nSee [Unconstrained tuples](./strict-mode.md#unconstrained-tuples)\n\nOption values:\n\n- `true` - throw an exception when any strict tuples restriction is violated.\n- `\"log\"` (default) - log warning when any strict tuples restriction is violated.\n- `false` - ignore all strict tuples violations.\n\n### strictRequired\n\nSee [Defined required properties](./strict-mode.md#defined-required-properties)\n\nOption values:\n\n- `true` - throw an exception when strict required restriction is violated.\n- `\"log\"` - log warning when strict required restriction is violated.\n- `false` (default) - ignore strict required violations.\n\n### allowUnionTypes\n\nPass true to allow using multiple non-null types in \"type\" keyword (one of `strictTypes` restrictions). see [Strict types](./strict-mode.md#strict-types)\n\n### allowMatchingProperties\n\nPass true to allow overlap between \"properties\" and \"patternProperties\". Does not affect other strict mode restrictions. See [Strict Mode](./strict-mode.md).\n\n### validateFormats\n\nFormat validation.\n\nOption values:\n\n- `true` (default) - validate formats (see [Formats](./guide/formats.md)). In [strict mode](./strict-mode.md) unknown formats will throw exception during schema compilation (and fail validation in case format keyword value is [\\$data reference](./guide/combining-schemas.md#data-reference)).\n- `false` - do not validate any format keywords (TODO they will still collect annotations once supported).\n\n## Validation and reporting options\n\n### $data\n\nSupport [\\$data references](./guide/combining-schemas.md#data-reference). Draft 6 meta-schema that is added by default will be extended to allow them. If you want to use another meta-schema you need to use $dataMetaSchema method to add support for $data reference. See [API](#ajv-constructor-and-methods).\n\n### allErrors\n\nCheck all rules collecting all errors. Default is to return after the first error.\n\n### verbose\n\nInclude the reference to the part of the schema (`schema` and `parentSchema`) and validated data in errors (false by default).\n\n### discriminator\n\nSupport [discriminator keyword](./json-schema.md#discriminator) from [OpenAPI specification](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md).\n\n### unicodeRegExp\n\nBy default Ajv uses unicode flag \"u\" with \"pattern\" and \"patternProperties\", as per JSON Schema spec. See [RegExp.prototype.unicode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/unicode) .\n\nOption values:\n\n- `true` (default) - use unicode flag \"u\".\n- `false` - do not use flag \"u\".\n\n### timestamp <Badge text=\"JTD only\" />\n\nDefines which Javascript types will be accepted for the [JTD timestamp type](./json-type-definition#type-form).\n\nBy default Ajv will accept both Date objects and [RFC3339](https://datatracker.ietf.org/doc/rfc3339/) strings. You can specify allowed values with the option `timestamp: \"date\"` or `timestamp: \"string\"`.\n\n### parseDate <Badge text=\"JTD only\" />\n\nDefines how date-time strings are parsed by [JTD parsers](./api.md#jtd-parse). By default Ajv parses date-time strings as string. Use `parseDate: true` to parse them as Date objects.\n\n### allowDate <Badge text=\"JTD only\" />\n\nDefines how date-time strings are parsed and validated. By default Ajv only allows full date-time strings, as required by JTD specification. Use `allowDate: true` to allow date strings both for validation and for parsing.\n\n::: warning Option allowDate is not portable\nThis option makes JTD validation and parsing more permissive and non-standard. The date strings without time part will be accepted by Ajv, but will be rejected by other JTD validators.\n:::\n\n### specialNumbers <Badge text=\"JTD only\" />\n\nDefines how special case numbers `Infinity`, `-Infinity` and `NaN` are handled.\n\nOption values:\n\n- `\"fast\"` - (default): Do not treat special numbers differently to normal numbers. This is the fastest method but also can produce invalid JSON if the data contains special numbers.\n- `\"null\"` - Special numbers will be serialized to `null` which is the correct behavior according to the JSON spec and is also the same behavior as `JSON.stringify`.\n\n::: warning The default behavior can produce invalid JSON\nUsing `specialNumbers: \"fast\" or undefined` can produce invalid JSON when there are any special case numbers in the data.\n:::\n\n### int32range <Badge text=\"JTD only\" />\n\nCan be used to disable range checking for `int32` and `uint32` types.\n\nBy default Ajv limits the range of these types to `[-2**31, 2**31 - 1]` for `int32` and to `[0, 2**32-1]` for `uint32` when validating and parsing.\n\nWith option `int32range: false` Ajv only requires that `uint32` is non-negative, otherwise does not check the range. Parser will limit the number size to 16 digits (approx. `2**53` - safe integer range).\n\n::: warning Option int32range is not portable\nThis option makes JTD validation and parsing more permissive and non-standard. The integers within a wider range will be accepted by Ajv, but will be rejected by other JTD validators.\n:::\n\n### $comment\n\nLog or pass the value of `$comment` keyword to a function.\n\nOption values:\n\n- `false` (default): ignore \\$comment keyword.\n- `true`: log the keyword value to console.\n- function: pass the keyword value, its schema path and root schema to the specified function\n\n### formats\n\nAn object with format definitions. Keys and values will be passed to `addFormat` method. Pass `true` as format definition to ignore some formats.\n\n### keywords\n\nAn array of keyword definitions or strings. Values will be passed to `addKeyword` method.\n\n### schemas\n\nAn array or object of schemas that will be added to the instance. In case you pass the array the schemas must have IDs in them. When the object is passed the method `addSchema(value, key)` will be called for each schema in this object.\n\n### logger\n\nSets the logging method. Default is the global `console` object that should have methods `log`, `warn` and `error`. See [Error logging](./api.md#error-logging).\n\nOption values:\n\n- logger instance - it should have methods `log`, `warn` and `error`. If any of these methods is missing an exception will be thrown.\n- `false` - logging is disabled.\n\n### loadSchema\n\nAsynchronous function that will be used to load remote schemas when `compileAsync` [method](#api-compileAsync) is used and some reference is missing (option `missingRefs` should NOT be 'fail' or 'ignore'). This function should accept remote schema uri as a parameter and return a Promise that resolves to a schema. See example in [Asynchronous compilation](./guide/managing-schemas.md#asynchronous-schema-compilation).\n\n## Options to modify validated data\n\n### removeAdditional\n\nRemove additional properties - see example in [Removing additional properties](./guide/modifying-data.md#removing-additional-properties).\n\nThis option is not used if schema is added with `addMetaSchema` method.\n\nOption values:\n\n- `false` (default) - not to remove additional properties\n- `\"all\"` - all additional properties are removed, regardless of `additionalProperties` keyword in schema (and no validation is made for them).\n- `true` - only additional properties with `additionalProperties` keyword equal to `false` are removed.\n- `\"failing\"` - additional properties that fail schema validation will be removed (where `additionalProperties` keyword is `false` or schema).\n\n### useDefaults\n\nReplace missing or undefined properties and items with the values from corresponding `default` keywords. Default behaviour is to ignore `default` keywords. This option is not used if schema is added with `addMetaSchema` method.\n\nSee examples in [Assigning defaults](./guide/modifying-data.md#assigning-defaults).\n\nOption values:\n\n- `false` (default) - do not use defaults\n- `true` - insert defaults by value (object literal is used).\n- `\"empty\"` - in addition to missing or undefined, use defaults for properties and items that are equal to `null` or `\"\"` (an empty string).\n\n### coerceTypes\n\nChange data type of data to match `type` keyword. See the example in [Coercing data types](./guide/modifying-data.md#coercing-data-types) and [coercion rules](./coercion.md).\n\nOption values:\n\n- `false` (default) - no type coercion.\n- `true` - coerce scalar data types.\n- `\"array\"` - in addition to coercions between scalar types, coerce scalar data to an array with one element and vice versa (as required by the schema).\n\n## Advanced options\n\n### meta\n\nAdd [meta-schema](http://json-schema.org/documentation.html) so it can be used by other schemas (true by default). If an object is passed, it will be used as the default meta-schema for schemas that have no `$schema` keyword. This default meta-schema MUST have `$schema` keyword.\n\n### validateSchema\n\nValidate added/compiled schemas against meta-schema (true by default). `$schema` property in the schema can be http://json-schema.org/draft-07/schema or absent (draft-07 meta-schema will be used) or can be a reference to the schema previously added with `addMetaSchema` method.\n\nOption values:\n\n- `true` (default) - if the validation fails, throw the exception.\n- `\"log\"` - if the validation fails, log error.\n- `false` - skip schema validation.\n\n### addUsedSchema\n\nBy default methods `compile` and `validate` add schemas to the instance if they have `$id` (or `id`) property that doesn't start with \"#\". If `$id` is present and it is not unique the exception will be thrown. Set this option to `false` to skip adding schemas to the instance and the `$id` uniqueness check when these methods are used. This option does not affect `addSchema` method.\n\n### inlineRefs\n\nAffects compilation of referenced schemas.\n\nOption values:\n\n- `true` (default) - the referenced schemas that don't have refs in them are inlined, regardless of their size - it improves performance.\n- `false` - to not inline referenced schemas (they will always be compiled as separate functions).\n- integer number - to limit the maximum number of keywords of the schema that will be inlined (to balance the total size of compiled functions and performance).\n\n### passContext\n\nPass validation context to _compile_ and _validate_ keyword functions. If this option is `true` and you pass some context to the compiled validation function with `validate.call(context, data)`, the `context` will be available as `this` in your keywords. By default `this` is Ajv instance.\n\n### loopRequired\n\nBy default `required` keyword is compiled into a single expression (or a sequence of statements in `allErrors` mode) up to 200 required properties. Pass integer to set a different number of properties above which `required` keyword will be validated in a loop (with a smaller validation function size and worse performance).\n\n### loopEnum <Badge text=\"v7\" />\n\nBy default `enum` keyword is compiled into a single expression with up to 200 allowed values. Pass integer to set the number of values above which `enum` keyword will be validated in a loop (with a smaller validation function size and worse performance).\n\n### ownProperties\n\nBy default Ajv iterates over all enumerable object properties; when this option is `true` only own enumerable object properties (i.e. found directly on the object rather than on its prototype) are iterated. Contributed by @mbroadst.\n\n### multipleOfPrecision\n\nBy default `multipleOf` keyword is validated by comparing the result of division with `parseInt()` of that result. It works for dividers that are bigger than 1. For small dividers such as 0.01 the result of the division is usually not integer (even when it should be integer, see issue [#84](https://github.com/ajv-validator/ajv/issues/84)). If you need to use fractional dividers set this option to some positive integer N to have `multipleOf` validated using this formula: `Math.abs(Math.round(division) - division) < 1e-N` (it is slower but allows for float arithmetic deviations).\n\n### messages\n\nInclude human-readable messages in errors. `true` by default. `false` can be passed when messages are generated outside of Ajv code (e.g. with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n)).\n\n### uriResolver\n\nBy default `uriResolver` is undefined and relies on the embedded uriResolver [fast-uri](https://github.com/fastify/fast-uri). Pass an object that satisfies the interface [UriResolver](https://github.com/ajv-validator/ajv/blob/master/lib/types/index.ts) to be used in replacement. One alternative is [uri-js](https://github.com/garycourt/uri-js).\n\n### code <Badge text=\"v7\" />\n\nCode generation options:\n\n```typescript\ntype CodeOptions = {\n  es5?: boolean // to generate es5 code - by default code is es6, with \"for-of\" loops, \"let\" and \"const\"\n  esm?: boolean // how functions should be exported - by default CJS is used, so the validate function(s) \n  // file can be `required`. Set this value to true to export the validate function(s) as ES Modules, enabling \n  // bunlers to do their job.\n  lines?: boolean // add line-breaks to code - to simplify debugging of generated functions\n  source?: boolean // add `source` property (see Source below) to validating function.\n  process?: (code: string, schema?: SchemaEnv) => string // an optional function to process generated code\n  // before it is passed to Function constructor.\n  // It can be used to either beautify or to transpile code.\n  optimize?: boolean | number // code optimization flag or number of passes, 1 pass by default,\n  // code optimizations reduce the size of the generated code (bytes, based on the tests) by over 10%,\n  // the number of code tree nodes by nearly 17%.\n  // You would almost never need more than one optimization pass, unless you have some really complex schemas -\n  // the second pass in the tests (it has quite complex schemas) only improves optimization by less than 0.1%.\n  // See [Code optimization](./codegen.md#code-optimization) for details.\n  formats?: Code\n  // Code snippet created with `_` tagged template literal that contains all format definitions,\n  // it can be the code of actual definitions or `require` call:\n  // _`require(\"./my-formats\")`\n  regExp: RegExpEngine\n  // Pass non-standard RegExp engine to mitigate ReDoS, e.g. node-re2.\n  // During validation of a schema, code.regExp will be \n  // used to match strings against regular expressions.\n  // The supplied function must support the interface:\n  // regExp(regex, unicodeFlag).test(string) => boolean\n}\n\ntype Source = {\n  code: string // unlike func.toString() it includes assignments external to function scope\n  scope: Scope // see Code generation (TODO)\n}\n```\n"
  },
  {
    "path": "docs/packages/README.md",
    "content": "# Extending Ajv\n\n## Plugins\n\nAjv can be extended with plugins that add [user defined schema keywords](../guide/user-keywords.md), [validation formats](../guide/formats.md) or functions to process generated code. When such plugin is published as npm package it is recommended that it follows these conventions:\n\n- it exports a function that accepts ajv instance as the first parameter - it allows using plugins with [ajv-cli](./ajv-cli.md).\n- this function returns the same instance to allow chaining.\n- this function can accept an optional configuration as the second parameter.\n\nYou can import `Plugin` interface from ajv if you use Typescript.\n\nIf you have published a useful plugin please submit a PR to add it to the next section.\n\n## Related packages\n\n- [ajv-formats](https://github.com/ajv-validator/ajv-formats) - formats defined in JSON Schema specification\n- [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) - additional validation keywords (select, typeof, etc.)\n- [ajv-errors](https://github.com/ajv-validator/ajv-errors) - defining error messages in the schema\n- [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) - internationalised error messages\n- [ajv-cli](https://github.com/ajv-validator/ajv-cli) - command line interface\n- [ajv-bsontype](https://github.com/BoLaMN/ajv-bsontype) - MongoDB's bsonType formats\n- [ajv-formats-draft2019](https://github.com/luzlab/ajv-formats-draft2019) - formats for draft-2019-09 that are not included in [ajv-formats](./ajv-formats.md) (`idn-hostname`, `idn-email`, `iri` and `iri-reference`)\n- [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) - keywords $merge and $patch\n"
  },
  {
    "path": "docs/security.md",
    "content": "# Security considerations\n\nJSON Schema, if properly used, can replace data sanitisation. It doesn't replace other API security considerations. It also introduces additional security aspects to consider.\n\n[[toc]]\n\n## Security contact\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues.\n\n## Untrusted schemas\n\nAjv treats JSON schemas as trusted as your application code. This security model is based on the most common use case, when the schemas are static and bundled together with the application.\n\nIf your schemas are received from untrusted sources (or generated from untrusted data) there are several scenarios you need to prevent:\n\n- compiling schemas can cause stack overflow (if they are too deep)\n- compiling schemas can be slow (e.g. [#557](https://github.com/ajv-validator/ajv/issues/557))\n- validating certain data can be slow\n\nIt is difficult to predict all the scenarios, but at the very least it may help to limit the size of untrusted schemas (e.g. limit JSON string length) and also the maximum schema object depth (that can be high for relatively small JSON strings). You also may want to mitigate slow regular expressions in `pattern` and `patternProperties` keywords.\n\nRegardless the measures you take, using untrusted schemas increases security risks.\n\n## Circular references in JavaScript objects\n\nAjv does not support schemas and validated data that have circular references in objects. See [issue #802](https://github.com/ajv-validator/ajv/issues/802).\n\nAn attempt to compile such schemas or validate such data would cause stack overflow (or will not complete in case of asynchronous validation). Depending on the parser you use, untrusted data can lead to circular references.\n\n## Security risks of trusted schemas\n\nSome keywords in JSON Schemas can lead to very slow validation for certain data. These keywords include (but may be not limited to):\n\n- `pattern` and `format` for large strings - in some cases using `maxLength` can help mitigate it, but certain regular expressions can lead to exponential validation time even with relatively short strings (see [ReDoS attack](#redos-attack)).\n- `patternProperties` for large property names - use `propertyNames` to mitigate, but some regular expressions can have exponential evaluation time as well.\n- `uniqueItems` for large non-scalar arrays - use `maxItems` to mitigate\n\n::: danger Do NOT use allErrors in production\nThe suggestions above to prevent slow validation would only work if you do NOT use `allErrors: true` in production code (using it would continue validation after validation errors).\n:::\n\nYou can validate your JSON schemas against [this meta-schema](https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-secure.json) to check that these recommendations are followed:\n\n```javascript\najv = new Ajv({strictTypes: false}) // this option is required for this schema\nconst isSchemaSecure = ajv.compile(require(\"ajv/lib/refs/json-schema-secure.json\"))\n\nconst schema1 = {format: \"email\"}\nisSchemaSecure(schema1) // false\n\nconst schema2 = {format: \"email\", maxLength: MAX_LENGTH}\nisSchemaSecure(schema2) // true\n```\n\n::: danger Untrusted data\nFollowing all these recommendation is not a guarantee that validation using of untrusted data is safe - it can still lead to some undesirable results.\n:::\n\n## ReDoS attack\n\nCertain regular expressions can lead to the exponential evaluation time even with relatively short strings.\n\nPlease assess the regular expressions you use in the schemas on their vulnerability to this attack - see [safe-regex](https://github.com/substack/safe-regex), for example.\n\nBy default, Ajv uses the regex engine built into Node.js. This engine has exponential worst-case performance. This performance (and ReDoS attacks) can be mitigated by using a linear-time regex engine. Ajv supports the use of a third-party regex engine for this purpose. \n\nTo use a third-party regex engine in Ajv, set the ajv.opts.code.regExp property to that regex engine during instantiation. Here we use Google’s RE2 engine as an example. \n\n``` \nconst Ajv = require(\"ajv\") \nconst RE2 = require(\"re2\") \nconst ajv = new Ajv({code: {regExp: RE2}}) \n``` \n\nFor details about the interface of the `regexp` option, see options.md under the docs folder. \n\nAlthough linear-time regex engines eliminate ReDoS vulnerabilities, changing a regex engine carries some risk, including:  \n\n - Minor changes in regex syntax. \n - Minor changes in regex semantics. For example, RE2 always interprets regexes in Unicode, and disagrees with JavaScript in its definition of whitespace. To avoid regressions, develop and test your regexes in the same regex engine that you use in production. \n - May not support some advanced features, such as look-aheads or back-references. \n - May have (minor) common-case performance degradation. \n - Increases size of distributable (e.g. RE2 includes a non-trivial C component). \n\n::: warning ReDoS attack\nSome formats that [ajv-formats](https://github.com/ajv-validator/ajv-formats) package implements use [regular expressions](https://github.com/ajv-validator/ajv-formats/blob/master/src/formats.ts) that can be vulnerable to ReDoS attack.\n:::\n\nIf you use Ajv to validate data from untrusted sources **it is strongly recommended** to consider the following:\n\n- making assessment of \"format\" implementations in [ajv-formats](https://github.com/ajv-validator/ajv-formats).\n- passing `\"fast\"` option to ajv-formats plugin (see its docs) that simplifies some of the regular expressions (although it does not guarantee that they are safe).\n- replacing format implementations provided by ajv-formats with your own implementations of \"format\" keyword that either use different regular expressions or another approach to format validation. Please see [addFormat](https://github.com/ajv-validator/ajv/blob/master/docs/api.md#api-addformat) method.\n- disabling format validation by ignoring \"format\" keyword with option `format: false`\n\nWhatever mitigation you choose, please assume all formats provided by ajv-formats as potentially unsafe and make your own assessment of their suitability for your validation scenarios.\n\n## Content Security Policy\n\nWhen using Ajv in a browser page with enabled Content Security Policy (CSP), `script-src` directive must include `'unsafe-eval'`.\n\n::: danger Cross-site scripting attacks\n`unsafe-eval` is NOT recommended in a secure CSP[[1]](https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing-eval), as it has the potential to open the document to cross-site scripting (XSS) attacks.\n:::\n\nIn order to use Ajv without relaxing CSP, you can [compile the schemas using CLI](https://github.com/ajv-validator/ajv-cli#compile-schemas) or programmatically in your build code - see [Standalone validation code](./standalone.md). Compiled JavaScript file can export one or several validation functions that have the same code as the schemas compiled at runtime.\n"
  },
  {
    "path": "docs/standalone.md",
    "content": "# Standalone validation code\n\n[[toc]]\n\nAjv supports generating standalone validation functions from JSON Schemas at compile/build time. These functions can then be used during runtime to do validation without initialising Ajv. It is useful for several reasons:\n\n- to reduce the browser bundle size - Ajv is not included in the bundle (although if you have a large number of schemas the bundle can become bigger - when the total size of generated validation code is bigger than Ajv code).\n- to reduce the start-up time - the validation and compilation of schemas will happen during build time.\n- to avoid dynamic code evaluation with Function constructor (used for schema compilation) - when it is prohibited by the browser page [Content Security Policy](./security.md#content-security-policy).\n\nThis functionality in Ajv v7 supersedes the deprecated package ajv-pack that can be used with Ajv v6. All schemas, including those with recursive references, formats and user-defined keywords are supported, with few [limitations](#configuration-and-limitations).\n\n## Two-step process \n\nThe **first step** is to **generate** the standalone validation function code. This is done at compile/build time of your project and the output is a generated JS file. The **second step** is to **use** the generated JS validation function.\n\nThere are two methods to generate the code, using either the Ajv CLI or the Ajv JS library. There are also a few different options that can be passed when generating code. Below is just a highlight of a few options:\n\n- Set the `code.source` (JS) value to true or use the `compile` (CLI) command to generate standalone code.\n- The standalone code can be generated in either ES5 or ES6, it defaults to ES6. Set the `code.es5` (JS) value to true or pass the `--code-es5` (CLI) flag to true if you want ES5 code.\n- The standalone code can be generated in either CJS (module.export & require) or ESM (exports & import), it defaults to CJS. Set the `code.esm` (JS) value to true or pass the `--code-esm` (CLI) flag if you want ESM exported code.\n\nNote that the way the function is exported, differs if you are exporting a single or multiple schemas. See examples below.\n\n### Generating function(s) using CLI\n\nIn most cases you would use this functionality via [ajv-cli](https://github.com/ajv-validator/ajv-cli) (>= 4.0.0) to generate the standalone code that exports the validation function. See [ajv-cli](https://github.com/ajv-validator/ajv-cli#compile-schemas) docs and the [cli options](https://github.com/ajv-validator/ajv-cli#ajv-options) for additional information.\n\n#### Using the defaults - ES6 and CJS exports\n```sh\nnpm install -g ajv-cli\najv compile -s schema.json -o validate_schema.js\n```\n\n### Generating using the JS library\n\nInstall the package, version >= v7.0.0: \n```sh\nnpm install ajv\n```\n\n#### Generating functions(s) for a single schema using the JS library - ES6 and CJS exports\n\n```javascript\nconst fs = require(\"fs\")\nconst path = require(\"path\")\nconst Ajv = require(\"ajv\")\nconst standaloneCode = require(\"ajv/dist/standalone\").default\n\nconst schema = {\n  $id: \"https://example.com/bar.json\",\n  $schema: \"http://json-schema.org/draft-07/schema#\",\n  type: \"object\",\n  properties: {\n    bar: {type: \"string\"},\n  },\n  \"required\": [\"bar\"]\n}\n\n// The generated code will have a default export:\n// `module.exports = <validateFunctionCode>;module.exports.default = <validateFunctionCode>;`\nconst ajv = new Ajv({code: {source: true}})\nconst validate = ajv.compile(schema)\nlet moduleCode = standaloneCode(ajv, validate)\n\n// Now you can write the module code to file\nfs.writeFileSync(path.join(__dirname, \"../consume/validate-cjs.js\"), moduleCode)\n```\n\n#### Generating functions(s) for multiple schemas using the JS library - ES6 and CJS exports\n\n```javascript\nconst fs = require(\"fs\")\nconst path = require(\"path\")\nconst Ajv = require(\"ajv\")\nconst standaloneCode = require(\"ajv/dist/standalone\").default\n\nconst schemaFoo = {\n  $id: \"#/definitions/Foo\",\n  $schema: \"http://json-schema.org/draft-07/schema#\",\n  type: \"object\",\n  properties: {\n    foo: {\"$ref\": \"#/definitions/Bar\"}\n  }\n}\nconst schemaBar = {\n  $id: \"#/definitions/Bar\",\n  $schema: \"http://json-schema.org/draft-07/schema#\",\n  type: \"object\",\n  properties: {\n    bar: {type: \"string\"},\n  },\n  \"required\": [\"bar\"]\n}\n\n// For CJS, it generates an exports array, will generate\n// `exports[\"#/definitions/Foo\"] = ...;exports[\"#/definitions/Bar\"] = ... ;`\nconst ajv = new Ajv({schemas: [schemaFoo, schemaBar], code: {source: true}})\nlet moduleCode = standaloneCode(ajv)\n\n// Now you can write the module code to file\nfs.writeFileSync(path.join(__dirname, \"../consume/validate-cjs.js\"), moduleCode)\n```\n\n#### Generating functions(s) for multiple schemas using the JS library - ES6 and ESM exports\n\n```javascript\nconst fs = require(\"fs\")\nconst path = require(\"path\")\nconst Ajv = require(\"ajv\")\nconst standaloneCode = require(\"ajv/dist/standalone\").default\n\nconst schemaFoo = {\n  $id: \"#/definitions/Foo\",\n  $schema: \"http://json-schema.org/draft-07/schema#\",\n  type: \"object\",\n  properties: {\n    foo: {\"$ref\": \"#/definitions/Bar\"}\n  }\n}\nconst schemaBar = {\n  $id: \"#/definitions/Bar\",\n  $schema: \"http://json-schema.org/draft-07/schema#\",\n  type: \"object\",\n  properties: {\n    bar: {type: \"string\"},\n  },\n  \"required\": [\"bar\"]\n}\n\n// For ESM, the export name needs to be a valid export name, it can not be `export const #/definitions/Foo = ...;` so we\n// need to provide a mapping between a valid name and the $id field. Below will generate\n// `export const Foo = ...;export const Bar = ...;`\n// This mapping would not have been needed if the `$ids` was just `Bar` and `Foo` instead of `#/definitions/Foo`\n// and `#/definitions/Bar` respectfully\nconst ajv = new Ajv({schemas: [schemaFoo, schemaBar], code: {source: true, esm: true}})\nlet moduleCode = standaloneCode(ajv, {\n  \"Foo\": \"#/definitions/Foo\",\n  \"Bar\": \"#/definitions/Bar\"\n})\n\n// Now you can write the module code to file\nfs.writeFileSync(path.join(__dirname, \"../consume/validate-esm.mjs\"), moduleCode)\n```\n\n::: warning ESM name mapping\nThe ESM version only requires the mapping if the ids are not valid export names. If the $ids were just the\n`Foo` and `Bar` instead of `#/definitions/Foo` and `#/definitions/Bar` then the mapping would not be needed.\n:::\n\n\n## Using the validation function(s)\n\n### Validating a single schemas using the JS library - ES6 and CJS\n\n```javascript\nconst Bar = require('./validate-cjs')\n\nconst barPass = {\n    bar: \"something\"\n}\n\nconst barFail = {\n    // bar: \"something\" // <= empty/omitted property that is required\n}\n\nlet validateBar = Bar\nif (!validateBar(barPass))\n  console.log(\"ERRORS 1:\", validateBar.errors) //Never reaches this because valid\n\nif (!validateBar(barFail))\n  console.log(\"ERRORS 2:\", validateBar.errors) //Errors array gets logged\n```\n\n### Validating multiple schemas using the JS library - ES6 and CJS\n\n```javascript\nconst validations = require('./validate-cjs')\n\nconst fooPass = {\n  foo: {\n    bar: \"something\"\n  }\n}\n\nconst fooFail = {\n  foo: {\n    // bar: \"something\" // <= empty/omitted property that is required\n  }\n}\n\nlet validateFoo = validations[\"#/definitions/Foo\"];\nif (!validateFoo(fooPass))\n  console.log(\"ERRORS 1:\", validateFoo.errors); //Never reaches this because valid\n\nif (!validateFoo(fooFail))\n  console.log(\"ERRORS 2:\", validateFoo.errors); //Errors array gets logged\n\n```\n\n### Validating multiple schemas using the JS library - ES6 and ESM\n\n```javascript\nimport {Foo, Bar} from './validate-multiple-esm.mjs';\n\nconst fooPass = {\n  foo: {\n    bar: \"something\"\n  }\n}\n\nconst fooFail = {\n  foo: {\n    // bar: \"something\" // bar: \"something\" <= empty properties\n  }\n}\n\nlet validateFoo = Foo;\nif (!validateFoo(fooPass))\n  console.log(\"ERRORS 1:\", validateFoo.errors); //Never reaches here because valid\n\nif (!validateFoo(fooFail))\n  console.log(\"ERRORS 2:\", validateFoo.errors); //Errors array gets logged\n```\n\n\n### Requirement at runtime\n\nOne of the main reason for using the standalone mode is to start applications faster to avoid runtime schema compilation. \n\nThe standalone generated functions still has a dependency on the Ajv. Specifically on the code in the [runtime](https://github.com/ajv-validator/ajv/tree/master/lib/runtime) folder of the package. \n\nCompletely isolated validation functions can be generated if desired (won't be for most use cases). Run the generated code through a bundler like ES Build to create completely isolated validation functions that can be imported/required without any dependency on Ajv. This is also not needed if your project is already using a bundler.\n\n## Configuration and limitations\n\nTo support standalone code generation:\n\n- Ajv option `code.source` must be set to `true`\n- only `code` and `macro` user-defined keywords are supported (see [User defined keywords](./keywords.md)).\n- when `code` keywords define variables in shared scope using `gen.scopeValue`, they must provide `code` property with the code snippet. See source code of pre-defined keywords for examples in [vocabularies folder](https://github.com/ajv-validator/ajv/blob/master/lib/vocabularies).\n- if formats are used in standalone code, ajv option `code.formats` should contain the code snippet that will evaluate to an object with all used format definitions - it can be a call to `require(\"...\")` with the correct path (relative to the location of saved module):\n\n```javascript\nimport myFormats from \"./my-formats\"\nimport Ajv, {_} from \"ajv\"\nconst ajv = new Ajv({\n  formats: myFormats,\n  code: {\n    source: true,\n    formats: _`require(\"./my-formats\")`,\n  },\n})\n\nIf you only use formats from [ajv-formats](https://github.com/ajv-validator/ajv-formats) this option will be set by this package automatically.\n"
  },
  {
    "path": "docs/strict-mode.md",
    "content": "# Strict mode\n\nStrict mode intends to prevent any unexpected behaviours or silently ignored mistakes in user schemas. It does not change any validation results compared with the specification, but it makes some schemas invalid and throws exception or logs warning (with `strict: \"log\"` option) in case any restriction is violated.\n\nTo disable all strict mode restrictions use option `strict: false`. Some of the restrictions can be changed with their own options\n\n[[toc]]\n\n## JSON Type Definition schemas\n\nJTD specification is strict - whether Ajv strict mode is enabled or not it will not allow schemas with ignored or ambiguous elements, including:\n\n- unknown schema keywords\n- combining multiple schema forms in one schema\n- defining the same property as both required and optional\n- re-defining discriminator tag inside properties, even if the definition is non-contradictory\n\nSee [JSON Type Definition](./json-type-definition.md) for informal and [RFC8927](https://datatracker.ietf.org/doc/rfc8927/) for formal specification descriptions.\n\nThe only change that strict mode introduces to JTD schemas, without changing their syntax or semantics, is the requirement that all members that are present in optional `metadata` members are defined as Ajv keywords. This restriction can be disabled with `strict: false` option, without any impact to other JTD features.\n\n## JSON Schema schemas\n\nJSON Schema specification is very permissive and allows many elements in the schema to be quietly ignored or be ambiguous. It is recommended to use JSON Schema with strict mode.\n\nOption `strict` with value `true`/`false`/`\"log\"` can be used to set all strict mode restriction to be the same, otherwise individual strict mode options can be used. See [Strict mode options](./options.md#strict-mode-options).\n\n### Prohibit ignored keywords <Badge text=\"strictSchema option\" />\n\n#### Unknown keywords\n\nJSON Schema [section 6.5](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-6.5) requires to ignore unknown keywords. The motivation is to increase cross-platform portability of schemas, so that implementations that do not support certain keywords can still do partial validation.\n\nThe problems with this approach are:\n\n- Different validation results with the same schema and data, leading to bugs and inconsistent behaviours.\n- Typos in keywords resulting in keywords being quietly ignored, requiring extensive test coverage of schemas to avoid these mistakes.\n\nBy default Ajv fails schema compilation when unknown keywords are used. Users can explicitly define the keywords that should be allowed and ignored:\n\n```javascript\najv.addKeyword(\"allowedKeyword\")\n```\n\nor use the convenience method `addVocabulary` for multiple keywords\n\n```javascript\najv.addVocabulary([\"allowed1\", \"allowed2\"]) // simply calls addKeyword multiple times\n```\n\n#### Ignored \"additionalItems\" keyword\n\nJSON Schema section [9.3.1.2](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.2) requires to ignore \"additionalItems\" keyword if \"items\" keyword is absent or if it is not an array of items. This is inconsistent with the interaction of \"additionalProperties\" and \"properties\", and may cause unexpected results.\n\nBy default Ajv fails schema compilation when \"additionalItems\" is used without \"items\" (or if \"items\" is not an array).\n\n#### Ignored \"if\", \"then\", \"else\" keywords\n\nJSON Schema section [9.2.2](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2) requires to ignore \"if\" (only annotations are collected) if both \"then\" and \"else\" are absent, and ignore \"then\"/\"else\" if \"if\" is absent.\n\nBy default Ajv fails schema compilation in these cases.\n\n#### Ignored \"contains\", \"maxContains\" and \"minContains\" keywords\n\nJSON Schema sections [6.4.4, 6.4.5](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.6.4.4) require to ignore keywords \"maxContains\" and \"minContains\" if \"contains\" keyword is absent.\n\nIt is also implied that when \"minContains\" is 0 and \"maxContains\" is absent, \"contains\" keyword is always valid.\n\nBy default Ajv fails schema compilation in these cases.\n\n#### Unknown formats\n\nBy default unknown formats throw exception during schema compilation (and fail validation in case format keyword value is [\\$data reference](./guide/combining-schemas.md#data-reference)). It is possible to opt out of format validation completely with options `validateFormats: false`. You can define all known formats with `addFormat` method or `formats` option - to have some format ignored pass `true` as its definition:\n\n```javascript\nconst ajv = new Ajv({formats: {\n  reserved: true\n})\n```\n\nStandard JSON Schema formats are provided in [ajv-formats](https://github.com/ajv-validator/ajv-formats) package - see [Formats](./guide/formats) section.\n\n#### Ignored defaults\n\nWith `useDefaults` option Ajv modifies validated data by assigning defaults from the schema, but there are different limitations when the defaults can be ignored (see [Assigning defaults](./guide/modifying-data.md#assigning-defaults)). In strict mode Ajv fails schema compilation if such defaults are used in the schema.\n\n### Prevent unexpected validation\n\n#### Overlap between \"properties\" and \"patternProperties\" keywords <Badge text=\"allowMatchingProperties option\"/>\n\nThe expectation of users (see #196, #286) is that \"patternProperties\" only apply to properties not already defined in \"properties\" keyword, but JSON Schema section [9.3.2](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2) defines these two keywords as independent. It means that to some properties two subschemas can be applied - one defined in \"properties\" keyword and another defined in \"patternProperties\" for the pattern matching this property.\n\nBy default Ajv fails schema compilation if a pattern in \"patternProperties\" matches a property in \"properties\" in the same schema.\n\nIn addition to allowing such patterns by using option `strict: false` or `strictSchema: false`, there is an option `allowMatchingProperties: true` to only allow this case without disabling other strict mode restrictions - there are some rare cases when this is necessary.\n\nTo reiterate, neither this nor other strict mode restrictions change the validation results - they only restrict which schemas are valid.\n\n#### Defined required properties <Badge text=\"strictRequired option\" />\n\nWith option `strictRequired` set to `\"log\"` or `true` Ajv logs warning or throws exception if the property used in \"required\" keyword is not defined in \"properties\" keyword in the same or some parent schema relating to the same object (data instance).\n\nBy default this option is disabled.\n\n::: warning Property defined in parent schema\nThere are cases when property defined in the parent schema will not be taken into account.\n:::\n\n#### Unconstrained tuples <Badge text=\"strictTuples option\" />\n\nAjv also logs a warning if \"items\" is an array (for schema that defines a tuple) but neither \"minItems\" nor \"additionalItems\"/\"maxItems\" keyword is present (or have a wrong value):\n\n```javascript\n{\n  type: \"array\",\n  items: [{type: \"number\"}, {type: \"boolean\"}]\n}\n```\n\nThe above schema may have a mistake, as tuples usually are expected to have a fixed size. To \"fix\" it:\n\n```javascript\n{\n  type: \"array\",\n  items: [{type: \"number\"}, {type: \"boolean\"}],\n  minItems: 2,\n  additionalItems: false\n  // or\n  // maxItems: 2\n}\n```\n\nSometimes users accidentally create schema for unit (a tuple with one item) that only validates the first item, this restriction prevents this mistake as well.\n\nUse `strictTuples` option to suppress this warning (`false`) or turn it into exception (`true`).\n\nIf you use `JSONSchemaType<T>` this mistake will also be prevented on a type level.\n\n### Strict types <Badge text=\"strictTypes option\" />\n\nAn additional option `strictTypes` (\"log\" by default) imposes additional restrictions on how type keyword is used:\n\n#### Union types <Badge text=\"allowUnionTypes option\" />\n\nWith `strictTypes` option \"type\" keywords with multiple types (other than with \"null\") are prohibited.\n\nInvalid:\n\n```javascript\n{\n  type: [\"string\", \"number\"]\n}\n```\n\nValid:\n\n```javascript\n{\n  type: [\"object\", \"null\"]\n}\n```\n\nand\n\n```javascript\n{\n  type: \"object\",\n  nullable: true\n}\n```\n\nUnions can still be defined with `anyOf` keyword.\n\nThe motivation for this restriction is that \"type\" is usually not the only keyword in the schema, and mixing other keywords that apply to different types is confusing. It is also consistent with wider range of versions of OpenAPI specification and has better tooling support. E.g., this example violating `strictTypes`:\n\n```javascript\n{\n  type: [\"number\", \"array\"],\n  minimum: 0,\n  items: {\n    type: \"number\",\n    minimum: 0\n  }\n}\n```\n\nis equivalent to this complying example, that is more verbose but also easier to maintain:\n\n```javascript\n{\n  anyOf: [\n    {\n      type: \"number\",\n      minimum: 0,\n    },\n    {\n      type: \"array\",\n      items: {\n        type: \"number\",\n        minimum: 0,\n      },\n    },\n  ]\n}\n```\n\nIt also can be refactored:\n\n```javascript\n{\n  $defs: {\n    item: {\n      type: \"number\",\n      minimum: 0\n    }\n  },\n  anyOf: [\n    {$ref: \"#/$defs/item\"},\n    {\n      type: \"array\",\n      items: {$ref: \"#/$defs/item\"}\n    },\n  ]\n}\n```\n\nThis restriction can be lifted separately from other `strictTypes` restrictions with `allowUnionTypes: true` option.\n\n#### Contradictory types\n\nSubschemas can apply to the same data instance, and it is possible to have contradictory type keywords - it usually indicate some mistake. For example:\n\n```javascript\n{\n  type: \"object\",\n  anyOf: [\n    {type: \"array\"},\n    {type: \"object\"}\n  ]\n}\n```\n\nThe schema above violates `strictTypes` as \"array\" type is not compatible with object. If you used `allowUnionTypes: true` option, the above schema can be fixed in this way:\n\n```javascript\n{\n  type: [\"array\", \"object\"],\n  anyOf: [\n    {type: \"array\"},\n    {type: \"object\"}\n  ]\n}\n```\n\n::: tip \"number\" vs \"integer\"\nType \"number\" can be narrowed to \"integer\", the opposite would violate `strictTypes`.\n:::\n\n#### Require applicable types\n\nThis simple JSON Schema is valid, but it violates `strictTypes`:\n\n```javascript\n{\n  properties: {\n    foo: {type: \"number\"},\n    bar: {type: \"string\"}\n  }\n  required: [\"foo\", \"bar\"]\n}\n```\n\nThis is a very common mistake that even people experienced with JSON Schema often make - the problem here is that any value that is not an object would be valid against this schema - this is rarely intentional.\n\nTo fix it, \"type\" keyword has to be added:\n\n```javascript\n{\n  type: \"object\",\n  properties: {\n    foo: {type: \"number\"},\n    bar: {type: \"string\"}\n  },\n  required: [\"foo\", \"bar\"]\n}\n```\n\nYou do not necessarily have to have \"type\" keyword in the same schema object; as long as there is \"type\" keyword applying to the same part of data instance in the same schema document, not via \"\\$ref\", it will be ok:\n\n```javascript\n{\n  type: \"object\",\n  anyOf: [\n    {\n      properties: {foo: {type: \"number\"}}\n      required: [\"foo\"]\n    },\n    {\n      properties: {bar: {type: \"string\"}}\n      required: [\"bar\"]\n    }\n  ]\n}\n```\n\nBoth \"properties\" and \"required\" need `type: \"object\"` to satisfy `strictTypes` - it is sufficient to have it once in the parent schema, without repeating it in each schema.\n\n### Strict number validation <Badge text=\"strictNumbers option\" />\n\nStrict mode also affects number validation. By default Ajv fails `{\"type\": \"number\"}` (or `\"integer\"`) validation for `Infinity` and `NaN`.\n"
  },
  {
    "path": "docs/testimonials.md",
    "content": "# What users say\n\nIn the past 6 years of working on the JSON Schema Specification itself, Ajv stands out as the implementation of choice. It is very well documented and provides a rich API for extending JSON Schema which many thousands of people use in production today. A huge effort was put into testing, with many tests now forming part of the official test suite.\n\nI've personally used Ajv in production to validate requests for a federated undiagnosed genetic disease program that has lead to new scientific discoveries and literally changed lives.\n\nAjv development can inform the future tooling and specification changes. There's no doubt that Ajv is partly responsible for the ubiquity and success of JSON Schema.\n\n[Ben Hutton](https://github.com/relequestual), JSON Schema Specification Lead\n\n<br>\n\n[ESLint](https://eslint.org/) has used Ajv for validating our complex configurations. Ajv has proven to be reliable over the years we’ve been using it and ESLint is proud to sponsor Ajv’s continued development.\n\n[Nicholas C. Zakas](https://github.com/nzakas), ESLint creator and TSC member\n\n<br>\n\nI always thought that built-in data validation is a key feature of any web framework. We decided to leverage JSON Schema in [Fastify](https://www.fastify.io), and Ajv fits our needs wonderfully: it’s fast, stable and well maintained.\n\n[Matteo Collina](https://github.com/mcollina), technical Director [@nearform](https://github.com/nearform) and TSC member\n\n<br>\n\nAjv has become a centerpiece of all data-validation logic in my open-source projects and businesses. It is spec-compliant, extensible, fast and has amazing support.\n\n[Gajus Kuizinas](https://github.com/gajus), Tech / Product Founder – building \n[@contrahq](https://twitter.com/contrahq)\n"
  },
  {
    "path": "docs/v6-to-v8-migration.md",
    "content": "# Changes from Ajv v6.12.6 to v8.0.0\n\nIf you are migrating from v7 see [v8.0.0 release notes](https://github.com/ajv-validator/ajv/releases/tag/v8.0.0).\n\n[[toc]]\n\n## New features\n\n- support new schema specifications:\n  - [JSON Type Definition](./json-type-definition.md) [RFC8927](https://datatracker.ietf.org/doc/rfc8927/). See [choosing schema language](https://ajv.js.org/guide/schema-language.html) for comparison with JSON Schema.\n  - JSON Schema draft-2020-12: [prefixItems](./json-schema.md#prefixitems) keyword and changed semantics of [items](./json-schema.md#items-in-draft-2020-12) keyword, [dynamic recursive references](./guide/combining-schemas.md#extending-recursive-schemas).\n  - JSON Schema draft-2019-09 features: [`unevaluatedProperties`](./json-schema.md#unevaluatedproperties) and [`unevaluatedItems`](./json-schema.md#unevaluateditems), [dynamic recursive references](./guide/combining-schemas.md#extending-recursive-schemas) and other [additional keywords](./json-schema.md#json-schema-draft-2019-09).\n  - OpenAPI [discriminator](./json-schema.md#discriminator) keyword.\n- Compiled parsers (as fast as JSON.parse on valid JSON, but replace validation and fail much faster on invalid JSON) and serializers (10x+ faster than JSON.stringify) from JSON Type Definition schemas - see examples in [javascript](./guide/getting-started.html#parsing-and-serializing-json) and [typescript](./guide/typescript.html#type-safe-parsers-and-serializers).\n- comprehensive support for [standalone validation code](./standalone.md) - compiling one or multiple schemas to standalone modules with one or multiple exports.\n- to reduce the mistakes in JSON schemas and unexpected validation results, [strict mode](./strict-mode.md) is added - it prohibits ignored or ambiguous JSON Schema elements. See [Strict mode](./strict-mode.md) and [Options](./options.md) for more details.\n- to make code injection from untrusted schemas impossible, [code generation](./codegen.md) is fully re-written to be type-level safe against code injection.\n- to simplify Ajv extensions, the new keyword API that is used by pre-defined keywords is available to user-defined keywords - it is much easier to define any keywords now, especially with subschemas.\n- schemas are compiled to ES6 code (ES5 code generation is supported with an option).\n- to improve reliability and maintainability the code is migrated to TypeScript.\n- separate Ajv classes from draft-07, draft-2019-09, draft-2020-12 and JSON Type Definition support with different default imports (see [Getting started](./guide/getting-started.md).\n\n**Please note**:\n- the support for JSON-Schema draft-04 is removed - if you have schemas using \"id\" attributes you have to replace them with \"\\$id\" (or continue using version 6 that will be supported until 06/30/2021).\n- all formats are separated to [ajv-formats](https://github.com/ajv-validator/ajv-formats) package - they have to be explicitly added if you use them.\n- Ajv instance can only be created with `new` keyword, as Ajv is now ES6 class.\n- browser bundles are automatically published to ajv-dist package (but still available on cdnjs.com).\n- order of schema keyword validation changed - keywords that apply to all types (allOf etc.) are now validated first, before the keywords that apply to specific data types. You can still define custom keywords that apply to all types AND are validated after type-specific keywords using option `post: true` in keyword definition.\n- regular expressions in keywords \"pattern\" and \"patternProperties\" are now used as if they had unicode \"u\" flag, as required by JSON Schema specification - it means that some regular expressions that were valid with Ajv v6 are now invalid (and vice versa).\n- JSON Schema validation errors changes:\n  - `dataPath` property replaced with `instancePath`\n  - \"should\" replaced with \"must\" in the messages\n  - property name is removed from \"propertyName\" keyword error message (it is still available in `error.params.propertyName`).\n\n## Better TypeScript support\n\n- Methods `compile` and `compileAsync` now return type-guards - see [Getting started](./guide/getting-started.md).\n- Method `validate` is a type-guard.\n- Better separation of asynchronous schemas on type level.\n- Schema utility types to simplify writing schemas:\n  - JSONSchemaType\\<T\\>: generates the type for JSON Schema for type interface in the type parameter.\n  - JTDSchemaType\\<T\\>: generates the type for JSON Type Definition schema for type interface in the type parameter.\n  - JTDDataType\\<T\\>: generates the type for data given JSON Type Definition schema type in the type parameter.\n\n## Potential migration difficulties\n\n- Schema compilation is now safer against code injections but slower than in v6 ([#1386](https://github.com/ajv-validator/ajv/issues/1386)) - consider using [standalone validation code](./standalone.md) if this is a problem. Validation performance in v8 is the same (or better, thanks to [code optimizations](./codegen.md#code-optimization)).\n- Schema object used as a key for compiled schema function, not serialized string ([#1413](https://github.com/ajv-validator/ajv/issues/1413)) can cause schema compilation on each validation if you pass a new schema object. See [Managing schemas](./guide/managing-schemas.md) for different approaches to manage caching of compiled validation functions.\n- User defined formats with standalone validation code ([#1470](https://github.com/ajv-validator/ajv/issues/1470)) require passing code snippet to [code.formats](./options.md#code) option.\n\n## API changes\n\n- addVocabulary - NEW method that allows to add an array of keyword definitions.\n- addKeyword - keyword name should be passed as property in definition object, not as the first parameter (old API works with \"deprecated\" warning). Also \"inline\" keywords support is removed, code generation keywords can now be defined with \"code\" keyword - the same definition format that is used by all pre-defined keywords.\n- Ajv no longer allows to create the instance without `new` keyword (it is ES6 class).\n- allow `\":\"` in keyword names.\n\n### Added options\n\n- strict: true/false/\"log\" - enables/disables all strict mode restrictions:\n  - strictSchema: **true**/false/\"log\" - equivalent to the combination of strictKeywords and strictDefaults in v6, with additional restrictions (see [Strict mode](./strict-mode.md)).\n  - strictTypes: true/false/**\"log\"** - prevent mistakes related to type keywords and keyword applicability (see [Strict Types](./strict-mode.md#strict-types)).\n  - strictTuples: true/false/**\"log\"** - prevent incomplete tuple schemas (see [Prohibit unconstrained tuples](./strict-mode.md#prohibit-unconstrained-tuples))\n  - strictRequired: true/**false**/\"log\" - to log or fail if properties used in JSON Schema \"required\" are not defined in \"properties\" (see [Defined required properties](./strict-mode.md#defined-required-properties)).\n- allowUnionTypes: false - allow multiple non-null types in \"type\" keyword\n- allowMatchingProperties: false - allow overlap between \"properties\" and \"patternProperties\" keywords\n- discriminator: true - support OpenAPI [discriminator](./json-schema.md#discriminator) keyword\n- loopEnum - optimise validation of enums, similar to [loopRequired](./options.md#looprequired) option.\n- validateFormats - enable format validation (`true` by default)\n- code: {optimize: number|boolean} - control [code optimisation](./codegen.md#code-optimization)\n- code: {es5: true} - generate ES5 code, the default is to generate ES6 code.\n- code: {lines: true} - add line breaks to generated code - simplifies debugging of compiled schemas when you need it\n\n### Changed options\n\n- `keywords` - now expects the array of keyword definitions (old API works with \"deprecated\" warning).\n- `strictNumbers` - true by default now.\n\n### Removed options\n\n- errorDataPath - was deprecated, now removed.\n- format - `validateFormats: false` can be used instead, format mode can be chosen via ajv-formats package.\n- nullable: `nullable` keyword is supported by default.\n- jsonPointers: JSONPointers are used to report errors by default, `jsPropertySyntax: true` (deprecated) can be used if old format is needed.\n- unicode: deprecated, string length correctly accounts for multi-byte characters by default.\n- extendRefs: $ref siblings are validated by default (consistent with draft 2019-09), `ignoreKeywordsWithRef` (deprecated) can be used instead to ignore $ref siblings.\n- missingRefs: now exception is always thrown. Pass empty schema with $id that should be ignored to ajv.addSchema.\n- processCode: replaced with `code: {process: (code, schemaEnv: object) => string}`.\n- sourceCode: replaced with `code: {source: true}`.\n- schemaId: removed, as JSON Schema draft-04 is no longer supported.\n- strictDefaults, strictKeywords: it is default now, controlled with `strict` or `strictSchema`.\n- uniqueItems: '\"uniqueItems\" keyword is always validated.\n- unknownFormats: the same can be achieved by passing true for formats that need to be ignored via `ajv.addFormat` or `formats` option.\n- cache and serialize: Map is used as cache, schema object as key.\n"
  },
  {
    "path": "karma.conf.js",
    "content": "// Karma configuration\n// Generated on Thu Mar 13 2014 14:12:04 GMT-0700 (PDT)\n\nmodule.exports = function (config) {\n  config.set({\n    // base path that will be used to resolve all patterns (eg. files, exclude)\n    basePath: \"\",\n\n    // frameworks to use\n    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter\n    frameworks: [\"mocha\"],\n\n    // list of files / patterns to load in the browser\n    files: [\n      \"bundle/ajv7.min.js\",\n      \"bundle/ajv2019.min.js\",\n      \"node_modules/chai/chai.js\",\n      \".browser/*.spec.js\",\n    ],\n\n    // test results reporter to use\n    // possible values: 'dots', 'progress'\n    // available reporters: https://npmjs.org/browse/keyword/karma-reporter\n    reporters: [\"dots\"],\n\n    // web server port\n    port: 9876,\n\n    // enable / disable colors in the output (reporters and logs)\n    colors: true,\n\n    // level of logging\n    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG\n    logLevel: config.LOG_INFO,\n\n    // enable / disable watching file and executing tests whenever any file changes\n    autoWatch: false,\n\n    // Start these browsers, currently available:\n    // - Chrome\n    // - ChromeCanary\n    // - Firefox\n    // - Opera\n    // - Safari (only Mac)\n    // - PhantomJS\n    // - IE (only Windows)\n    browsers: [\"HeadlessChrome\"],\n    customLaunchers: {\n      HeadlessChrome: {\n        base: \"ChromeHeadless\",\n        flags: [\"--no-sandbox\"],\n      },\n    },\n\n    // Continuous Integration mode\n    // if true, Karma captures browsers, runs the tests and exits\n    singleRun: true,\n\n    browserNoActivityTimeout: 90000,\n  })\n}\n"
  },
  {
    "path": "lib/2019.ts",
    "content": "import type {AnySchemaObject} from \"./types\"\nimport AjvCore, {Options} from \"./core\"\n\nimport draft7Vocabularies from \"./vocabularies/draft7\"\nimport dynamicVocabulary from \"./vocabularies/dynamic\"\nimport nextVocabulary from \"./vocabularies/next\"\nimport unevaluatedVocabulary from \"./vocabularies/unevaluated\"\nimport discriminator from \"./vocabularies/discriminator\"\nimport addMetaSchema2019 from \"./refs/json-schema-2019-09\"\n\nconst META_SCHEMA_ID = \"https://json-schema.org/draft/2019-09/schema\"\n\nexport class Ajv2019 extends AjvCore {\n  constructor(opts: Options = {}) {\n    super({\n      ...opts,\n      dynamicRef: true,\n      next: true,\n      unevaluated: true,\n    })\n  }\n\n  _addVocabularies(): void {\n    super._addVocabularies()\n    this.addVocabulary(dynamicVocabulary)\n    draft7Vocabularies.forEach((v) => this.addVocabulary(v))\n    this.addVocabulary(nextVocabulary)\n    this.addVocabulary(unevaluatedVocabulary)\n    if (this.opts.discriminator) this.addKeyword(discriminator)\n  }\n\n  _addDefaultMetaSchema(): void {\n    super._addDefaultMetaSchema()\n    const {$data, meta} = this.opts\n    if (!meta) return\n    addMetaSchema2019.call(this, $data)\n    this.refs[\"http://json-schema.org/schema\"] = META_SCHEMA_ID\n  }\n\n  defaultMeta(): string | AnySchemaObject | undefined {\n    return (this.opts.defaultMeta =\n      super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined))\n  }\n}\n\nmodule.exports = exports = Ajv2019\nmodule.exports.Ajv2019 = Ajv2019\nObject.defineProperty(exports, \"__esModule\", {value: true})\n\nexport default Ajv2019\n\nexport {\n  Format,\n  FormatDefinition,\n  AsyncFormatDefinition,\n  KeywordDefinition,\n  KeywordErrorDefinition,\n  CodeKeywordDefinition,\n  MacroKeywordDefinition,\n  FuncKeywordDefinition,\n  Vocabulary,\n  Schema,\n  SchemaObject,\n  AnySchemaObject,\n  AsyncSchema,\n  AnySchema,\n  ValidateFunction,\n  AsyncValidateFunction,\n  ErrorObject,\n  ErrorNoParams,\n} from \"./types\"\n\nexport {Plugin, Options, CodeOptions, InstanceOptions, Logger, ErrorsTextOptions} from \"./core\"\nexport {SchemaCxt, SchemaObjCxt} from \"./compile\"\nexport {KeywordCxt} from \"./compile/validate\"\nexport {DefinedError} from \"./vocabularies/errors\"\nexport {JSONType} from \"./compile/rules\"\nexport {JSONSchemaType} from \"./types/json-schema\"\nexport {_, str, stringify, nil, Name, Code, CodeGen, CodeGenOptions} from \"./compile/codegen\"\nexport {default as ValidationError} from \"./runtime/validation_error\"\nexport {default as MissingRefError} from \"./compile/ref_error\"\n"
  },
  {
    "path": "lib/2020.ts",
    "content": "import type {AnySchemaObject} from \"./types\"\nimport AjvCore, {Options} from \"./core\"\n\nimport draft2020Vocabularies from \"./vocabularies/draft2020\"\nimport discriminator from \"./vocabularies/discriminator\"\nimport addMetaSchema2020 from \"./refs/json-schema-2020-12\"\n\nconst META_SCHEMA_ID = \"https://json-schema.org/draft/2020-12/schema\"\n\nexport class Ajv2020 extends AjvCore {\n  constructor(opts: Options = {}) {\n    super({\n      ...opts,\n      dynamicRef: true,\n      next: true,\n      unevaluated: true,\n    })\n  }\n\n  _addVocabularies(): void {\n    super._addVocabularies()\n    draft2020Vocabularies.forEach((v) => this.addVocabulary(v))\n    if (this.opts.discriminator) this.addKeyword(discriminator)\n  }\n\n  _addDefaultMetaSchema(): void {\n    super._addDefaultMetaSchema()\n    const {$data, meta} = this.opts\n    if (!meta) return\n    addMetaSchema2020.call(this, $data)\n    this.refs[\"http://json-schema.org/schema\"] = META_SCHEMA_ID\n  }\n\n  defaultMeta(): string | AnySchemaObject | undefined {\n    return (this.opts.defaultMeta =\n      super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined))\n  }\n}\n\nmodule.exports = exports = Ajv2020\nmodule.exports.Ajv2020 = Ajv2020\nObject.defineProperty(exports, \"__esModule\", {value: true})\n\nexport default Ajv2020\n\nexport {\n  Format,\n  FormatDefinition,\n  AsyncFormatDefinition,\n  KeywordDefinition,\n  KeywordErrorDefinition,\n  CodeKeywordDefinition,\n  MacroKeywordDefinition,\n  FuncKeywordDefinition,\n  Vocabulary,\n  Schema,\n  SchemaObject,\n  AnySchemaObject,\n  AsyncSchema,\n  AnySchema,\n  ValidateFunction,\n  AsyncValidateFunction,\n  ErrorObject,\n  ErrorNoParams,\n} from \"./types\"\n\nexport {Plugin, Options, CodeOptions, InstanceOptions, Logger, ErrorsTextOptions} from \"./core\"\nexport {SchemaCxt, SchemaObjCxt} from \"./compile\"\nexport {KeywordCxt} from \"./compile/validate\"\nexport {DefinedError} from \"./vocabularies/errors\"\nexport {JSONType} from \"./compile/rules\"\nexport {JSONSchemaType} from \"./types/json-schema\"\nexport {_, str, stringify, nil, Name, Code, CodeGen, CodeGenOptions} from \"./compile/codegen\"\nexport {default as ValidationError} from \"./runtime/validation_error\"\nexport {default as MissingRefError} from \"./compile/ref_error\"\n"
  },
  {
    "path": "lib/ajv.ts",
    "content": "import type {AnySchemaObject} from \"./types\"\nimport AjvCore from \"./core\"\nimport draft7Vocabularies from \"./vocabularies/draft7\"\nimport discriminator from \"./vocabularies/discriminator\"\nimport * as draft7MetaSchema from \"./refs/json-schema-draft-07.json\"\n\nconst META_SUPPORT_DATA = [\"/properties\"]\n\nconst META_SCHEMA_ID = \"http://json-schema.org/draft-07/schema\"\n\nexport class Ajv extends AjvCore {\n  _addVocabularies(): void {\n    super._addVocabularies()\n    draft7Vocabularies.forEach((v) => this.addVocabulary(v))\n    if (this.opts.discriminator) this.addKeyword(discriminator)\n  }\n\n  _addDefaultMetaSchema(): void {\n    super._addDefaultMetaSchema()\n    if (!this.opts.meta) return\n    const metaSchema = this.opts.$data\n      ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA)\n      : draft7MetaSchema\n    this.addMetaSchema(metaSchema, META_SCHEMA_ID, false)\n    this.refs[\"http://json-schema.org/schema\"] = META_SCHEMA_ID\n  }\n\n  defaultMeta(): string | AnySchemaObject | undefined {\n    return (this.opts.defaultMeta =\n      super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined))\n  }\n}\n\nmodule.exports = exports = Ajv\nmodule.exports.Ajv = Ajv\nObject.defineProperty(exports, \"__esModule\", {value: true})\n\nexport default Ajv\n\nexport {\n  Format,\n  FormatDefinition,\n  AsyncFormatDefinition,\n  KeywordDefinition,\n  KeywordErrorDefinition,\n  CodeKeywordDefinition,\n  MacroKeywordDefinition,\n  FuncKeywordDefinition,\n  Vocabulary,\n  Schema,\n  SchemaObject,\n  AnySchemaObject,\n  AsyncSchema,\n  AnySchema,\n  ValidateFunction,\n  AsyncValidateFunction,\n  SchemaValidateFunction,\n  ErrorObject,\n  ErrorNoParams,\n} from \"./types\"\n\nexport {Plugin, Options, CodeOptions, InstanceOptions, Logger, ErrorsTextOptions} from \"./core\"\nexport {SchemaCxt, SchemaObjCxt} from \"./compile\"\nexport {KeywordCxt} from \"./compile/validate\"\nexport {DefinedError} from \"./vocabularies/errors\"\nexport {JSONType} from \"./compile/rules\"\nexport {JSONSchemaType} from \"./types/json-schema\"\nexport {_, str, stringify, nil, Name, Code, CodeGen, CodeGenOptions} from \"./compile/codegen\"\nexport {default as ValidationError} from \"./runtime/validation_error\"\nexport {default as MissingRefError} from \"./compile/ref_error\"\n"
  },
  {
    "path": "lib/compile/codegen/code.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport abstract class _CodeOrName {\n  abstract readonly str: string\n  abstract readonly names: UsedNames\n  abstract toString(): string\n  abstract emptyStr(): boolean\n}\n\nexport const IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i\n\nexport class Name extends _CodeOrName {\n  readonly str: string\n  constructor(s: string) {\n    super()\n    if (!IDENTIFIER.test(s)) throw new Error(\"CodeGen: name must be a valid identifier\")\n    this.str = s\n  }\n\n  toString(): string {\n    return this.str\n  }\n\n  emptyStr(): boolean {\n    return false\n  }\n\n  get names(): UsedNames {\n    return {[this.str]: 1}\n  }\n}\n\nexport class _Code extends _CodeOrName {\n  readonly _items: readonly CodeItem[]\n  private _str?: string\n  private _names?: UsedNames\n\n  constructor(code: string | readonly CodeItem[]) {\n    super()\n    this._items = typeof code === \"string\" ? [code] : code\n  }\n\n  toString(): string {\n    return this.str\n  }\n\n  emptyStr(): boolean {\n    if (this._items.length > 1) return false\n    const item = this._items[0]\n    return item === \"\" || item === '\"\"'\n  }\n\n  get str(): string {\n    return (this._str ??= this._items.reduce((s: string, c: CodeItem) => `${s}${c}`, \"\"))\n  }\n\n  get names(): UsedNames {\n    return (this._names ??= this._items.reduce((names: UsedNames, c) => {\n      if (c instanceof Name) names[c.str] = (names[c.str] || 0) + 1\n      return names\n    }, {}))\n  }\n}\n\nexport type CodeItem = Name | string | number | boolean | null\n\nexport type UsedNames = Record<string, number | undefined>\n\nexport type Code = _Code | Name\n\nexport type SafeExpr = Code | number | boolean | null\n\nexport const nil = new _Code(\"\")\n\ntype CodeArg = SafeExpr | string | undefined\n\nexport function _(strs: TemplateStringsArray, ...args: CodeArg[]): _Code {\n  const code: CodeItem[] = [strs[0]]\n  let i = 0\n  while (i < args.length) {\n    addCodeArg(code, args[i])\n    code.push(strs[++i])\n  }\n  return new _Code(code)\n}\n\nconst plus = new _Code(\"+\")\n\nexport function str(strs: TemplateStringsArray, ...args: (CodeArg | string[])[]): _Code {\n  const expr: CodeItem[] = [safeStringify(strs[0])]\n  let i = 0\n  while (i < args.length) {\n    expr.push(plus)\n    addCodeArg(expr, args[i])\n    expr.push(plus, safeStringify(strs[++i]))\n  }\n  optimize(expr)\n  return new _Code(expr)\n}\n\nexport function addCodeArg(code: CodeItem[], arg: CodeArg | string[]): void {\n  if (arg instanceof _Code) code.push(...arg._items)\n  else if (arg instanceof Name) code.push(arg)\n  else code.push(interpolate(arg))\n}\n\nfunction optimize(expr: CodeItem[]): void {\n  let i = 1\n  while (i < expr.length - 1) {\n    if (expr[i] === plus) {\n      const res = mergeExprItems(expr[i - 1], expr[i + 1])\n      if (res !== undefined) {\n        expr.splice(i - 1, 3, res)\n        continue\n      }\n      expr[i++] = \"+\"\n    }\n    i++\n  }\n}\n\nfunction mergeExprItems(a: CodeItem, b: CodeItem): CodeItem | undefined {\n  if (b === '\"\"') return a\n  if (a === '\"\"') return b\n  if (typeof a == \"string\") {\n    if (b instanceof Name || a[a.length - 1] !== '\"') return\n    if (typeof b != \"string\") return `${a.slice(0, -1)}${b}\"`\n    if (b[0] === '\"') return a.slice(0, -1) + b.slice(1)\n    return\n  }\n  if (typeof b == \"string\" && b[0] === '\"' && !(a instanceof Name)) return `\"${a}${b.slice(1)}`\n  return\n}\n\nexport function strConcat(c1: Code, c2: Code): Code {\n  return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`\n}\n\n// TODO do not allow arrays here\nfunction interpolate(x?: string | string[] | number | boolean | null): SafeExpr | string {\n  return typeof x == \"number\" || typeof x == \"boolean\" || x === null\n    ? x\n    : safeStringify(Array.isArray(x) ? x.join(\",\") : x)\n}\n\nexport function stringify(x: unknown): Code {\n  return new _Code(safeStringify(x))\n}\n\nexport function safeStringify(x: unknown): string {\n  return JSON.stringify(x)\n    .replace(/\\u2028/g, \"\\\\u2028\")\n    .replace(/\\u2029/g, \"\\\\u2029\")\n}\n\nexport function getProperty(key: Code | string | number): Code {\n  return typeof key == \"string\" && IDENTIFIER.test(key) ? new _Code(`.${key}`) : _`[${key}]`\n}\n\n//Does best effort to format the name properly\nexport function getEsmExportName(key: Code | string | number): Code {\n  if (typeof key == \"string\" && IDENTIFIER.test(key)) {\n    return new _Code(`${key}`)\n  }\n  throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`)\n}\n\nexport function regexpCode(rx: RegExp): Code {\n  return new _Code(rx.toString())\n}\n"
  },
  {
    "path": "lib/compile/codegen/index.ts",
    "content": "import type {ScopeValueSets, NameValue, ValueScope, ValueScopeName} from \"./scope\"\nimport {_, nil, _Code, Code, Name, UsedNames, CodeItem, addCodeArg, _CodeOrName} from \"./code\"\nimport {Scope, varKinds} from \"./scope\"\n\nexport {_, str, strConcat, nil, getProperty, stringify, regexpCode, Name, Code} from \"./code\"\nexport {Scope, ScopeStore, ValueScope, ValueScopeName, ScopeValueSets, varKinds} from \"./scope\"\n\n// type for expressions that can be safely inserted in code without quotes\nexport type SafeExpr = Code | number | boolean | null\n\n// type that is either Code of function that adds code to CodeGen instance using its methods\nexport type Block = Code | (() => void)\n\nexport const operators = {\n  GT: new _Code(\">\"),\n  GTE: new _Code(\">=\"),\n  LT: new _Code(\"<\"),\n  LTE: new _Code(\"<=\"),\n  EQ: new _Code(\"===\"),\n  NEQ: new _Code(\"!==\"),\n  NOT: new _Code(\"!\"),\n  OR: new _Code(\"||\"),\n  AND: new _Code(\"&&\"),\n  ADD: new _Code(\"+\"),\n}\n\nabstract class Node {\n  abstract readonly names: UsedNames\n\n  optimizeNodes(): this | ChildNode | ChildNode[] | undefined {\n    return this\n  }\n\n  optimizeNames(_names: UsedNames, _constants: Constants): this | undefined {\n    return this\n  }\n\n  // get count(): number {\n  //   return 1\n  // }\n}\n\nclass Def extends Node {\n  constructor(\n    private readonly varKind: Name,\n    private readonly name: Name,\n    private rhs?: SafeExpr\n  ) {\n    super()\n  }\n\n  render({es5, _n}: CGOptions): string {\n    const varKind = es5 ? varKinds.var : this.varKind\n    const rhs = this.rhs === undefined ? \"\" : ` = ${this.rhs}`\n    return `${varKind} ${this.name}${rhs};` + _n\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n    if (!names[this.name.str]) return\n    if (this.rhs) this.rhs = optimizeExpr(this.rhs, names, constants)\n    return this\n  }\n\n  get names(): UsedNames {\n    return this.rhs instanceof _CodeOrName ? this.rhs.names : {}\n  }\n}\n\nclass Assign extends Node {\n  constructor(\n    readonly lhs: Code,\n    public rhs: SafeExpr,\n    private readonly sideEffects?: boolean\n  ) {\n    super()\n  }\n\n  render({_n}: CGOptions): string {\n    return `${this.lhs} = ${this.rhs};` + _n\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n    if (this.lhs instanceof Name && !names[this.lhs.str] && !this.sideEffects) return\n    this.rhs = optimizeExpr(this.rhs, names, constants)\n    return this\n  }\n\n  get names(): UsedNames {\n    const names = this.lhs instanceof Name ? {} : {...this.lhs.names}\n    return addExprNames(names, this.rhs)\n  }\n}\n\nclass AssignOp extends Assign {\n  constructor(\n    lhs: Code,\n    private readonly op: Code,\n    rhs: SafeExpr,\n    sideEffects?: boolean\n  ) {\n    super(lhs, rhs, sideEffects)\n  }\n\n  render({_n}: CGOptions): string {\n    return `${this.lhs} ${this.op}= ${this.rhs};` + _n\n  }\n}\n\nclass Label extends Node {\n  readonly names: UsedNames = {}\n  constructor(readonly label: Name) {\n    super()\n  }\n\n  render({_n}: CGOptions): string {\n    return `${this.label}:` + _n\n  }\n}\n\nclass Break extends Node {\n  readonly names: UsedNames = {}\n  constructor(readonly label?: Code) {\n    super()\n  }\n\n  render({_n}: CGOptions): string {\n    const label = this.label ? ` ${this.label}` : \"\"\n    return `break${label};` + _n\n  }\n}\n\nclass Throw extends Node {\n  constructor(readonly error: Code) {\n    super()\n  }\n\n  render({_n}: CGOptions): string {\n    return `throw ${this.error};` + _n\n  }\n\n  get names(): UsedNames {\n    return this.error.names\n  }\n}\n\nclass AnyCode extends Node {\n  constructor(private code: SafeExpr) {\n    super()\n  }\n\n  render({_n}: CGOptions): string {\n    return `${this.code};` + _n\n  }\n\n  optimizeNodes(): this | undefined {\n    return `${this.code}` ? this : undefined\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this {\n    this.code = optimizeExpr(this.code, names, constants)\n    return this\n  }\n\n  get names(): UsedNames {\n    return this.code instanceof _CodeOrName ? this.code.names : {}\n  }\n}\n\nabstract class ParentNode extends Node {\n  constructor(readonly nodes: ChildNode[] = []) {\n    super()\n  }\n\n  render(opts: CGOptions): string {\n    return this.nodes.reduce((code, n) => code + n.render(opts), \"\")\n  }\n\n  optimizeNodes(): this | ChildNode | ChildNode[] | undefined {\n    const {nodes} = this\n    let i = nodes.length\n    while (i--) {\n      const n = nodes[i].optimizeNodes()\n      if (Array.isArray(n)) nodes.splice(i, 1, ...n)\n      else if (n) nodes[i] = n\n      else nodes.splice(i, 1)\n    }\n    return nodes.length > 0 ? this : undefined\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n    const {nodes} = this\n    let i = nodes.length\n    while (i--) {\n      // iterating backwards improves 1-pass optimization\n      const n = nodes[i]\n      if (n.optimizeNames(names, constants)) continue\n      subtractNames(names, n.names)\n      nodes.splice(i, 1)\n    }\n    return nodes.length > 0 ? this : undefined\n  }\n\n  get names(): UsedNames {\n    return this.nodes.reduce((names: UsedNames, n) => addNames(names, n.names), {})\n  }\n\n  // get count(): number {\n  //   return this.nodes.reduce((c, n) => c + n.count, 1)\n  // }\n}\n\nabstract class BlockNode extends ParentNode {\n  render(opts: CGOptions): string {\n    return \"{\" + opts._n + super.render(opts) + \"}\" + opts._n\n  }\n}\n\nclass Root extends ParentNode {}\n\nclass Else extends BlockNode {\n  static readonly kind = \"else\"\n}\n\nclass If extends BlockNode {\n  static readonly kind = \"if\"\n  else?: If | Else\n  constructor(\n    private condition: Code | boolean,\n    nodes?: ChildNode[]\n  ) {\n    super(nodes)\n  }\n\n  render(opts: CGOptions): string {\n    let code = `if(${this.condition})` + super.render(opts)\n    if (this.else) code += \"else \" + this.else.render(opts)\n    return code\n  }\n\n  optimizeNodes(): If | ChildNode[] | undefined {\n    super.optimizeNodes()\n    const cond = this.condition\n    if (cond === true) return this.nodes // else is ignored here\n    let e = this.else\n    if (e) {\n      const ns = e.optimizeNodes()\n      e = this.else = Array.isArray(ns) ? new Else(ns) : (ns as Else | undefined)\n    }\n    if (e) {\n      if (cond === false) return e instanceof If ? e : e.nodes\n      if (this.nodes.length) return this\n      return new If(not(cond), e instanceof If ? [e] : e.nodes)\n    }\n    if (cond === false || !this.nodes.length) return undefined\n    return this\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n    this.else = this.else?.optimizeNames(names, constants)\n    if (!(super.optimizeNames(names, constants) || this.else)) return\n    this.condition = optimizeExpr(this.condition, names, constants)\n    return this\n  }\n\n  get names(): UsedNames {\n    const names = super.names\n    addExprNames(names, this.condition)\n    if (this.else) addNames(names, this.else.names)\n    return names\n  }\n\n  // get count(): number {\n  //   return super.count + (this.else?.count || 0)\n  // }\n}\n\nabstract class For extends BlockNode {\n  static readonly kind = \"for\"\n}\n\nclass ForLoop extends For {\n  constructor(private iteration: Code) {\n    super()\n  }\n\n  render(opts: CGOptions): string {\n    return `for(${this.iteration})` + super.render(opts)\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n    if (!super.optimizeNames(names, constants)) return\n    this.iteration = optimizeExpr(this.iteration, names, constants)\n    return this\n  }\n\n  get names(): UsedNames {\n    return addNames(super.names, this.iteration.names)\n  }\n}\n\nclass ForRange extends For {\n  constructor(\n    private readonly varKind: Name,\n    private readonly name: Name,\n    private readonly from: SafeExpr,\n    private readonly to: SafeExpr\n  ) {\n    super()\n  }\n\n  render(opts: CGOptions): string {\n    const varKind = opts.es5 ? varKinds.var : this.varKind\n    const {name, from, to} = this\n    return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts)\n  }\n\n  get names(): UsedNames {\n    const names = addExprNames(super.names, this.from)\n    return addExprNames(names, this.to)\n  }\n}\n\nclass ForIter extends For {\n  constructor(\n    private readonly loop: \"of\" | \"in\",\n    private readonly varKind: Name,\n    private readonly name: Name,\n    private iterable: Code\n  ) {\n    super()\n  }\n\n  render(opts: CGOptions): string {\n    return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts)\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n    if (!super.optimizeNames(names, constants)) return\n    this.iterable = optimizeExpr(this.iterable, names, constants)\n    return this\n  }\n\n  get names(): UsedNames {\n    return addNames(super.names, this.iterable.names)\n  }\n}\n\nclass Func extends BlockNode {\n  static readonly kind = \"func\"\n  constructor(\n    public name: Name,\n    public args: Code,\n    public async?: boolean\n  ) {\n    super()\n  }\n\n  render(opts: CGOptions): string {\n    const _async = this.async ? \"async \" : \"\"\n    return `${_async}function ${this.name}(${this.args})` + super.render(opts)\n  }\n}\n\nclass Return extends ParentNode {\n  static readonly kind = \"return\"\n\n  render(opts: CGOptions): string {\n    return \"return \" + super.render(opts)\n  }\n}\n\nclass Try extends BlockNode {\n  catch?: Catch\n  finally?: Finally\n\n  render(opts: CGOptions): string {\n    let code = \"try\" + super.render(opts)\n    if (this.catch) code += this.catch.render(opts)\n    if (this.finally) code += this.finally.render(opts)\n    return code\n  }\n\n  optimizeNodes(): this {\n    super.optimizeNodes()\n    this.catch?.optimizeNodes() as Catch | undefined\n    this.finally?.optimizeNodes() as Finally | undefined\n    return this\n  }\n\n  optimizeNames(names: UsedNames, constants: Constants): this {\n    super.optimizeNames(names, constants)\n    this.catch?.optimizeNames(names, constants)\n    this.finally?.optimizeNames(names, constants)\n    return this\n  }\n\n  get names(): UsedNames {\n    const names = super.names\n    if (this.catch) addNames(names, this.catch.names)\n    if (this.finally) addNames(names, this.finally.names)\n    return names\n  }\n\n  // get count(): number {\n  //   return super.count + (this.catch?.count || 0) + (this.finally?.count || 0)\n  // }\n}\n\nclass Catch extends BlockNode {\n  static readonly kind = \"catch\"\n  constructor(readonly error: Name) {\n    super()\n  }\n\n  render(opts: CGOptions): string {\n    return `catch(${this.error})` + super.render(opts)\n  }\n}\n\nclass Finally extends BlockNode {\n  static readonly kind = \"finally\"\n  render(opts: CGOptions): string {\n    return \"finally\" + super.render(opts)\n  }\n}\n\ntype StartBlockNode = If | For | Func | Return | Try\n\ntype LeafNode = Def | Assign | Label | Break | Throw | AnyCode\n\ntype ChildNode = StartBlockNode | LeafNode\n\ntype EndBlockNodeType =\n  | typeof If\n  | typeof Else\n  | typeof For\n  | typeof Func\n  | typeof Return\n  | typeof Catch\n  | typeof Finally\n\ntype Constants = Record<string, SafeExpr | undefined>\n\nexport interface CodeGenOptions {\n  es5?: boolean\n  lines?: boolean\n  ownProperties?: boolean\n}\n\ninterface CGOptions extends CodeGenOptions {\n  _n: \"\\n\" | \"\"\n}\n\nexport class CodeGen {\n  readonly _scope: Scope\n  readonly _extScope: ValueScope\n  readonly _values: ScopeValueSets = {}\n  private readonly _nodes: ParentNode[]\n  private readonly _blockStarts: number[] = []\n  private readonly _constants: Constants = {}\n  private readonly opts: CGOptions\n\n  constructor(extScope: ValueScope, opts: CodeGenOptions = {}) {\n    this.opts = {...opts, _n: opts.lines ? \"\\n\" : \"\"}\n    this._extScope = extScope\n    this._scope = new Scope({parent: extScope})\n    this._nodes = [new Root()]\n  }\n\n  toString(): string {\n    return this._root.render(this.opts)\n  }\n\n  // returns unique name in the internal scope\n  name(prefix: string): Name {\n    return this._scope.name(prefix)\n  }\n\n  // reserves unique name in the external scope\n  scopeName(prefix: string): ValueScopeName {\n    return this._extScope.name(prefix)\n  }\n\n  // reserves unique name in the external scope and assigns value to it\n  scopeValue(prefixOrName: ValueScopeName | string, value: NameValue): Name {\n    const name = this._extScope.value(prefixOrName, value)\n    const vs = this._values[name.prefix] || (this._values[name.prefix] = new Set())\n    vs.add(name)\n    return name\n  }\n\n  getScopeValue(prefix: string, keyOrRef: unknown): ValueScopeName | undefined {\n    return this._extScope.getValue(prefix, keyOrRef)\n  }\n\n  // return code that assigns values in the external scope to the names that are used internally\n  // (same names that were returned by gen.scopeName or gen.scopeValue)\n  scopeRefs(scopeName: Name): Code {\n    return this._extScope.scopeRefs(scopeName, this._values)\n  }\n\n  scopeCode(): Code {\n    return this._extScope.scopeCode(this._values)\n  }\n\n  private _def(\n    varKind: Name,\n    nameOrPrefix: Name | string,\n    rhs?: SafeExpr,\n    constant?: boolean\n  ): Name {\n    const name = this._scope.toName(nameOrPrefix)\n    if (rhs !== undefined && constant) this._constants[name.str] = rhs\n    this._leafNode(new Def(varKind, name, rhs))\n    return name\n  }\n\n  // `const` declaration (`var` in es5 mode)\n  const(nameOrPrefix: Name | string, rhs: SafeExpr, _constant?: boolean): Name {\n    return this._def(varKinds.const, nameOrPrefix, rhs, _constant)\n  }\n\n  // `let` declaration with optional assignment (`var` in es5 mode)\n  let(nameOrPrefix: Name | string, rhs?: SafeExpr, _constant?: boolean): Name {\n    return this._def(varKinds.let, nameOrPrefix, rhs, _constant)\n  }\n\n  // `var` declaration with optional assignment\n  var(nameOrPrefix: Name | string, rhs?: SafeExpr, _constant?: boolean): Name {\n    return this._def(varKinds.var, nameOrPrefix, rhs, _constant)\n  }\n\n  // assignment code\n  assign(lhs: Code, rhs: SafeExpr, sideEffects?: boolean): CodeGen {\n    return this._leafNode(new Assign(lhs, rhs, sideEffects))\n  }\n\n  // `+=` code\n  add(lhs: Code, rhs: SafeExpr): CodeGen {\n    return this._leafNode(new AssignOp(lhs, operators.ADD, rhs))\n  }\n\n  // appends passed SafeExpr to code or executes Block\n  code(c: Block | SafeExpr): CodeGen {\n    if (typeof c == \"function\") c()\n    else if (c !== nil) this._leafNode(new AnyCode(c))\n    return this\n  }\n\n  // returns code for object literal for the passed argument list of key-value pairs\n  object(...keyValues: [Name | string, SafeExpr | string][]): _Code {\n    const code: CodeItem[] = [\"{\"]\n    for (const [key, value] of keyValues) {\n      if (code.length > 1) code.push(\",\")\n      code.push(key)\n      if (key !== value || this.opts.es5) {\n        code.push(\":\")\n        addCodeArg(code, value)\n      }\n    }\n    code.push(\"}\")\n    return new _Code(code)\n  }\n\n  // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed)\n  if(condition: Code | boolean, thenBody?: Block, elseBody?: Block): CodeGen {\n    this._blockNode(new If(condition))\n\n    if (thenBody && elseBody) {\n      this.code(thenBody).else().code(elseBody).endIf()\n    } else if (thenBody) {\n      this.code(thenBody).endIf()\n    } else if (elseBody) {\n      throw new Error('CodeGen: \"else\" body without \"then\" body')\n    }\n    return this\n  }\n\n  // `else if` clause - invalid without `if` or after `else` clauses\n  elseIf(condition: Code | boolean): CodeGen {\n    return this._elseNode(new If(condition))\n  }\n\n  // `else` clause - only valid after `if` or `else if` clauses\n  else(): CodeGen {\n    return this._elseNode(new Else())\n  }\n\n  // end `if` statement (needed if gen.if was used only with condition)\n  endIf(): CodeGen {\n    return this._endBlockNode(If, Else)\n  }\n\n  private _for(node: For, forBody?: Block): CodeGen {\n    this._blockNode(node)\n    if (forBody) this.code(forBody).endFor()\n    return this\n  }\n\n  // a generic `for` clause (or statement if `forBody` is passed)\n  for(iteration: Code, forBody?: Block): CodeGen {\n    return this._for(new ForLoop(iteration), forBody)\n  }\n\n  // `for` statement for a range of values\n  forRange(\n    nameOrPrefix: Name | string,\n    from: SafeExpr,\n    to: SafeExpr,\n    forBody: (index: Name) => void,\n    varKind: Code = this.opts.es5 ? varKinds.var : varKinds.let\n  ): CodeGen {\n    const name = this._scope.toName(nameOrPrefix)\n    return this._for(new ForRange(varKind, name, from, to), () => forBody(name))\n  }\n\n  // `for-of` statement (in es5 mode replace with a normal for loop)\n  forOf(\n    nameOrPrefix: Name | string,\n    iterable: Code,\n    forBody: (item: Name) => void,\n    varKind: Code = varKinds.const\n  ): CodeGen {\n    const name = this._scope.toName(nameOrPrefix)\n    if (this.opts.es5) {\n      const arr = iterable instanceof Name ? iterable : this.var(\"_arr\", iterable)\n      return this.forRange(\"_i\", 0, _`${arr}.length`, (i) => {\n        this.var(name, _`${arr}[${i}]`)\n        forBody(name)\n      })\n    }\n    return this._for(new ForIter(\"of\", varKind, name, iterable), () => forBody(name))\n  }\n\n  // `for-in` statement.\n  // With option `ownProperties` replaced with a `for-of` loop for object keys\n  forIn(\n    nameOrPrefix: Name | string,\n    obj: Code,\n    forBody: (item: Name) => void,\n    varKind: Code = this.opts.es5 ? varKinds.var : varKinds.const\n  ): CodeGen {\n    if (this.opts.ownProperties) {\n      return this.forOf(nameOrPrefix, _`Object.keys(${obj})`, forBody)\n    }\n    const name = this._scope.toName(nameOrPrefix)\n    return this._for(new ForIter(\"in\", varKind, name, obj), () => forBody(name))\n  }\n\n  // end `for` loop\n  endFor(): CodeGen {\n    return this._endBlockNode(For)\n  }\n\n  // `label` statement\n  label(label: Name): CodeGen {\n    return this._leafNode(new Label(label))\n  }\n\n  // `break` statement\n  break(label?: Code): CodeGen {\n    return this._leafNode(new Break(label))\n  }\n\n  // `return` statement\n  return(value: Block | SafeExpr): CodeGen {\n    const node = new Return()\n    this._blockNode(node)\n    this.code(value)\n    if (node.nodes.length !== 1) throw new Error('CodeGen: \"return\" should have one node')\n    return this._endBlockNode(Return)\n  }\n\n  // `try` statement\n  try(tryBody: Block, catchCode?: (e: Name) => void, finallyCode?: Block): CodeGen {\n    if (!catchCode && !finallyCode) throw new Error('CodeGen: \"try\" without \"catch\" and \"finally\"')\n    const node = new Try()\n    this._blockNode(node)\n    this.code(tryBody)\n    if (catchCode) {\n      const error = this.name(\"e\")\n      this._currNode = node.catch = new Catch(error)\n      catchCode(error)\n    }\n    if (finallyCode) {\n      this._currNode = node.finally = new Finally()\n      this.code(finallyCode)\n    }\n    return this._endBlockNode(Catch, Finally)\n  }\n\n  // `throw` statement\n  throw(error: Code): CodeGen {\n    return this._leafNode(new Throw(error))\n  }\n\n  // start self-balancing block\n  block(body?: Block, nodeCount?: number): CodeGen {\n    this._blockStarts.push(this._nodes.length)\n    if (body) this.code(body).endBlock(nodeCount)\n    return this\n  }\n\n  // end the current self-balancing block\n  endBlock(nodeCount?: number): CodeGen {\n    const len = this._blockStarts.pop()\n    if (len === undefined) throw new Error(\"CodeGen: not in self-balancing block\")\n    const toClose = this._nodes.length - len\n    if (toClose < 0 || (nodeCount !== undefined && toClose !== nodeCount)) {\n      throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`)\n    }\n    this._nodes.length = len\n    return this\n  }\n\n  // `function` heading (or definition if funcBody is passed)\n  func(name: Name, args: Code = nil, async?: boolean, funcBody?: Block): CodeGen {\n    this._blockNode(new Func(name, args, async))\n    if (funcBody) this.code(funcBody).endFunc()\n    return this\n  }\n\n  // end function definition\n  endFunc(): CodeGen {\n    return this._endBlockNode(Func)\n  }\n\n  optimize(n = 1): void {\n    while (n-- > 0) {\n      this._root.optimizeNodes()\n      this._root.optimizeNames(this._root.names, this._constants)\n    }\n  }\n\n  private _leafNode(node: LeafNode): CodeGen {\n    this._currNode.nodes.push(node)\n    return this\n  }\n\n  private _blockNode(node: StartBlockNode): void {\n    this._currNode.nodes.push(node)\n    this._nodes.push(node)\n  }\n\n  private _endBlockNode(N1: EndBlockNodeType, N2?: EndBlockNodeType): CodeGen {\n    const n = this._currNode\n    if (n instanceof N1 || (N2 && n instanceof N2)) {\n      this._nodes.pop()\n      return this\n    }\n    throw new Error(`CodeGen: not in block \"${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}\"`)\n  }\n\n  private _elseNode(node: If | Else): CodeGen {\n    const n = this._currNode\n    if (!(n instanceof If)) {\n      throw new Error('CodeGen: \"else\" without \"if\"')\n    }\n    this._currNode = n.else = node\n    return this\n  }\n\n  private get _root(): Root {\n    return this._nodes[0] as Root\n  }\n\n  private get _currNode(): ParentNode {\n    const ns = this._nodes\n    return ns[ns.length - 1]\n  }\n\n  private set _currNode(node: ParentNode) {\n    const ns = this._nodes\n    ns[ns.length - 1] = node\n  }\n\n  // get nodeCount(): number {\n  //   return this._root.count\n  // }\n}\n\nfunction addNames(names: UsedNames, from: UsedNames): UsedNames {\n  for (const n in from) names[n] = (names[n] || 0) + (from[n] || 0)\n  return names\n}\n\nfunction addExprNames(names: UsedNames, from: SafeExpr): UsedNames {\n  return from instanceof _CodeOrName ? addNames(names, from.names) : names\n}\n\nfunction optimizeExpr<T extends SafeExpr | Code>(expr: T, names: UsedNames, constants: Constants): T\nfunction optimizeExpr(expr: SafeExpr, names: UsedNames, constants: Constants): SafeExpr {\n  if (expr instanceof Name) return replaceName(expr)\n  if (!canOptimize(expr)) return expr\n  return new _Code(\n    expr._items.reduce((items: CodeItem[], c: SafeExpr | string) => {\n      if (c instanceof Name) c = replaceName(c)\n      if (c instanceof _Code) items.push(...c._items)\n      else items.push(c)\n      return items\n    }, [])\n  )\n\n  function replaceName(n: Name): SafeExpr {\n    const c = constants[n.str]\n    if (c === undefined || names[n.str] !== 1) return n\n    delete names[n.str]\n    return c\n  }\n\n  function canOptimize(e: SafeExpr): e is _Code {\n    return (\n      e instanceof _Code &&\n      e._items.some(\n        (c) => c instanceof Name && names[c.str] === 1 && constants[c.str] !== undefined\n      )\n    )\n  }\n}\n\nfunction subtractNames(names: UsedNames, from: UsedNames): void {\n  for (const n in from) names[n] = (names[n] || 0) - (from[n] || 0)\n}\n\nexport function not<T extends Code | SafeExpr>(x: T): T\nexport function not(x: Code | SafeExpr): Code | SafeExpr {\n  return typeof x == \"boolean\" || typeof x == \"number\" || x === null ? !x : _`!${par(x)}`\n}\n\nconst andCode = mappend(operators.AND)\n\n// boolean AND (&&) expression with the passed arguments\nexport function and(...args: Code[]): Code {\n  return args.reduce(andCode)\n}\n\nconst orCode = mappend(operators.OR)\n\n// boolean OR (||) expression with the passed arguments\nexport function or(...args: Code[]): Code {\n  return args.reduce(orCode)\n}\n\ntype MAppend = (x: Code, y: Code) => Code\n\nfunction mappend(op: Code): MAppend {\n  return (x, y) => (x === nil ? y : y === nil ? x : _`${par(x)} ${op} ${par(y)}`)\n}\n\nfunction par(x: Code): Code {\n  return x instanceof Name ? x : _`(${x})`\n}\n"
  },
  {
    "path": "lib/compile/codegen/scope.ts",
    "content": "import {_, nil, Code, Name} from \"./code\"\n\ninterface NameGroup {\n  prefix: string\n  index: number\n}\n\nexport interface NameValue {\n  ref: ValueReference // this is the reference to any value that can be referred to from generated code via `globals` var in the closure\n  key?: unknown // any key to identify a global to avoid duplicates, if not passed ref is used\n  code?: Code // this is the code creating the value needed for standalone code wit_out closure - can be a primitive value, function or import (`require`)\n}\n\nexport type ValueReference = unknown // possibly make CodeGen parameterized type on this type\n\nclass ValueError extends Error {\n  readonly value?: NameValue\n  constructor(name: ValueScopeName) {\n    super(`CodeGen: \"code\" for ${name} not defined`)\n    this.value = name.value\n  }\n}\n\ninterface ScopeOptions {\n  prefixes?: Set<string>\n  parent?: Scope\n}\n\ninterface ValueScopeOptions extends ScopeOptions {\n  scope: ScopeStore\n  es5?: boolean\n  lines?: boolean\n}\n\nexport type ScopeStore = Record<string, ValueReference[] | undefined>\n\ntype ScopeValues = {\n  [Prefix in string]?: Map<unknown, ValueScopeName>\n}\n\nexport type ScopeValueSets = {\n  [Prefix in string]?: Set<ValueScopeName>\n}\n\nexport enum UsedValueState {\n  Started,\n  Completed,\n}\n\nexport type UsedScopeValues = {\n  [Prefix in string]?: Map<ValueScopeName, UsedValueState | undefined>\n}\n\nexport const varKinds = {\n  const: new Name(\"const\"),\n  let: new Name(\"let\"),\n  var: new Name(\"var\"),\n}\n\nexport class Scope {\n  protected readonly _names: {[Prefix in string]?: NameGroup} = {}\n  protected readonly _prefixes?: Set<string>\n  protected readonly _parent?: Scope\n\n  constructor({prefixes, parent}: ScopeOptions = {}) {\n    this._prefixes = prefixes\n    this._parent = parent\n  }\n\n  toName(nameOrPrefix: Name | string): Name {\n    return nameOrPrefix instanceof Name ? nameOrPrefix : this.name(nameOrPrefix)\n  }\n\n  name(prefix: string): Name {\n    return new Name(this._newName(prefix))\n  }\n\n  protected _newName(prefix: string): string {\n    const ng = this._names[prefix] || this._nameGroup(prefix)\n    return `${prefix}${ng.index++}`\n  }\n\n  private _nameGroup(prefix: string): NameGroup {\n    if (this._parent?._prefixes?.has(prefix) || (this._prefixes && !this._prefixes.has(prefix))) {\n      throw new Error(`CodeGen: prefix \"${prefix}\" is not allowed in this scope`)\n    }\n    return (this._names[prefix] = {prefix, index: 0})\n  }\n}\n\ninterface ScopePath {\n  property: string\n  itemIndex: number\n}\n\nexport class ValueScopeName extends Name {\n  readonly prefix: string\n  value?: NameValue\n  scopePath?: Code\n\n  constructor(prefix: string, nameStr: string) {\n    super(nameStr)\n    this.prefix = prefix\n  }\n\n  setValue(value: NameValue, {property, itemIndex}: ScopePath): void {\n    this.value = value\n    this.scopePath = _`.${new Name(property)}[${itemIndex}]`\n  }\n}\n\ninterface VSOptions extends ValueScopeOptions {\n  _n: Code\n}\n\nconst line = _`\\n`\n\nexport class ValueScope extends Scope {\n  protected readonly _values: ScopeValues = {}\n  protected readonly _scope: ScopeStore\n  readonly opts: VSOptions\n\n  constructor(opts: ValueScopeOptions) {\n    super(opts)\n    this._scope = opts.scope\n    this.opts = {...opts, _n: opts.lines ? line : nil}\n  }\n\n  get(): ScopeStore {\n    return this._scope\n  }\n\n  name(prefix: string): ValueScopeName {\n    return new ValueScopeName(prefix, this._newName(prefix))\n  }\n\n  value(nameOrPrefix: ValueScopeName | string, value: NameValue): ValueScopeName {\n    if (value.ref === undefined) throw new Error(\"CodeGen: ref must be passed in value\")\n    const name = this.toName(nameOrPrefix) as ValueScopeName\n    const {prefix} = name\n    const valueKey = value.key ?? value.ref\n    let vs = this._values[prefix]\n    if (vs) {\n      const _name = vs.get(valueKey)\n      if (_name) return _name\n    } else {\n      vs = this._values[prefix] = new Map()\n    }\n    vs.set(valueKey, name)\n\n    const s = this._scope[prefix] || (this._scope[prefix] = [])\n    const itemIndex = s.length\n    s[itemIndex] = value.ref\n    name.setValue(value, {property: prefix, itemIndex})\n    return name\n  }\n\n  getValue(prefix: string, keyOrRef: unknown): ValueScopeName | undefined {\n    const vs = this._values[prefix]\n    if (!vs) return\n    return vs.get(keyOrRef)\n  }\n\n  scopeRefs(scopeName: Name, values: ScopeValues | ScopeValueSets = this._values): Code {\n    return this._reduceValues(values, (name: ValueScopeName) => {\n      if (name.scopePath === undefined) throw new Error(`CodeGen: name \"${name}\" has no value`)\n      return _`${scopeName}${name.scopePath}`\n    })\n  }\n\n  scopeCode(\n    values: ScopeValues | ScopeValueSets = this._values,\n    usedValues?: UsedScopeValues,\n    getCode?: (n: ValueScopeName) => Code | undefined\n  ): Code {\n    return this._reduceValues(\n      values,\n      (name: ValueScopeName) => {\n        if (name.value === undefined) throw new Error(`CodeGen: name \"${name}\" has no value`)\n        return name.value.code\n      },\n      usedValues,\n      getCode\n    )\n  }\n\n  private _reduceValues(\n    values: ScopeValues | ScopeValueSets,\n    valueCode: (n: ValueScopeName) => Code | undefined,\n    usedValues: UsedScopeValues = {},\n    getCode?: (n: ValueScopeName) => Code | undefined\n  ): Code {\n    let code: Code = nil\n    for (const prefix in values) {\n      const vs = values[prefix]\n      if (!vs) continue\n      const nameSet = (usedValues[prefix] = usedValues[prefix] || new Map())\n      vs.forEach((name: ValueScopeName) => {\n        if (nameSet.has(name)) return\n        nameSet.set(name, UsedValueState.Started)\n        let c = valueCode(name)\n        if (c) {\n          const def = this.opts.es5 ? varKinds.var : varKinds.const\n          code = _`${code}${def} ${name} = ${c};${this.opts._n}`\n        } else if ((c = getCode?.(name))) {\n          code = _`${code}${c}${this.opts._n}`\n        } else {\n          throw new ValueError(name)\n        }\n        nameSet.set(name, UsedValueState.Completed)\n      })\n    }\n    return code\n  }\n}\n"
  },
  {
    "path": "lib/compile/errors.ts",
    "content": "import type {KeywordErrorCxt, KeywordErrorDefinition} from \"../types\"\nimport type {SchemaCxt} from \"./index\"\nimport {CodeGen, _, str, strConcat, Code, Name} from \"./codegen\"\nimport {SafeExpr} from \"./codegen/code\"\nimport {getErrorPath, Type} from \"./util\"\nimport N from \"./names\"\n\nexport const keywordError: KeywordErrorDefinition = {\n  message: ({keyword}) => str`must pass \"${keyword}\" keyword validation`,\n}\n\nexport const keyword$DataError: KeywordErrorDefinition = {\n  message: ({keyword, schemaType}) =>\n    schemaType\n      ? str`\"${keyword}\" keyword must be ${schemaType} ($data)`\n      : str`\"${keyword}\" keyword is invalid ($data)`,\n}\n\nexport interface ErrorPaths {\n  instancePath?: Code\n  schemaPath?: string\n  parentSchema?: boolean\n}\n\nexport function reportError(\n  cxt: KeywordErrorCxt,\n  error: KeywordErrorDefinition = keywordError,\n  errorPaths?: ErrorPaths,\n  overrideAllErrors?: boolean\n): void {\n  const {it} = cxt\n  const {gen, compositeRule, allErrors} = it\n  const errObj = errorObjectCode(cxt, error, errorPaths)\n  if (overrideAllErrors ?? (compositeRule || allErrors)) {\n    addError(gen, errObj)\n  } else {\n    returnErrors(it, _`[${errObj}]`)\n  }\n}\n\nexport function reportExtraError(\n  cxt: KeywordErrorCxt,\n  error: KeywordErrorDefinition = keywordError,\n  errorPaths?: ErrorPaths\n): void {\n  const {it} = cxt\n  const {gen, compositeRule, allErrors} = it\n  const errObj = errorObjectCode(cxt, error, errorPaths)\n  addError(gen, errObj)\n  if (!(compositeRule || allErrors)) {\n    returnErrors(it, N.vErrors)\n  }\n}\n\nexport function resetErrorsCount(gen: CodeGen, errsCount: Name): void {\n  gen.assign(N.errors, errsCount)\n  gen.if(_`${N.vErrors} !== null`, () =>\n    gen.if(\n      errsCount,\n      () => gen.assign(_`${N.vErrors}.length`, errsCount),\n      () => gen.assign(N.vErrors, null)\n    )\n  )\n}\n\nexport function extendErrors({\n  gen,\n  keyword,\n  schemaValue,\n  data,\n  errsCount,\n  it,\n}: KeywordErrorCxt): void {\n  /* istanbul ignore if */\n  if (errsCount === undefined) throw new Error(\"ajv implementation error\")\n  const err = gen.name(\"err\")\n  gen.forRange(\"i\", errsCount, N.errors, (i) => {\n    gen.const(err, _`${N.vErrors}[${i}]`)\n    gen.if(_`${err}.instancePath === undefined`, () =>\n      gen.assign(_`${err}.instancePath`, strConcat(N.instancePath, it.errorPath))\n    )\n    gen.assign(_`${err}.schemaPath`, str`${it.errSchemaPath}/${keyword}`)\n    if (it.opts.verbose) {\n      gen.assign(_`${err}.schema`, schemaValue)\n      gen.assign(_`${err}.data`, data)\n    }\n  })\n}\n\nfunction addError(gen: CodeGen, errObj: Code): void {\n  const err = gen.const(\"err\", errObj)\n  gen.if(\n    _`${N.vErrors} === null`,\n    () => gen.assign(N.vErrors, _`[${err}]`),\n    _`${N.vErrors}.push(${err})`\n  )\n  gen.code(_`${N.errors}++`)\n}\n\nfunction returnErrors(it: SchemaCxt, errs: Code): void {\n  const {gen, validateName, schemaEnv} = it\n  if (schemaEnv.$async) {\n    gen.throw(_`new ${it.ValidationError as Name}(${errs})`)\n  } else {\n    gen.assign(_`${validateName}.errors`, errs)\n    gen.return(false)\n  }\n}\n\nconst E = {\n  keyword: new Name(\"keyword\"),\n  schemaPath: new Name(\"schemaPath\"), // also used in JTD errors\n  params: new Name(\"params\"),\n  propertyName: new Name(\"propertyName\"),\n  message: new Name(\"message\"),\n  schema: new Name(\"schema\"),\n  parentSchema: new Name(\"parentSchema\"),\n}\n\nfunction errorObjectCode(\n  cxt: KeywordErrorCxt,\n  error: KeywordErrorDefinition,\n  errorPaths?: ErrorPaths\n): Code {\n  const {createErrors} = cxt.it\n  if (createErrors === false) return _`{}`\n  return errorObject(cxt, error, errorPaths)\n}\n\nfunction errorObject(\n  cxt: KeywordErrorCxt,\n  error: KeywordErrorDefinition,\n  errorPaths: ErrorPaths = {}\n): Code {\n  const {gen, it} = cxt\n  const keyValues: [Name, SafeExpr | string][] = [\n    errorInstancePath(it, errorPaths),\n    errorSchemaPath(cxt, errorPaths),\n  ]\n  extraErrorProps(cxt, error, keyValues)\n  return gen.object(...keyValues)\n}\n\nfunction errorInstancePath({errorPath}: SchemaCxt, {instancePath}: ErrorPaths): [Name, Code] {\n  const instPath = instancePath\n    ? str`${errorPath}${getErrorPath(instancePath, Type.Str)}`\n    : errorPath\n  return [N.instancePath, strConcat(N.instancePath, instPath)]\n}\n\nfunction errorSchemaPath(\n  {keyword, it: {errSchemaPath}}: KeywordErrorCxt,\n  {schemaPath, parentSchema}: ErrorPaths\n): [Name, string | Code] {\n  let schPath = parentSchema ? errSchemaPath : str`${errSchemaPath}/${keyword}`\n  if (schemaPath) {\n    schPath = str`${schPath}${getErrorPath(schemaPath, Type.Str)}`\n  }\n  return [E.schemaPath, schPath]\n}\n\nfunction extraErrorProps(\n  cxt: KeywordErrorCxt,\n  {params, message}: KeywordErrorDefinition,\n  keyValues: [Name, SafeExpr | string][]\n): void {\n  const {keyword, data, schemaValue, it} = cxt\n  const {opts, propertyName, topSchemaRef, schemaPath} = it\n  keyValues.push(\n    [E.keyword, keyword],\n    [E.params, typeof params == \"function\" ? params(cxt) : params || _`{}`]\n  )\n  if (opts.messages) {\n    keyValues.push([E.message, typeof message == \"function\" ? message(cxt) : message])\n  }\n  if (opts.verbose) {\n    keyValues.push(\n      [E.schema, schemaValue],\n      [E.parentSchema, _`${topSchemaRef}${schemaPath}`],\n      [N.data, data]\n    )\n  }\n  if (propertyName) keyValues.push([E.propertyName, propertyName])\n}\n"
  },
  {
    "path": "lib/compile/index.ts",
    "content": "import type {\n  AnySchema,\n  AnySchemaObject,\n  AnyValidateFunction,\n  AsyncValidateFunction,\n  EvaluatedProperties,\n  EvaluatedItems,\n} from \"../types\"\nimport type Ajv from \"../core\"\nimport type {InstanceOptions} from \"../core\"\nimport {CodeGen, _, nil, stringify, Name, Code, ValueScopeName} from \"./codegen\"\nimport ValidationError from \"../runtime/validation_error\"\nimport N from \"./names\"\nimport {LocalRefs, getFullPath, _getFullPath, inlineRef, normalizeId, resolveUrl} from \"./resolve\"\nimport {schemaHasRulesButRef, unescapeFragment} from \"./util\"\nimport {validateFunctionCode} from \"./validate\"\nimport {URIComponent} from \"fast-uri\"\nimport {JSONType} from \"./rules\"\n\nexport type SchemaRefs = {\n  [Ref in string]?: SchemaEnv | AnySchema\n}\n\nexport interface SchemaCxt {\n  readonly gen: CodeGen\n  readonly allErrors?: boolean // validation mode - whether to collect all errors or break on error\n  readonly data: Name // Name with reference to the current part of data instance\n  readonly parentData: Name // should be used in keywords modifying data\n  readonly parentDataProperty: Code | number // should be used in keywords modifying data\n  readonly dataNames: Name[]\n  readonly dataPathArr: (Code | number)[]\n  readonly dataLevel: number // the level of the currently validated data,\n  // it can be used to access both the property names and the data on all levels from the top.\n  dataTypes: JSONType[] // data types applied to the current part of data instance\n  definedProperties: Set<string> // set of properties to keep track of for required checks\n  readonly topSchemaRef: Code\n  readonly validateName: Name\n  evaluated?: Name\n  readonly ValidationError?: Name\n  readonly schema: AnySchema // current schema object - equal to parentSchema passed via KeywordCxt\n  readonly schemaEnv: SchemaEnv\n  readonly rootId: string\n  baseId: string // the current schema base URI that should be used as the base for resolving URIs in references (\\$ref)\n  readonly schemaPath: Code // the run-time expression that evaluates to the property name of the current schema\n  readonly errSchemaPath: string // this is actual string, should not be changed to Code\n  readonly errorPath: Code\n  readonly propertyName?: Name\n  readonly compositeRule?: boolean // true indicates that the current schema is inside the compound keyword,\n  // where failing some rule doesn't mean validation failure (`anyOf`, `oneOf`, `not`, `if`).\n  // This flag is used to determine whether you can return validation result immediately after any error in case the option `allErrors` is not `true.\n  // You only need to use it if you have many steps in your keywords and potentially can define multiple errors.\n  props?: EvaluatedProperties | Name // properties evaluated by this schema - used by parent schema or assigned to validation function\n  items?: EvaluatedItems | Name // last item evaluated by this schema - used by parent schema or assigned to validation function\n  jtdDiscriminator?: string\n  jtdMetadata?: boolean\n  readonly createErrors?: boolean\n  readonly opts: InstanceOptions // Ajv instance option.\n  readonly self: Ajv // current Ajv instance\n}\n\nexport interface SchemaObjCxt extends SchemaCxt {\n  readonly schema: AnySchemaObject\n}\ninterface SchemaEnvArgs {\n  readonly schema: AnySchema\n  readonly schemaId?: \"$id\" | \"id\"\n  readonly root?: SchemaEnv\n  readonly baseId?: string\n  readonly schemaPath?: string\n  readonly localRefs?: LocalRefs\n  readonly meta?: boolean\n}\n\nexport class SchemaEnv implements SchemaEnvArgs {\n  readonly schema: AnySchema\n  readonly schemaId?: \"$id\" | \"id\"\n  readonly root: SchemaEnv\n  baseId: string // TODO possibly, it should be readonly\n  schemaPath?: string\n  localRefs?: LocalRefs\n  readonly meta?: boolean\n  readonly $async?: boolean // true if the current schema is asynchronous.\n  readonly refs: SchemaRefs = {}\n  readonly dynamicAnchors: {[Ref in string]?: true} = {}\n  validate?: AnyValidateFunction\n  validateName?: ValueScopeName\n  serialize?: (data: unknown) => string\n  serializeName?: ValueScopeName\n  parse?: (data: string) => unknown\n  parseName?: ValueScopeName\n\n  constructor(env: SchemaEnvArgs) {\n    let schema: AnySchemaObject | undefined\n    if (typeof env.schema == \"object\") schema = env.schema\n    this.schema = env.schema\n    this.schemaId = env.schemaId\n    this.root = env.root || this\n    this.baseId = env.baseId ?? normalizeId(schema?.[env.schemaId || \"$id\"])\n    this.schemaPath = env.schemaPath\n    this.localRefs = env.localRefs\n    this.meta = env.meta\n    this.$async = schema?.$async\n    this.refs = {}\n  }\n}\n\n// let codeSize = 0\n// let nodeCount = 0\n\n// Compiles schema in SchemaEnv\nexport function compileSchema(this: Ajv, sch: SchemaEnv): SchemaEnv {\n  // TODO refactor - remove compilations\n  const _sch = getCompilingSchema.call(this, sch)\n  if (_sch) return _sch\n  const rootId = getFullPath(this.opts.uriResolver, sch.root.baseId) // TODO if getFullPath removed 1 tests fails\n  const {es5, lines} = this.opts.code\n  const {ownProperties} = this.opts\n  const gen = new CodeGen(this.scope, {es5, lines, ownProperties})\n  let _ValidationError\n  if (sch.$async) {\n    _ValidationError = gen.scopeValue(\"Error\", {\n      ref: ValidationError,\n      code: _`require(\"ajv/dist/runtime/validation_error\").default`,\n    })\n  }\n\n  const validateName = gen.scopeName(\"validate\")\n  sch.validateName = validateName\n\n  const schemaCxt: SchemaCxt = {\n    gen,\n    allErrors: this.opts.allErrors,\n    data: N.data,\n    parentData: N.parentData,\n    parentDataProperty: N.parentDataProperty,\n    dataNames: [N.data],\n    dataPathArr: [nil], // TODO can its length be used as dataLevel if nil is removed?\n    dataLevel: 0,\n    dataTypes: [],\n    definedProperties: new Set<string>(),\n    topSchemaRef: gen.scopeValue(\n      \"schema\",\n      this.opts.code.source === true\n        ? {ref: sch.schema, code: stringify(sch.schema)}\n        : {ref: sch.schema}\n    ),\n    validateName,\n    ValidationError: _ValidationError,\n    schema: sch.schema,\n    schemaEnv: sch,\n    rootId,\n    baseId: sch.baseId || rootId,\n    schemaPath: nil,\n    errSchemaPath: sch.schemaPath || (this.opts.jtd ? \"\" : \"#\"),\n    errorPath: _`\"\"`,\n    opts: this.opts,\n    self: this,\n  }\n\n  let sourceCode: string | undefined\n  try {\n    this._compilations.add(sch)\n    validateFunctionCode(schemaCxt)\n    gen.optimize(this.opts.code.optimize)\n    // gen.optimize(1)\n    const validateCode = gen.toString()\n    sourceCode = `${gen.scopeRefs(N.scope)}return ${validateCode}`\n    // console.log((codeSize += sourceCode.length), (nodeCount += gen.nodeCount))\n    if (this.opts.code.process) sourceCode = this.opts.code.process(sourceCode, sch)\n    // console.log(\"\\n\\n\\n *** \\n\", sourceCode)\n    const makeValidate = new Function(`${N.self}`, `${N.scope}`, sourceCode)\n    const validate: AnyValidateFunction = makeValidate(this, this.scope.get())\n    this.scope.value(validateName, {ref: validate})\n\n    validate.errors = null\n    validate.schema = sch.schema\n    validate.schemaEnv = sch\n    if (sch.$async) (validate as AsyncValidateFunction).$async = true\n    if (this.opts.code.source === true) {\n      validate.source = {validateName, validateCode, scopeValues: gen._values}\n    }\n    if (this.opts.unevaluated) {\n      const {props, items} = schemaCxt\n      validate.evaluated = {\n        props: props instanceof Name ? undefined : props,\n        items: items instanceof Name ? undefined : items,\n        dynamicProps: props instanceof Name,\n        dynamicItems: items instanceof Name,\n      }\n      if (validate.source) validate.source.evaluated = stringify(validate.evaluated)\n    }\n    sch.validate = validate\n    return sch\n  } catch (e) {\n    delete sch.validate\n    delete sch.validateName\n    if (sourceCode) this.logger.error(\"Error compiling schema, function code:\", sourceCode)\n    // console.log(\"\\n\\n\\n *** \\n\", sourceCode, this.opts)\n    throw e\n  } finally {\n    this._compilations.delete(sch)\n  }\n}\n\nexport function resolveRef(\n  this: Ajv,\n  root: SchemaEnv,\n  baseId: string,\n  ref: string\n): AnySchema | SchemaEnv | undefined {\n  ref = resolveUrl(this.opts.uriResolver, baseId, ref)\n  const schOrFunc = root.refs[ref]\n  if (schOrFunc) return schOrFunc\n\n  let _sch = resolve.call(this, root, ref)\n  if (_sch === undefined) {\n    const schema = root.localRefs?.[ref] // TODO maybe localRefs should hold SchemaEnv\n    const {schemaId} = this.opts\n    if (schema) _sch = new SchemaEnv({schema, schemaId, root, baseId})\n  }\n\n  if (_sch === undefined) return\n  return (root.refs[ref] = inlineOrCompile.call(this, _sch))\n}\n\nfunction inlineOrCompile(this: Ajv, sch: SchemaEnv): AnySchema | SchemaEnv {\n  if (inlineRef(sch.schema, this.opts.inlineRefs)) return sch.schema\n  return sch.validate ? sch : compileSchema.call(this, sch)\n}\n\n// Index of schema compilation in the currently compiled list\nexport function getCompilingSchema(this: Ajv, schEnv: SchemaEnv): SchemaEnv | void {\n  for (const sch of this._compilations) {\n    if (sameSchemaEnv(sch, schEnv)) return sch\n  }\n}\n\nfunction sameSchemaEnv(s1: SchemaEnv, s2: SchemaEnv): boolean {\n  return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId\n}\n\n// resolve and compile the references ($ref)\n// TODO returns AnySchemaObject (if the schema can be inlined) or validation function\nfunction resolve(\n  this: Ajv,\n  root: SchemaEnv, // information about the root schema for the current schema\n  ref: string // reference to resolve\n): SchemaEnv | undefined {\n  let sch\n  while (typeof (sch = this.refs[ref]) == \"string\") ref = sch\n  return sch || this.schemas[ref] || resolveSchema.call(this, root, ref)\n}\n\n// Resolve schema, its root and baseId\nexport function resolveSchema(\n  this: Ajv,\n  root: SchemaEnv, // root object with properties schema, refs TODO below SchemaEnv is assigned to it\n  ref: string // reference to resolve\n): SchemaEnv | undefined {\n  const p = this.opts.uriResolver.parse(ref)\n  const refPath = _getFullPath(this.opts.uriResolver, p)\n  let baseId = getFullPath(this.opts.uriResolver, root.baseId, undefined)\n  // TODO `Object.keys(root.schema).length > 0` should not be needed - but removing breaks 2 tests\n  if (Object.keys(root.schema).length > 0 && refPath === baseId) {\n    return getJsonPointer.call(this, p, root)\n  }\n\n  const id = normalizeId(refPath)\n  const schOrRef = this.refs[id] || this.schemas[id]\n  if (typeof schOrRef == \"string\") {\n    const sch = resolveSchema.call(this, root, schOrRef)\n    if (typeof sch?.schema !== \"object\") return\n    return getJsonPointer.call(this, p, sch)\n  }\n\n  if (typeof schOrRef?.schema !== \"object\") return\n  if (!schOrRef.validate) compileSchema.call(this, schOrRef)\n  if (id === normalizeId(ref)) {\n    const {schema} = schOrRef\n    const {schemaId} = this.opts\n    const schId = schema[schemaId]\n    if (schId) baseId = resolveUrl(this.opts.uriResolver, baseId, schId)\n    return new SchemaEnv({schema, schemaId, root, baseId})\n  }\n  return getJsonPointer.call(this, p, schOrRef)\n}\n\nconst PREVENT_SCOPE_CHANGE = new Set([\n  \"properties\",\n  \"patternProperties\",\n  \"enum\",\n  \"dependencies\",\n  \"definitions\",\n])\n\nfunction getJsonPointer(\n  this: Ajv,\n  parsedRef: URIComponent,\n  {baseId, schema, root}: SchemaEnv\n): SchemaEnv | undefined {\n  if (parsedRef.fragment?.[0] !== \"/\") return\n  for (const part of parsedRef.fragment.slice(1).split(\"/\")) {\n    if (typeof schema === \"boolean\") return\n    const partSchema = schema[unescapeFragment(part)]\n    if (partSchema === undefined) return\n    schema = partSchema\n    // TODO PREVENT_SCOPE_CHANGE could be defined in keyword def?\n    const schId = typeof schema === \"object\" && schema[this.opts.schemaId]\n    if (!PREVENT_SCOPE_CHANGE.has(part) && schId) {\n      baseId = resolveUrl(this.opts.uriResolver, baseId, schId)\n    }\n  }\n  let env: SchemaEnv | undefined\n  if (typeof schema != \"boolean\" && schema.$ref && !schemaHasRulesButRef(schema, this.RULES)) {\n    const $ref = resolveUrl(this.opts.uriResolver, baseId, schema.$ref)\n    env = resolveSchema.call(this, root, $ref)\n  }\n  // even though resolution failed we need to return SchemaEnv to throw exception\n  // so that compileAsync loads missing schema.\n  const {schemaId} = this.opts\n  env = env || new SchemaEnv({schema, schemaId, root, baseId})\n  if (env.schema !== env.root.schema) return env\n  return undefined\n}\n"
  },
  {
    "path": "lib/compile/jtd/parse.ts",
    "content": "import type Ajv from \"../../core\"\nimport type {SchemaObject} from \"../../types\"\nimport {jtdForms, JTDForm, SchemaObjectMap} from \"./types\"\nimport {SchemaEnv, getCompilingSchema} from \"..\"\nimport {_, str, and, or, nil, not, CodeGen, Code, Name, SafeExpr} from \"../codegen\"\nimport MissingRefError from \"../ref_error\"\nimport N from \"../names\"\nimport {hasPropFunc} from \"../../vocabularies/code\"\nimport {hasRef} from \"../../vocabularies/jtd/ref\"\nimport {intRange, IntType} from \"../../vocabularies/jtd/type\"\nimport {parseJson, parseJsonNumber, parseJsonString} from \"../../runtime/parseJson\"\nimport {useFunc} from \"../util\"\nimport validTimestamp from \"../../runtime/timestamp\"\n\ntype GenParse = (cxt: ParseCxt) => void\n\nconst genParse: {[F in JTDForm]: GenParse} = {\n  elements: parseElements,\n  values: parseValues,\n  discriminator: parseDiscriminator,\n  properties: parseProperties,\n  optionalProperties: parseProperties,\n  enum: parseEnum,\n  type: parseType,\n  ref: parseRef,\n}\n\ninterface ParseCxt {\n  readonly gen: CodeGen\n  readonly self: Ajv // current Ajv instance\n  readonly schemaEnv: SchemaEnv\n  readonly definitions: SchemaObjectMap\n  schema: SchemaObject\n  data: Code\n  parseName: Name\n  char: Name\n}\n\nexport default function compileParser(\n  this: Ajv,\n  sch: SchemaEnv,\n  definitions: SchemaObjectMap\n): SchemaEnv {\n  const _sch = getCompilingSchema.call(this, sch)\n  if (_sch) return _sch\n  const {es5, lines} = this.opts.code\n  const {ownProperties} = this.opts\n  const gen = new CodeGen(this.scope, {es5, lines, ownProperties})\n  const parseName = gen.scopeName(\"parse\")\n  const cxt: ParseCxt = {\n    self: this,\n    gen,\n    schema: sch.schema as SchemaObject,\n    schemaEnv: sch,\n    definitions,\n    data: N.data,\n    parseName,\n    char: gen.name(\"c\"),\n  }\n\n  let sourceCode: string | undefined\n  try {\n    this._compilations.add(sch)\n    sch.parseName = parseName\n    parserFunction(cxt)\n    gen.optimize(this.opts.code.optimize)\n    const parseFuncCode = gen.toString()\n    sourceCode = `${gen.scopeRefs(N.scope)}return ${parseFuncCode}`\n    const makeParse = new Function(`${N.scope}`, sourceCode)\n    const parse: (json: string) => unknown = makeParse(this.scope.get())\n    this.scope.value(parseName, {ref: parse})\n    sch.parse = parse\n  } catch (e) {\n    if (sourceCode) this.logger.error(\"Error compiling parser, function code:\", sourceCode)\n    delete sch.parse\n    delete sch.parseName\n    throw e\n  } finally {\n    this._compilations.delete(sch)\n  }\n  return sch\n}\n\nconst undef = _`undefined`\n\nfunction parserFunction(cxt: ParseCxt): void {\n  const {gen, parseName, char} = cxt\n  gen.func(parseName, _`${N.json}, ${N.jsonPos}, ${N.jsonPart}`, false, () => {\n    gen.let(N.data)\n    gen.let(char)\n    gen.assign(_`${parseName}.message`, undef)\n    gen.assign(_`${parseName}.position`, undef)\n    gen.assign(N.jsonPos, _`${N.jsonPos} || 0`)\n    gen.const(N.jsonLen, _`${N.json}.length`)\n    parseCode(cxt)\n    skipWhitespace(cxt)\n    gen.if(N.jsonPart, () => {\n      gen.assign(_`${parseName}.position`, N.jsonPos)\n      gen.return(N.data)\n    })\n    gen.if(_`${N.jsonPos} === ${N.jsonLen}`, () => gen.return(N.data))\n    jsonSyntaxError(cxt)\n  })\n}\n\nfunction parseCode(cxt: ParseCxt): void {\n  let form: JTDForm | undefined\n  for (const key of jtdForms) {\n    if (key in cxt.schema) {\n      form = key\n      break\n    }\n  }\n  if (form) parseNullable(cxt, genParse[form])\n  else parseEmpty(cxt)\n}\n\nconst parseBoolean = parseBooleanToken(true, parseBooleanToken(false, jsonSyntaxError))\n\nfunction parseNullable(cxt: ParseCxt, parseForm: GenParse): void {\n  const {gen, schema, data} = cxt\n  if (!schema.nullable) return parseForm(cxt)\n  tryParseToken(cxt, \"null\", parseForm, () => gen.assign(data, null))\n}\n\nfunction parseElements(cxt: ParseCxt): void {\n  const {gen, schema, data} = cxt\n  parseToken(cxt, \"[\")\n  const ix = gen.let(\"i\", 0)\n  gen.assign(data, _`[]`)\n  parseItems(cxt, \"]\", () => {\n    const el = gen.let(\"el\")\n    parseCode({...cxt, schema: schema.elements, data: el})\n    gen.assign(_`${data}[${ix}++]`, el)\n  })\n}\n\nfunction parseValues(cxt: ParseCxt): void {\n  const {gen, schema, data} = cxt\n  parseToken(cxt, \"{\")\n  gen.assign(data, _`{}`)\n  parseItems(cxt, \"}\", () => parseKeyValue(cxt, schema.values))\n}\n\nfunction parseItems(cxt: ParseCxt, endToken: string, block: () => void): void {\n  tryParseItems(cxt, endToken, block)\n  parseToken(cxt, endToken)\n}\n\nfunction tryParseItems(cxt: ParseCxt, endToken: string, block: () => void): void {\n  const {gen} = cxt\n  gen.for(_`;${N.jsonPos}<${N.jsonLen} && ${jsonSlice(1)}!==${endToken};`, () => {\n    block()\n    tryParseToken(cxt, \",\", () => gen.break(), hasItem)\n  })\n\n  function hasItem(): void {\n    tryParseToken(cxt, endToken, () => {}, jsonSyntaxError)\n  }\n}\n\nfunction parseKeyValue(cxt: ParseCxt, schema: SchemaObject): void {\n  const {gen} = cxt\n  const key = gen.let(\"key\")\n  parseString({...cxt, data: key})\n  parseToken(cxt, \":\")\n  parsePropertyValue(cxt, key, schema)\n}\n\nfunction parseDiscriminator(cxt: ParseCxt): void {\n  const {gen, data, schema} = cxt\n  const {discriminator, mapping} = schema\n  parseToken(cxt, \"{\")\n  gen.assign(data, _`{}`)\n  const startPos = gen.const(\"pos\", N.jsonPos)\n  const value = gen.let(\"value\")\n  const tag = gen.let(\"tag\")\n  tryParseItems(cxt, \"}\", () => {\n    const key = gen.let(\"key\")\n    parseString({...cxt, data: key})\n    parseToken(cxt, \":\")\n    gen.if(\n      _`${key} === ${discriminator}`,\n      () => {\n        parseString({...cxt, data: tag})\n        gen.assign(_`${data}[${key}]`, tag)\n        gen.break()\n      },\n      () => parseEmpty({...cxt, data: value}) // can be discarded/skipped\n    )\n  })\n  gen.assign(N.jsonPos, startPos)\n  gen.if(_`${tag} === undefined`)\n  parsingError(cxt, str`discriminator tag not found`)\n  for (const tagValue in mapping) {\n    gen.elseIf(_`${tag} === ${tagValue}`)\n    parseSchemaProperties({...cxt, schema: mapping[tagValue]}, discriminator)\n  }\n  gen.else()\n  parsingError(cxt, str`discriminator value not in schema`)\n  gen.endIf()\n}\n\nfunction parseProperties(cxt: ParseCxt): void {\n  const {gen, data} = cxt\n  parseToken(cxt, \"{\")\n  gen.assign(data, _`{}`)\n  parseSchemaProperties(cxt)\n}\n\nfunction parseSchemaProperties(cxt: ParseCxt, discriminator?: string): void {\n  const {gen, schema, data} = cxt\n  const {properties, optionalProperties, additionalProperties} = schema\n  parseItems(cxt, \"}\", () => {\n    const key = gen.let(\"key\")\n    parseString({...cxt, data: key})\n    parseToken(cxt, \":\")\n    gen.if(false)\n    parseDefinedProperty(cxt, key, properties)\n    parseDefinedProperty(cxt, key, optionalProperties)\n    if (discriminator) {\n      gen.elseIf(_`${key} === ${discriminator}`)\n      const tag = gen.let(\"tag\")\n      parseString({...cxt, data: tag}) // can be discarded, it is already assigned\n    }\n    gen.else()\n    if (additionalProperties) {\n      parseEmpty({...cxt, data: _`${data}[${key}]`})\n    } else {\n      parsingError(cxt, str`property ${key} not allowed`)\n    }\n    gen.endIf()\n  })\n  if (properties) {\n    const hasProp = hasPropFunc(gen)\n    const allProps: Code = and(\n      ...Object.keys(properties).map((p): Code => _`${hasProp}.call(${data}, ${p})`)\n    )\n    gen.if(not(allProps), () => parsingError(cxt, str`missing required properties`))\n  }\n}\n\nfunction parseDefinedProperty(cxt: ParseCxt, key: Name, schemas: SchemaObjectMap = {}): void {\n  const {gen} = cxt\n  for (const prop in schemas) {\n    gen.elseIf(_`${key} === ${prop}`)\n    parsePropertyValue(cxt, key, schemas[prop] as SchemaObject)\n  }\n}\n\nfunction parsePropertyValue(cxt: ParseCxt, key: Name, schema: SchemaObject): void {\n  parseCode({...cxt, schema, data: _`${cxt.data}[${key}]`})\n}\n\nfunction parseType(cxt: ParseCxt): void {\n  const {gen, schema, data, self} = cxt\n  switch (schema.type) {\n    case \"boolean\":\n      parseBoolean(cxt)\n      break\n    case \"string\":\n      parseString(cxt)\n      break\n    case \"timestamp\": {\n      parseString(cxt)\n      const vts = useFunc(gen, validTimestamp)\n      const {allowDate, parseDate} = self.opts\n      const notValid = allowDate ? _`!${vts}(${data}, true)` : _`!${vts}(${data})`\n      const fail: Code = parseDate\n        ? or(notValid, _`(${data} = new Date(${data}), false)`, _`isNaN(${data}.valueOf())`)\n        : notValid\n      gen.if(fail, () => parsingError(cxt, str`invalid timestamp`))\n      break\n    }\n    case \"float32\":\n    case \"float64\":\n      parseNumber(cxt)\n      break\n    default: {\n      const t = schema.type as IntType\n      if (!self.opts.int32range && (t === \"int32\" || t === \"uint32\")) {\n        parseNumber(cxt, 16) // 2 ** 53 - max safe integer\n        if (t === \"uint32\") {\n          gen.if(_`${data} < 0`, () => parsingError(cxt, str`integer out of range`))\n        }\n      } else {\n        const [min, max, maxDigits] = intRange[t]\n        parseNumber(cxt, maxDigits)\n        gen.if(_`${data} < ${min} || ${data} > ${max}`, () =>\n          parsingError(cxt, str`integer out of range`)\n        )\n      }\n    }\n  }\n}\n\nfunction parseString(cxt: ParseCxt): void {\n  parseToken(cxt, '\"')\n  parseWith(cxt, parseJsonString)\n}\n\nfunction parseEnum(cxt: ParseCxt): void {\n  const {gen, data, schema} = cxt\n  const enumSch = schema.enum\n  parseToken(cxt, '\"')\n  // TODO loopEnum\n  gen.if(false)\n  for (const value of enumSch) {\n    const valueStr = JSON.stringify(value).slice(1) // remove starting quote\n    gen.elseIf(_`${jsonSlice(valueStr.length)} === ${valueStr}`)\n    gen.assign(data, str`${value}`)\n    gen.add(N.jsonPos, valueStr.length)\n  }\n  gen.else()\n  jsonSyntaxError(cxt)\n  gen.endIf()\n}\n\nfunction parseNumber(cxt: ParseCxt, maxDigits?: number): void {\n  const {gen} = cxt\n  skipWhitespace(cxt)\n  gen.if(\n    _`\"-0123456789\".indexOf(${jsonSlice(1)}) < 0`,\n    () => jsonSyntaxError(cxt),\n    () => parseWith(cxt, parseJsonNumber, maxDigits)\n  )\n}\n\nfunction parseBooleanToken(bool: boolean, fail: GenParse): GenParse {\n  return (cxt) => {\n    const {gen, data} = cxt\n    tryParseToken(\n      cxt,\n      `${bool}`,\n      () => fail(cxt),\n      () => gen.assign(data, bool)\n    )\n  }\n}\n\nfunction parseRef(cxt: ParseCxt): void {\n  const {gen, self, definitions, schema, schemaEnv} = cxt\n  const {ref} = schema\n  const refSchema = definitions[ref]\n  if (!refSchema) throw new MissingRefError(self.opts.uriResolver, \"\", ref, `No definition ${ref}`)\n  if (!hasRef(refSchema)) return parseCode({...cxt, schema: refSchema})\n  const {root} = schemaEnv\n  const sch = compileParser.call(self, new SchemaEnv({schema: refSchema, root}), definitions)\n  partialParse(cxt, getParser(gen, sch), true)\n}\n\nfunction getParser(gen: CodeGen, sch: SchemaEnv): Code {\n  return sch.parse\n    ? gen.scopeValue(\"parse\", {ref: sch.parse})\n    : _`${gen.scopeValue(\"wrapper\", {ref: sch})}.parse`\n}\n\nfunction parseEmpty(cxt: ParseCxt): void {\n  parseWith(cxt, parseJson)\n}\n\nfunction parseWith(cxt: ParseCxt, parseFunc: {code: string}, args?: SafeExpr): void {\n  partialParse(cxt, useFunc(cxt.gen, parseFunc), args)\n}\n\nfunction partialParse(cxt: ParseCxt, parseFunc: Name, args?: SafeExpr): void {\n  const {gen, data} = cxt\n  gen.assign(data, _`${parseFunc}(${N.json}, ${N.jsonPos}${args ? _`, ${args}` : nil})`)\n  gen.assign(N.jsonPos, _`${parseFunc}.position`)\n  gen.if(_`${data} === undefined`, () => parsingError(cxt, _`${parseFunc}.message`))\n}\n\nfunction parseToken(cxt: ParseCxt, tok: string): void {\n  tryParseToken(cxt, tok, jsonSyntaxError)\n}\n\nfunction tryParseToken(cxt: ParseCxt, tok: string, fail: GenParse, success?: GenParse): void {\n  const {gen} = cxt\n  const n = tok.length\n  skipWhitespace(cxt)\n  gen.if(\n    _`${jsonSlice(n)} === ${tok}`,\n    () => {\n      gen.add(N.jsonPos, n)\n      success?.(cxt)\n    },\n    () => fail(cxt)\n  )\n}\n\nfunction skipWhitespace({gen, char: c}: ParseCxt): void {\n  gen.code(\n    _`while((${c}=${N.json}[${N.jsonPos}],${c}===\" \"||${c}===\"\\\\n\"||${c}===\"\\\\r\"||${c}===\"\\\\t\"))${N.jsonPos}++;`\n  )\n}\n\nfunction jsonSlice(len: number | Name): Code {\n  return len === 1\n    ? _`${N.json}[${N.jsonPos}]`\n    : _`${N.json}.slice(${N.jsonPos}, ${N.jsonPos}+${len})`\n}\n\nfunction jsonSyntaxError(cxt: ParseCxt): void {\n  parsingError(cxt, _`\"unexpected token \" + ${N.json}[${N.jsonPos}]`)\n}\n\nfunction parsingError({gen, parseName}: ParseCxt, msg: Code): void {\n  gen.assign(_`${parseName}.message`, msg)\n  gen.assign(_`${parseName}.position`, N.jsonPos)\n  gen.return(undef)\n}\n"
  },
  {
    "path": "lib/compile/jtd/serialize.ts",
    "content": "import type Ajv from \"../../core\"\nimport type {SchemaObject} from \"../../types\"\nimport {jtdForms, JTDForm, SchemaObjectMap} from \"./types\"\nimport {SchemaEnv, getCompilingSchema} from \"..\"\nimport {_, str, and, getProperty, CodeGen, Code, Name} from \"../codegen\"\nimport MissingRefError from \"../ref_error\"\nimport N from \"../names\"\nimport {isOwnProperty} from \"../../vocabularies/code\"\nimport {hasRef} from \"../../vocabularies/jtd/ref\"\nimport {useFunc} from \"../util\"\nimport quote from \"../../runtime/quote\"\n\nconst genSerialize: {[F in JTDForm]: (cxt: SerializeCxt) => void} = {\n  elements: serializeElements,\n  values: serializeValues,\n  discriminator: serializeDiscriminator,\n  properties: serializeProperties,\n  optionalProperties: serializeProperties,\n  enum: serializeString,\n  type: serializeType,\n  ref: serializeRef,\n}\n\ninterface SerializeCxt {\n  readonly gen: CodeGen\n  readonly self: Ajv // current Ajv instance\n  readonly schemaEnv: SchemaEnv\n  readonly definitions: SchemaObjectMap\n  schema: SchemaObject\n  data: Code\n}\n\nexport default function compileSerializer(\n  this: Ajv,\n  sch: SchemaEnv,\n  definitions: SchemaObjectMap\n): SchemaEnv {\n  const _sch = getCompilingSchema.call(this, sch)\n  if (_sch) return _sch\n  const {es5, lines} = this.opts.code\n  const {ownProperties} = this.opts\n  const gen = new CodeGen(this.scope, {es5, lines, ownProperties})\n  const serializeName = gen.scopeName(\"serialize\")\n  const cxt: SerializeCxt = {\n    self: this,\n    gen,\n    schema: sch.schema as SchemaObject,\n    schemaEnv: sch,\n    definitions,\n    data: N.data,\n  }\n\n  let sourceCode: string | undefined\n  try {\n    this._compilations.add(sch)\n    sch.serializeName = serializeName\n    gen.func(serializeName, N.data, false, () => {\n      gen.let(N.json, str``)\n      serializeCode(cxt)\n      gen.return(N.json)\n    })\n    gen.optimize(this.opts.code.optimize)\n    const serializeFuncCode = gen.toString()\n    sourceCode = `${gen.scopeRefs(N.scope)}return ${serializeFuncCode}`\n    const makeSerialize = new Function(`${N.scope}`, sourceCode)\n    const serialize: (data: unknown) => string = makeSerialize(this.scope.get())\n    this.scope.value(serializeName, {ref: serialize})\n    sch.serialize = serialize\n  } catch (e) {\n    if (sourceCode) this.logger.error(\"Error compiling serializer, function code:\", sourceCode)\n    delete sch.serialize\n    delete sch.serializeName\n    throw e\n  } finally {\n    this._compilations.delete(sch)\n  }\n  return sch\n}\n\nfunction serializeCode(cxt: SerializeCxt): void {\n  let form: JTDForm | undefined\n  for (const key of jtdForms) {\n    if (key in cxt.schema) {\n      form = key\n      break\n    }\n  }\n  serializeNullable(cxt, form ? genSerialize[form] : serializeEmpty)\n}\n\nfunction serializeNullable(cxt: SerializeCxt, serializeForm: (_cxt: SerializeCxt) => void): void {\n  const {gen, schema, data} = cxt\n  if (!schema.nullable) return serializeForm(cxt)\n  gen.if(\n    _`${data} === undefined || ${data} === null`,\n    () => gen.add(N.json, _`\"null\"`),\n    () => serializeForm(cxt)\n  )\n}\n\nfunction serializeElements(cxt: SerializeCxt): void {\n  const {gen, schema, data} = cxt\n  gen.add(N.json, str`[`)\n  const first = gen.let(\"first\", true)\n  gen.forOf(\"el\", data, (el) => {\n    addComma(cxt, first)\n    serializeCode({...cxt, schema: schema.elements, data: el})\n  })\n  gen.add(N.json, str`]`)\n}\n\nfunction serializeValues(cxt: SerializeCxt): void {\n  const {gen, schema, data} = cxt\n  gen.add(N.json, str`{`)\n  const first = gen.let(\"first\", true)\n  gen.forIn(\"key\", data, (key) => serializeKeyValue(cxt, key, schema.values, first))\n  gen.add(N.json, str`}`)\n}\n\nfunction serializeKeyValue(cxt: SerializeCxt, key: Name, schema: SchemaObject, first?: Name): void {\n  const {gen, data} = cxt\n  addComma(cxt, first)\n  serializeString({...cxt, data: key})\n  gen.add(N.json, str`:`)\n  const value = gen.const(\"value\", _`${data}${getProperty(key)}`)\n  serializeCode({...cxt, schema, data: value})\n}\n\nfunction serializeDiscriminator(cxt: SerializeCxt): void {\n  const {gen, schema, data} = cxt\n  const {discriminator} = schema\n  gen.add(N.json, str`{${JSON.stringify(discriminator)}:`)\n  const tag = gen.const(\"tag\", _`${data}${getProperty(discriminator)}`)\n  serializeString({...cxt, data: tag})\n  gen.if(false)\n  for (const tagValue in schema.mapping) {\n    gen.elseIf(_`${tag} === ${tagValue}`)\n    const sch = schema.mapping[tagValue]\n    serializeSchemaProperties({...cxt, schema: sch}, discriminator)\n  }\n  gen.endIf()\n  gen.add(N.json, str`}`)\n}\n\nfunction serializeProperties(cxt: SerializeCxt): void {\n  const {gen} = cxt\n  gen.add(N.json, str`{`)\n  serializeSchemaProperties(cxt)\n  gen.add(N.json, str`}`)\n}\n\nfunction serializeSchemaProperties(cxt: SerializeCxt, discriminator?: string): void {\n  const {gen, schema, data} = cxt\n  const {properties, optionalProperties} = schema\n  const props = keys(properties)\n  const optProps = keys(optionalProperties)\n  const allProps = allProperties(props.concat(optProps))\n  let first = !discriminator\n  let firstProp: Name | undefined\n\n  for (const key of props) {\n    if (first) first = false\n    else gen.add(N.json, str`,`)\n    serializeProperty(key, properties[key], keyValue(key))\n  }\n  if (first) firstProp = gen.let(\"first\", true)\n  for (const key of optProps) {\n    const value = keyValue(key)\n    gen.if(and(_`${value} !== undefined`, isOwnProperty(gen, data, key)), () => {\n      addComma(cxt, firstProp)\n      serializeProperty(key, optionalProperties[key], value)\n    })\n  }\n  if (schema.additionalProperties) {\n    gen.forIn(\"key\", data, (key) =>\n      gen.if(isAdditional(key, allProps), () => serializeKeyValue(cxt, key, {}, firstProp))\n    )\n  }\n\n  function keys(ps?: SchemaObjectMap): string[] {\n    return ps ? Object.keys(ps) : []\n  }\n\n  function allProperties(ps: string[]): string[] {\n    if (discriminator) ps.push(discriminator)\n    if (new Set(ps).size !== ps.length) {\n      throw new Error(\"JTD: properties/optionalProperties/disciminator overlap\")\n    }\n    return ps\n  }\n\n  function keyValue(key: string): Name {\n    return gen.const(\"value\", _`${data}${getProperty(key)}`)\n  }\n\n  function serializeProperty(key: string, propSchema: SchemaObject, value: Name): void {\n    gen.add(N.json, str`${JSON.stringify(key)}:`)\n    serializeCode({...cxt, schema: propSchema, data: value})\n  }\n\n  function isAdditional(key: Name, ps: string[]): Code | true {\n    return ps.length ? and(...ps.map((p) => _`${key} !== ${p}`)) : true\n  }\n}\n\nfunction serializeType(cxt: SerializeCxt): void {\n  const {gen, schema, data} = cxt\n  switch (schema.type) {\n    case \"boolean\":\n      gen.add(N.json, _`${data} ? \"true\" : \"false\"`)\n      break\n    case \"string\":\n      serializeString(cxt)\n      break\n    case \"timestamp\":\n      gen.if(\n        _`${data} instanceof Date`,\n        () => gen.add(N.json, _`'\"' + ${data}.toISOString() + '\"'`),\n        () => serializeString(cxt)\n      )\n      break\n    default:\n      serializeNumber(cxt)\n  }\n}\n\nfunction serializeString({gen, data}: SerializeCxt): void {\n  gen.add(N.json, _`${useFunc(gen, quote)}(${data})`)\n}\n\nfunction serializeNumber({gen, data, self}: SerializeCxt): void {\n  const condition = _`${data} === Infinity || ${data} === -Infinity || ${data} !== ${data}`\n\n  if (self.opts.specialNumbers === undefined || self.opts.specialNumbers === \"fast\") {\n    gen.add(N.json, _`\"\" + ${data}`)\n  } else {\n    // specialNumbers === \"null\"\n    gen.if(\n      condition,\n      () => gen.add(N.json, _`null`),\n      () => gen.add(N.json, _`\"\" + ${data}`)\n    )\n  }\n}\n\nfunction serializeRef(cxt: SerializeCxt): void {\n  const {gen, self, data, definitions, schema, schemaEnv} = cxt\n  const {ref} = schema\n  const refSchema = definitions[ref]\n  if (!refSchema) throw new MissingRefError(self.opts.uriResolver, \"\", ref, `No definition ${ref}`)\n  if (!hasRef(refSchema)) return serializeCode({...cxt, schema: refSchema})\n  const {root} = schemaEnv\n  const sch = compileSerializer.call(self, new SchemaEnv({schema: refSchema, root}), definitions)\n  gen.add(N.json, _`${getSerialize(gen, sch)}(${data})`)\n}\n\nfunction getSerialize(gen: CodeGen, sch: SchemaEnv): Code {\n  return sch.serialize\n    ? gen.scopeValue(\"serialize\", {ref: sch.serialize})\n    : _`${gen.scopeValue(\"wrapper\", {ref: sch})}.serialize`\n}\n\nfunction serializeEmpty({gen, data}: SerializeCxt): void {\n  gen.add(N.json, _`JSON.stringify(${data})`)\n}\n\nfunction addComma({gen}: SerializeCxt, first?: Name): void {\n  if (first) {\n    gen.if(\n      first,\n      () => gen.assign(first, false),\n      () => gen.add(N.json, str`,`)\n    )\n  } else {\n    gen.add(N.json, str`,`)\n  }\n}\n"
  },
  {
    "path": "lib/compile/jtd/types.ts",
    "content": "import type {SchemaObject} from \"../../types\"\n\nexport type SchemaObjectMap = {[Ref in string]?: SchemaObject}\n\nexport const jtdForms = [\n  \"elements\",\n  \"values\",\n  \"discriminator\",\n  \"properties\",\n  \"optionalProperties\",\n  \"enum\",\n  \"type\",\n  \"ref\",\n] as const\n\nexport type JTDForm = (typeof jtdForms)[number]\n"
  },
  {
    "path": "lib/compile/names.ts",
    "content": "import {Name} from \"./codegen\"\n\nconst names = {\n  // validation function arguments\n  data: new Name(\"data\"), // data passed to validation function\n  // args passed from referencing schema\n  valCxt: new Name(\"valCxt\"), // validation/data context - should not be used directly, it is destructured to the names below\n  instancePath: new Name(\"instancePath\"),\n  parentData: new Name(\"parentData\"),\n  parentDataProperty: new Name(\"parentDataProperty\"),\n  rootData: new Name(\"rootData\"), // root data - same as the data passed to the first/top validation function\n  dynamicAnchors: new Name(\"dynamicAnchors\"), // used to support recursiveRef and dynamicRef\n  // function scoped variables\n  vErrors: new Name(\"vErrors\"), // null or array of validation errors\n  errors: new Name(\"errors\"), // counter of validation errors\n  this: new Name(\"this\"),\n  // \"globals\"\n  self: new Name(\"self\"),\n  scope: new Name(\"scope\"),\n  // JTD serialize/parse name for JSON string and position\n  json: new Name(\"json\"),\n  jsonPos: new Name(\"jsonPos\"),\n  jsonLen: new Name(\"jsonLen\"),\n  jsonPart: new Name(\"jsonPart\"),\n}\n\nexport default names\n"
  },
  {
    "path": "lib/compile/ref_error.ts",
    "content": "import {resolveUrl, normalizeId, getFullPath} from \"./resolve\"\nimport type {UriResolver} from \"../types\"\n\nexport default class MissingRefError extends Error {\n  readonly missingRef: string\n  readonly missingSchema: string\n\n  constructor(resolver: UriResolver, baseId: string, ref: string, msg?: string) {\n    super(msg || `can't resolve reference ${ref} from id ${baseId}`)\n    this.missingRef = resolveUrl(resolver, baseId, ref)\n    this.missingSchema = normalizeId(getFullPath(resolver, this.missingRef))\n  }\n}\n"
  },
  {
    "path": "lib/compile/resolve.ts",
    "content": "import type {AnySchema, AnySchemaObject, UriResolver} from \"../types\"\nimport type Ajv from \"../ajv\"\nimport type {URIComponent} from \"fast-uri\"\nimport {eachItem} from \"./util\"\nimport * as equal from \"fast-deep-equal\"\nimport * as traverse from \"json-schema-traverse\"\n\n// the hash of local references inside the schema (created by getSchemaRefs), used for inline resolution\nexport type LocalRefs = {[Ref in string]?: AnySchemaObject}\n\n// TODO refactor to use keyword definitions\nconst SIMPLE_INLINED = new Set([\n  \"type\",\n  \"format\",\n  \"pattern\",\n  \"maxLength\",\n  \"minLength\",\n  \"maxProperties\",\n  \"minProperties\",\n  \"maxItems\",\n  \"minItems\",\n  \"maximum\",\n  \"minimum\",\n  \"uniqueItems\",\n  \"multipleOf\",\n  \"required\",\n  \"enum\",\n  \"const\",\n])\n\nexport function inlineRef(schema: AnySchema, limit: boolean | number = true): boolean {\n  if (typeof schema == \"boolean\") return true\n  if (limit === true) return !hasRef(schema)\n  if (!limit) return false\n  return countKeys(schema) <= limit\n}\n\nconst REF_KEYWORDS = new Set([\n  \"$ref\",\n  \"$recursiveRef\",\n  \"$recursiveAnchor\",\n  \"$dynamicRef\",\n  \"$dynamicAnchor\",\n])\n\nfunction hasRef(schema: AnySchemaObject): boolean {\n  for (const key in schema) {\n    if (REF_KEYWORDS.has(key)) return true\n    const sch = schema[key]\n    if (Array.isArray(sch) && sch.some(hasRef)) return true\n    if (typeof sch == \"object\" && hasRef(sch)) return true\n  }\n  return false\n}\n\nfunction countKeys(schema: AnySchemaObject): number {\n  let count = 0\n  for (const key in schema) {\n    if (key === \"$ref\") return Infinity\n    count++\n    if (SIMPLE_INLINED.has(key)) continue\n    if (typeof schema[key] == \"object\") {\n      eachItem(schema[key], (sch) => (count += countKeys(sch)))\n    }\n    if (count === Infinity) return Infinity\n  }\n  return count\n}\n\nexport function getFullPath(resolver: UriResolver, id = \"\", normalize?: boolean): string {\n  if (normalize !== false) id = normalizeId(id)\n  const p = resolver.parse(id)\n  return _getFullPath(resolver, p)\n}\n\nexport function _getFullPath(resolver: UriResolver, p: URIComponent): string {\n  const serialized = resolver.serialize(p)\n  return serialized.split(\"#\")[0] + \"#\"\n}\n\nconst TRAILING_SLASH_HASH = /#\\/?$/\nexport function normalizeId(id: string | undefined): string {\n  return id ? id.replace(TRAILING_SLASH_HASH, \"\") : \"\"\n}\n\nexport function resolveUrl(resolver: UriResolver, baseId: string, id: string): string {\n  id = normalizeId(id)\n  return resolver.resolve(baseId, id)\n}\n\nconst ANCHOR = /^[a-z_][-a-z0-9._]*$/i\n\nexport function getSchemaRefs(this: Ajv, schema: AnySchema, baseId: string): LocalRefs {\n  if (typeof schema == \"boolean\") return {}\n  const {schemaId, uriResolver} = this.opts\n  const schId = normalizeId(schema[schemaId] || baseId)\n  const baseIds: {[JsonPtr in string]?: string} = {\"\": schId}\n  const pathPrefix = getFullPath(uriResolver, schId, false)\n  const localRefs: LocalRefs = {}\n  const schemaRefs: Set<string> = new Set()\n\n  traverse(schema, {allKeys: true}, (sch, jsonPtr, _, parentJsonPtr) => {\n    if (parentJsonPtr === undefined) return\n    const fullPath = pathPrefix + jsonPtr\n    let innerBaseId = baseIds[parentJsonPtr]\n    if (typeof sch[schemaId] == \"string\") innerBaseId = addRef.call(this, sch[schemaId])\n    addAnchor.call(this, sch.$anchor)\n    addAnchor.call(this, sch.$dynamicAnchor)\n    baseIds[jsonPtr] = innerBaseId\n\n    function addRef(this: Ajv, ref: string): string {\n      // eslint-disable-next-line @typescript-eslint/unbound-method\n      const _resolve = this.opts.uriResolver.resolve\n      ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref)\n      if (schemaRefs.has(ref)) throw ambiguos(ref)\n      schemaRefs.add(ref)\n      let schOrRef = this.refs[ref]\n      if (typeof schOrRef == \"string\") schOrRef = this.refs[schOrRef]\n      if (typeof schOrRef == \"object\") {\n        checkAmbiguosRef(sch, schOrRef.schema, ref)\n      } else if (ref !== normalizeId(fullPath)) {\n        if (ref[0] === \"#\") {\n          checkAmbiguosRef(sch, localRefs[ref], ref)\n          localRefs[ref] = sch\n        } else {\n          this.refs[ref] = fullPath\n        }\n      }\n      return ref\n    }\n\n    function addAnchor(this: Ajv, anchor: unknown): void {\n      if (typeof anchor == \"string\") {\n        if (!ANCHOR.test(anchor)) throw new Error(`invalid anchor \"${anchor}\"`)\n        addRef.call(this, `#${anchor}`)\n      }\n    }\n  })\n\n  return localRefs\n\n  function checkAmbiguosRef(sch1: AnySchema, sch2: AnySchema | undefined, ref: string): void {\n    if (sch2 !== undefined && !equal(sch1, sch2)) throw ambiguos(ref)\n  }\n\n  function ambiguos(ref: string): Error {\n    return new Error(`reference \"${ref}\" resolves to more than one schema`)\n  }\n}\n"
  },
  {
    "path": "lib/compile/rules.ts",
    "content": "import type {AddedKeywordDefinition} from \"../types\"\n\nconst _jsonTypes = [\"string\", \"number\", \"integer\", \"boolean\", \"null\", \"object\", \"array\"] as const\n\nexport type JSONType = (typeof _jsonTypes)[number]\n\nconst jsonTypes: Set<string> = new Set(_jsonTypes)\n\nexport function isJSONType(x: unknown): x is JSONType {\n  return typeof x == \"string\" && jsonTypes.has(x)\n}\n\ntype ValidationTypes = {\n  [K in JSONType]: boolean | RuleGroup | undefined\n}\n\nexport interface ValidationRules {\n  rules: RuleGroup[]\n  post: RuleGroup\n  all: {[Key in string]?: boolean | Rule} // rules that have to be validated\n  keywords: {[Key in string]?: boolean} // all known keywords (superset of \"all\")\n  types: ValidationTypes\n}\n\nexport interface RuleGroup {\n  type?: JSONType\n  rules: Rule[]\n}\n\n// This interface wraps KeywordDefinition because definition can have multiple keywords\nexport interface Rule {\n  keyword: string\n  definition: AddedKeywordDefinition\n}\n\nexport function getRules(): ValidationRules {\n  const groups: Record<\"number\" | \"string\" | \"array\" | \"object\", RuleGroup> = {\n    number: {type: \"number\", rules: []},\n    string: {type: \"string\", rules: []},\n    array: {type: \"array\", rules: []},\n    object: {type: \"object\", rules: []},\n  }\n  return {\n    types: {...groups, integer: true, boolean: true, null: true},\n    rules: [{rules: []}, groups.number, groups.string, groups.array, groups.object],\n    post: {rules: []},\n    all: {},\n    keywords: {},\n  }\n}\n"
  },
  {
    "path": "lib/compile/util.ts",
    "content": "import type {AnySchema, EvaluatedProperties, EvaluatedItems} from \"../types\"\nimport type {SchemaCxt, SchemaObjCxt} from \".\"\nimport {_, getProperty, Code, Name, CodeGen} from \"./codegen\"\nimport {_Code} from \"./codegen/code\"\nimport type {Rule, ValidationRules} from \"./rules\"\n\n// TODO refactor to use Set\nexport function toHash<T extends string = string>(arr: T[]): {[K in T]?: true} {\n  const hash: {[K in T]?: true} = {}\n  for (const item of arr) hash[item] = true\n  return hash\n}\n\nexport function alwaysValidSchema(it: SchemaCxt, schema: AnySchema): boolean | void {\n  if (typeof schema == \"boolean\") return schema\n  if (Object.keys(schema).length === 0) return true\n  checkUnknownRules(it, schema)\n  return !schemaHasRules(schema, it.self.RULES.all)\n}\n\nexport function checkUnknownRules(it: SchemaCxt, schema: AnySchema = it.schema): void {\n  const {opts, self} = it\n  if (!opts.strictSchema) return\n  if (typeof schema === \"boolean\") return\n  const rules = self.RULES.keywords\n  for (const key in schema) {\n    if (!rules[key]) checkStrictMode(it, `unknown keyword: \"${key}\"`)\n  }\n}\n\nexport function schemaHasRules(\n  schema: AnySchema,\n  rules: {[Key in string]?: boolean | Rule}\n): boolean {\n  if (typeof schema == \"boolean\") return !schema\n  for (const key in schema) if (rules[key]) return true\n  return false\n}\n\nexport function schemaHasRulesButRef(schema: AnySchema, RULES: ValidationRules): boolean {\n  if (typeof schema == \"boolean\") return !schema\n  for (const key in schema) if (key !== \"$ref\" && RULES.all[key]) return true\n  return false\n}\n\nexport function schemaRefOrVal(\n  {topSchemaRef, schemaPath}: SchemaObjCxt,\n  schema: unknown,\n  keyword: string,\n  $data?: string | false\n): Code | number | boolean {\n  if (!$data) {\n    if (typeof schema == \"number\" || typeof schema == \"boolean\") return schema\n    if (typeof schema == \"string\") return _`${schema}`\n  }\n  return _`${topSchemaRef}${schemaPath}${getProperty(keyword)}`\n}\n\nexport function unescapeFragment(str: string): string {\n  return unescapeJsonPointer(decodeURIComponent(str))\n}\n\nexport function escapeFragment(str: string | number): string {\n  return encodeURIComponent(escapeJsonPointer(str))\n}\n\nexport function escapeJsonPointer(str: string | number): string {\n  if (typeof str == \"number\") return `${str}`\n  return str.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")\n}\n\nexport function unescapeJsonPointer(str: string): string {\n  return str.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n}\n\nexport function eachItem<T>(xs: T | T[], f: (x: T) => void): void {\n  if (Array.isArray(xs)) {\n    for (const x of xs) f(x)\n  } else {\n    f(xs)\n  }\n}\n\ntype SomeEvaluated = EvaluatedProperties | EvaluatedItems\n\ntype MergeEvaluatedFunc<T extends SomeEvaluated> = (\n  gen: CodeGen,\n  from: Name | T,\n  to: Name | Exclude<T, true> | undefined,\n  toName?: typeof Name\n) => Name | T\n\ninterface MakeMergeFuncArgs<T extends SomeEvaluated> {\n  mergeNames: (gen: CodeGen, from: Name, to: Name) => void\n  mergeToName: (gen: CodeGen, from: T, to: Name) => void\n  mergeValues: (from: T, to: Exclude<T, true>) => T\n  resultToName: (gen: CodeGen, res?: T) => Name\n}\n\nfunction makeMergeEvaluated<T extends SomeEvaluated>({\n  mergeNames,\n  mergeToName,\n  mergeValues,\n  resultToName,\n}: MakeMergeFuncArgs<T>): MergeEvaluatedFunc<T> {\n  return (gen, from, to, toName) => {\n    const res =\n      to === undefined\n        ? from\n        : to instanceof Name\n        ? (from instanceof Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to)\n        : from instanceof Name\n        ? (mergeToName(gen, to, from), from)\n        : mergeValues(from, to)\n    return toName === Name && !(res instanceof Name) ? resultToName(gen, res) : res\n  }\n}\n\ninterface MergeEvaluated {\n  props: MergeEvaluatedFunc<EvaluatedProperties>\n  items: MergeEvaluatedFunc<EvaluatedItems>\n}\n\nexport const mergeEvaluated: MergeEvaluated = {\n  props: makeMergeEvaluated({\n    mergeNames: (gen, from, to) =>\n      gen.if(_`${to} !== true && ${from} !== undefined`, () => {\n        gen.if(\n          _`${from} === true`,\n          () => gen.assign(to, true),\n          () => gen.assign(to, _`${to} || {}`).code(_`Object.assign(${to}, ${from})`)\n        )\n      }),\n    mergeToName: (gen, from, to) =>\n      gen.if(_`${to} !== true`, () => {\n        if (from === true) {\n          gen.assign(to, true)\n        } else {\n          gen.assign(to, _`${to} || {}`)\n          setEvaluated(gen, to, from)\n        }\n      }),\n    mergeValues: (from, to) => (from === true ? true : {...from, ...to}),\n    resultToName: evaluatedPropsToName,\n  }),\n  items: makeMergeEvaluated({\n    mergeNames: (gen, from, to) =>\n      gen.if(_`${to} !== true && ${from} !== undefined`, () =>\n        gen.assign(to, _`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)\n      ),\n    mergeToName: (gen, from, to) =>\n      gen.if(_`${to} !== true`, () =>\n        gen.assign(to, from === true ? true : _`${to} > ${from} ? ${to} : ${from}`)\n      ),\n    mergeValues: (from, to) => (from === true ? true : Math.max(from, to)),\n    resultToName: (gen, items) => gen.var(\"items\", items),\n  }),\n}\n\nexport function evaluatedPropsToName(gen: CodeGen, ps?: EvaluatedProperties): Name {\n  if (ps === true) return gen.var(\"props\", true)\n  const props = gen.var(\"props\", _`{}`)\n  if (ps !== undefined) setEvaluated(gen, props, ps)\n  return props\n}\n\nexport function setEvaluated(gen: CodeGen, props: Name, ps: {[K in string]?: true}): void {\n  Object.keys(ps).forEach((p) => gen.assign(_`${props}${getProperty(p)}`, true))\n}\n\nconst snippets: {[S in string]?: _Code} = {}\n\nexport function useFunc(gen: CodeGen, f: {code: string}): Name {\n  return gen.scopeValue(\"func\", {\n    ref: f,\n    code: snippets[f.code] || (snippets[f.code] = new _Code(f.code)),\n  })\n}\n\nexport enum Type {\n  Num,\n  Str,\n}\n\nexport function getErrorPath(\n  dataProp: Name | string | number,\n  dataPropType?: Type,\n  jsPropertySyntax?: boolean\n): Code | string {\n  // let path\n  if (dataProp instanceof Name) {\n    const isNumber = dataPropType === Type.Num\n    return jsPropertySyntax\n      ? isNumber\n        ? _`\"[\" + ${dataProp} + \"]\"`\n        : _`\"['\" + ${dataProp} + \"']\"`\n      : isNumber\n      ? _`\"/\" + ${dataProp}`\n      : _`\"/\" + ${dataProp}.replace(/~/g, \"~0\").replace(/\\\\//g, \"~1\")` // TODO maybe use global escapePointer\n  }\n  return jsPropertySyntax ? getProperty(dataProp).toString() : \"/\" + escapeJsonPointer(dataProp)\n}\n\nexport function checkStrictMode(\n  it: SchemaCxt,\n  msg: string,\n  mode: boolean | \"log\" = it.opts.strictSchema\n): void {\n  if (!mode) return\n  msg = `strict mode: ${msg}`\n  if (mode === true) throw new Error(msg)\n  it.self.logger.warn(msg)\n}\n"
  },
  {
    "path": "lib/compile/validate/applicability.ts",
    "content": "import type {AnySchemaObject} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport type {JSONType, RuleGroup, Rule} from \"../rules\"\n\nexport function schemaHasRulesForType(\n  {schema, self}: SchemaObjCxt,\n  type: JSONType\n): boolean | undefined {\n  const group = self.RULES.types[type]\n  return group && group !== true && shouldUseGroup(schema, group)\n}\n\nexport function shouldUseGroup(schema: AnySchemaObject, group: RuleGroup): boolean {\n  return group.rules.some((rule) => shouldUseRule(schema, rule))\n}\n\nexport function shouldUseRule(schema: AnySchemaObject, rule: Rule): boolean | undefined {\n  return (\n    schema[rule.keyword] !== undefined ||\n    rule.definition.implements?.some((kwd) => schema[kwd] !== undefined)\n  )\n}\n"
  },
  {
    "path": "lib/compile/validate/boolSchema.ts",
    "content": "import type {KeywordErrorDefinition, KeywordErrorCxt} from \"../../types\"\nimport type {SchemaCxt} from \"..\"\nimport {reportError} from \"../errors\"\nimport {_, Name} from \"../codegen\"\nimport N from \"../names\"\n\nconst boolError: KeywordErrorDefinition = {\n  message: \"boolean schema is false\",\n}\n\nexport function topBoolOrEmptySchema(it: SchemaCxt): void {\n  const {gen, schema, validateName} = it\n  if (schema === false) {\n    falseSchemaError(it, false)\n  } else if (typeof schema == \"object\" && schema.$async === true) {\n    gen.return(N.data)\n  } else {\n    gen.assign(_`${validateName}.errors`, null)\n    gen.return(true)\n  }\n}\n\nexport function boolOrEmptySchema(it: SchemaCxt, valid: Name): void {\n  const {gen, schema} = it\n  if (schema === false) {\n    gen.var(valid, false) // TODO var\n    falseSchemaError(it)\n  } else {\n    gen.var(valid, true) // TODO var\n  }\n}\n\nfunction falseSchemaError(it: SchemaCxt, overrideAllErrors?: boolean): void {\n  const {gen, data} = it\n  // TODO maybe some other interface should be used for non-keyword validation errors...\n  const cxt: KeywordErrorCxt = {\n    gen,\n    keyword: \"false schema\",\n    data,\n    schema: false,\n    schemaCode: false,\n    schemaValue: false,\n    params: {},\n    it,\n  }\n  reportError(cxt, boolError, undefined, overrideAllErrors)\n}\n"
  },
  {
    "path": "lib/compile/validate/dataType.ts",
    "content": "import type {\n  KeywordErrorDefinition,\n  KeywordErrorCxt,\n  ErrorObject,\n  AnySchemaObject,\n} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport {isJSONType, JSONType} from \"../rules\"\nimport {schemaHasRulesForType} from \"./applicability\"\nimport {reportError} from \"../errors\"\nimport {_, nil, and, not, operators, Code, Name} from \"../codegen\"\nimport {toHash, schemaRefOrVal} from \"../util\"\n\nexport enum DataType {\n  Correct,\n  Wrong,\n}\n\nexport function getSchemaTypes(schema: AnySchemaObject): JSONType[] {\n  const types = getJSONTypes(schema.type)\n  const hasNull = types.includes(\"null\")\n  if (hasNull) {\n    if (schema.nullable === false) throw new Error(\"type: null contradicts nullable: false\")\n  } else {\n    if (!types.length && schema.nullable !== undefined) {\n      throw new Error('\"nullable\" cannot be used without \"type\"')\n    }\n    if (schema.nullable === true) types.push(\"null\")\n  }\n  return types\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport function getJSONTypes(ts: unknown | unknown[]): JSONType[] {\n  const types: unknown[] = Array.isArray(ts) ? ts : ts ? [ts] : []\n  if (types.every(isJSONType)) return types\n  throw new Error(\"type must be JSONType or JSONType[]: \" + types.join(\",\"))\n}\n\nexport function coerceAndCheckDataType(it: SchemaObjCxt, types: JSONType[]): boolean {\n  const {gen, data, opts} = it\n  const coerceTo = coerceToTypes(types, opts.coerceTypes)\n  const checkTypes =\n    types.length > 0 &&\n    !(coerceTo.length === 0 && types.length === 1 && schemaHasRulesForType(it, types[0]))\n  if (checkTypes) {\n    const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong)\n    gen.if(wrongType, () => {\n      if (coerceTo.length) coerceData(it, types, coerceTo)\n      else reportTypeError(it)\n    })\n  }\n  return checkTypes\n}\n\nconst COERCIBLE: Set<JSONType> = new Set([\"string\", \"number\", \"integer\", \"boolean\", \"null\"])\nfunction coerceToTypes(types: JSONType[], coerceTypes?: boolean | \"array\"): JSONType[] {\n  return coerceTypes\n    ? types.filter((t) => COERCIBLE.has(t) || (coerceTypes === \"array\" && t === \"array\"))\n    : []\n}\n\nfunction coerceData(it: SchemaObjCxt, types: JSONType[], coerceTo: JSONType[]): void {\n  const {gen, data, opts} = it\n  const dataType = gen.let(\"dataType\", _`typeof ${data}`)\n  const coerced = gen.let(\"coerced\", _`undefined`)\n  if (opts.coerceTypes === \"array\") {\n    gen.if(_`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () =>\n      gen\n        .assign(data, _`${data}[0]`)\n        .assign(dataType, _`typeof ${data}`)\n        .if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))\n    )\n  }\n  gen.if(_`${coerced} !== undefined`)\n  for (const t of coerceTo) {\n    if (COERCIBLE.has(t) || (t === \"array\" && opts.coerceTypes === \"array\")) {\n      coerceSpecificType(t)\n    }\n  }\n  gen.else()\n  reportTypeError(it)\n  gen.endIf()\n\n  gen.if(_`${coerced} !== undefined`, () => {\n    gen.assign(data, coerced)\n    assignParentData(it, coerced)\n  })\n\n  function coerceSpecificType(t: string): void {\n    switch (t) {\n      case \"string\":\n        gen\n          .elseIf(_`${dataType} == \"number\" || ${dataType} == \"boolean\"`)\n          .assign(coerced, _`\"\" + ${data}`)\n          .elseIf(_`${data} === null`)\n          .assign(coerced, _`\"\"`)\n        return\n      case \"number\":\n        gen\n          .elseIf(\n            _`${dataType} == \"boolean\" || ${data} === null\n              || (${dataType} == \"string\" && ${data} && ${data} == +${data})`\n          )\n          .assign(coerced, _`+${data}`)\n        return\n      case \"integer\":\n        gen\n          .elseIf(\n            _`${dataType} === \"boolean\" || ${data} === null\n              || (${dataType} === \"string\" && ${data} && ${data} == +${data} && !(${data} % 1))`\n          )\n          .assign(coerced, _`+${data}`)\n        return\n      case \"boolean\":\n        gen\n          .elseIf(_`${data} === \"false\" || ${data} === 0 || ${data} === null`)\n          .assign(coerced, false)\n          .elseIf(_`${data} === \"true\" || ${data} === 1`)\n          .assign(coerced, true)\n        return\n      case \"null\":\n        gen.elseIf(_`${data} === \"\" || ${data} === 0 || ${data} === false`)\n        gen.assign(coerced, null)\n        return\n\n      case \"array\":\n        gen\n          .elseIf(\n            _`${dataType} === \"string\" || ${dataType} === \"number\"\n              || ${dataType} === \"boolean\" || ${data} === null`\n          )\n          .assign(coerced, _`[${data}]`)\n    }\n  }\n}\n\nfunction assignParentData({gen, parentData, parentDataProperty}: SchemaObjCxt, expr: Name): void {\n  // TODO use gen.property\n  gen.if(_`${parentData} !== undefined`, () =>\n    gen.assign(_`${parentData}[${parentDataProperty}]`, expr)\n  )\n}\n\nexport function checkDataType(\n  dataType: JSONType,\n  data: Name,\n  strictNums?: boolean | \"log\",\n  correct = DataType.Correct\n): Code {\n  const EQ = correct === DataType.Correct ? operators.EQ : operators.NEQ\n  let cond: Code\n  switch (dataType) {\n    case \"null\":\n      return _`${data} ${EQ} null`\n    case \"array\":\n      cond = _`Array.isArray(${data})`\n      break\n    case \"object\":\n      cond = _`${data} && typeof ${data} == \"object\" && !Array.isArray(${data})`\n      break\n    case \"integer\":\n      cond = numCond(_`!(${data} % 1) && !isNaN(${data})`)\n      break\n    case \"number\":\n      cond = numCond()\n      break\n    default:\n      return _`typeof ${data} ${EQ} ${dataType}`\n  }\n  return correct === DataType.Correct ? cond : not(cond)\n\n  function numCond(_cond: Code = nil): Code {\n    return and(_`typeof ${data} == \"number\"`, _cond, strictNums ? _`isFinite(${data})` : nil)\n  }\n}\n\nexport function checkDataTypes(\n  dataTypes: JSONType[],\n  data: Name,\n  strictNums?: boolean | \"log\",\n  correct?: DataType\n): Code {\n  if (dataTypes.length === 1) {\n    return checkDataType(dataTypes[0], data, strictNums, correct)\n  }\n  let cond: Code\n  const types = toHash(dataTypes)\n  if (types.array && types.object) {\n    const notObj = _`typeof ${data} != \"object\"`\n    cond = types.null ? notObj : _`!${data} || ${notObj}`\n    delete types.null\n    delete types.array\n    delete types.object\n  } else {\n    cond = nil\n  }\n  if (types.number) delete types.integer\n  for (const t in types) cond = and(cond, checkDataType(t as JSONType, data, strictNums, correct))\n  return cond\n}\n\nexport type TypeError = ErrorObject<\"type\", {type: string}>\n\nconst typeError: KeywordErrorDefinition = {\n  message: ({schema}) => `must be ${schema}`,\n  params: ({schema, schemaValue}) =>\n    typeof schema == \"string\" ? _`{type: ${schema}}` : _`{type: ${schemaValue}}`,\n}\n\nexport function reportTypeError(it: SchemaObjCxt): void {\n  const cxt = getTypeErrorContext(it)\n  reportError(cxt, typeError)\n}\n\nfunction getTypeErrorContext(it: SchemaObjCxt): KeywordErrorCxt {\n  const {gen, data, schema} = it\n  const schemaCode = schemaRefOrVal(it, schema, \"type\")\n  return {\n    gen,\n    keyword: \"type\",\n    data,\n    schema: schema.type,\n    schemaCode,\n    schemaValue: schemaCode,\n    parentSchema: schema,\n    params: {},\n    it,\n  }\n}\n"
  },
  {
    "path": "lib/compile/validate/defaults.ts",
    "content": "import type {SchemaObjCxt} from \"..\"\nimport {_, getProperty, stringify} from \"../codegen\"\nimport {checkStrictMode} from \"../util\"\n\nexport function assignDefaults(it: SchemaObjCxt, ty?: string): void {\n  const {properties, items} = it.schema\n  if (ty === \"object\" && properties) {\n    for (const key in properties) {\n      assignDefault(it, key, properties[key].default)\n    }\n  } else if (ty === \"array\" && Array.isArray(items)) {\n    items.forEach((sch, i: number) => assignDefault(it, i, sch.default))\n  }\n}\n\nfunction assignDefault(it: SchemaObjCxt, prop: string | number, defaultValue: unknown): void {\n  const {gen, compositeRule, data, opts} = it\n  if (defaultValue === undefined) return\n  const childData = _`${data}${getProperty(prop)}`\n  if (compositeRule) {\n    checkStrictMode(it, `default is ignored for: ${childData}`)\n    return\n  }\n\n  let condition = _`${childData} === undefined`\n  if (opts.useDefaults === \"empty\") {\n    condition = _`${condition} || ${childData} === null || ${childData} === \"\"`\n  }\n  // `${childData} === undefined` +\n  // (opts.useDefaults === \"empty\" ? ` || ${childData} === null || ${childData} === \"\"` : \"\")\n  gen.if(condition, _`${childData} = ${stringify(defaultValue)}`)\n}\n"
  },
  {
    "path": "lib/compile/validate/index.ts",
    "content": "import type {\n  AddedKeywordDefinition,\n  AnySchema,\n  AnySchemaObject,\n  KeywordErrorCxt,\n  KeywordCxtParams,\n} from \"../../types\"\nimport type {SchemaCxt, SchemaObjCxt} from \"..\"\nimport type {InstanceOptions} from \"../../core\"\nimport {boolOrEmptySchema, topBoolOrEmptySchema} from \"./boolSchema\"\nimport {coerceAndCheckDataType, getSchemaTypes} from \"./dataType\"\nimport {shouldUseGroup, shouldUseRule} from \"./applicability\"\nimport {checkDataType, checkDataTypes, reportTypeError, DataType} from \"./dataType\"\nimport {assignDefaults} from \"./defaults\"\nimport {funcKeywordCode, macroKeywordCode, validateKeywordUsage, validSchemaType} from \"./keyword\"\nimport {getSubschema, extendSubschemaData, SubschemaArgs, extendSubschemaMode} from \"./subschema\"\nimport {_, nil, str, or, not, getProperty, Block, Code, Name, CodeGen} from \"../codegen\"\nimport N from \"../names\"\nimport {resolveUrl} from \"../resolve\"\nimport {\n  schemaRefOrVal,\n  schemaHasRulesButRef,\n  checkUnknownRules,\n  checkStrictMode,\n  unescapeJsonPointer,\n  mergeEvaluated,\n} from \"../util\"\nimport type {JSONType, Rule, RuleGroup} from \"../rules\"\nimport {\n  ErrorPaths,\n  reportError,\n  reportExtraError,\n  resetErrorsCount,\n  keyword$DataError,\n} from \"../errors\"\n\n// schema compilation - generates validation function, subschemaCode (below) is used for subschemas\nexport function validateFunctionCode(it: SchemaCxt): void {\n  if (isSchemaObj(it)) {\n    checkKeywords(it)\n    if (schemaCxtHasRules(it)) {\n      topSchemaObjCode(it)\n      return\n    }\n  }\n  validateFunction(it, () => topBoolOrEmptySchema(it))\n}\n\nfunction validateFunction(\n  {gen, validateName, schema, schemaEnv, opts}: SchemaCxt,\n  body: Block\n): void {\n  if (opts.code.es5) {\n    gen.func(validateName, _`${N.data}, ${N.valCxt}`, schemaEnv.$async, () => {\n      gen.code(_`\"use strict\"; ${funcSourceUrl(schema, opts)}`)\n      destructureValCxtES5(gen, opts)\n      gen.code(body)\n    })\n  } else {\n    gen.func(validateName, _`${N.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () =>\n      gen.code(funcSourceUrl(schema, opts)).code(body)\n    )\n  }\n}\n\nfunction destructureValCxt(opts: InstanceOptions): Code {\n  return _`{${N.instancePath}=\"\", ${N.parentData}, ${N.parentDataProperty}, ${N.rootData}=${\n    N.data\n  }${opts.dynamicRef ? _`, ${N.dynamicAnchors}={}` : nil}}={}`\n}\n\nfunction destructureValCxtES5(gen: CodeGen, opts: InstanceOptions): void {\n  gen.if(\n    N.valCxt,\n    () => {\n      gen.var(N.instancePath, _`${N.valCxt}.${N.instancePath}`)\n      gen.var(N.parentData, _`${N.valCxt}.${N.parentData}`)\n      gen.var(N.parentDataProperty, _`${N.valCxt}.${N.parentDataProperty}`)\n      gen.var(N.rootData, _`${N.valCxt}.${N.rootData}`)\n      if (opts.dynamicRef) gen.var(N.dynamicAnchors, _`${N.valCxt}.${N.dynamicAnchors}`)\n    },\n    () => {\n      gen.var(N.instancePath, _`\"\"`)\n      gen.var(N.parentData, _`undefined`)\n      gen.var(N.parentDataProperty, _`undefined`)\n      gen.var(N.rootData, N.data)\n      if (opts.dynamicRef) gen.var(N.dynamicAnchors, _`{}`)\n    }\n  )\n}\n\nfunction topSchemaObjCode(it: SchemaObjCxt): void {\n  const {schema, opts, gen} = it\n  validateFunction(it, () => {\n    if (opts.$comment && schema.$comment) commentKeyword(it)\n    checkNoDefault(it)\n    gen.let(N.vErrors, null)\n    gen.let(N.errors, 0)\n    if (opts.unevaluated) resetEvaluated(it)\n    typeAndKeywords(it)\n    returnResults(it)\n  })\n  return\n}\n\nfunction resetEvaluated(it: SchemaObjCxt): void {\n  // TODO maybe some hook to execute it in the end to check whether props/items are Name, as in assignEvaluated\n  const {gen, validateName} = it\n  it.evaluated = gen.const(\"evaluated\", _`${validateName}.evaluated`)\n  gen.if(_`${it.evaluated}.dynamicProps`, () => gen.assign(_`${it.evaluated}.props`, _`undefined`))\n  gen.if(_`${it.evaluated}.dynamicItems`, () => gen.assign(_`${it.evaluated}.items`, _`undefined`))\n}\n\nfunction funcSourceUrl(schema: AnySchema, opts: InstanceOptions): Code {\n  const schId = typeof schema == \"object\" && schema[opts.schemaId]\n  return schId && (opts.code.source || opts.code.process) ? _`/*# sourceURL=${schId} */` : nil\n}\n\n// schema compilation - this function is used recursively to generate code for sub-schemas\nfunction subschemaCode(it: SchemaCxt, valid: Name): void {\n  if (isSchemaObj(it)) {\n    checkKeywords(it)\n    if (schemaCxtHasRules(it)) {\n      subSchemaObjCode(it, valid)\n      return\n    }\n  }\n  boolOrEmptySchema(it, valid)\n}\n\nfunction schemaCxtHasRules({schema, self}: SchemaCxt): boolean {\n  if (typeof schema == \"boolean\") return !schema\n  for (const key in schema) if (self.RULES.all[key]) return true\n  return false\n}\n\nfunction isSchemaObj(it: SchemaCxt): it is SchemaObjCxt {\n  return typeof it.schema != \"boolean\"\n}\n\nfunction subSchemaObjCode(it: SchemaObjCxt, valid: Name): void {\n  const {schema, gen, opts} = it\n  if (opts.$comment && schema.$comment) commentKeyword(it)\n  updateContext(it)\n  checkAsyncSchema(it)\n  const errsCount = gen.const(\"_errs\", N.errors)\n  typeAndKeywords(it, errsCount)\n  // TODO var\n  gen.var(valid, _`${errsCount} === ${N.errors}`)\n}\n\nfunction checkKeywords(it: SchemaObjCxt): void {\n  checkUnknownRules(it)\n  checkRefsAndKeywords(it)\n}\n\nfunction typeAndKeywords(it: SchemaObjCxt, errsCount?: Name): void {\n  if (it.opts.jtd) return schemaKeywords(it, [], false, errsCount)\n  const types = getSchemaTypes(it.schema)\n  const checkedTypes = coerceAndCheckDataType(it, types)\n  schemaKeywords(it, types, !checkedTypes, errsCount)\n}\n\nfunction checkRefsAndKeywords(it: SchemaObjCxt): void {\n  const {schema, errSchemaPath, opts, self} = it\n  if (schema.$ref && opts.ignoreKeywordsWithRef && schemaHasRulesButRef(schema, self.RULES)) {\n    self.logger.warn(`$ref: keywords ignored in schema at path \"${errSchemaPath}\"`)\n  }\n}\n\nfunction checkNoDefault(it: SchemaObjCxt): void {\n  const {schema, opts} = it\n  if (schema.default !== undefined && opts.useDefaults && opts.strictSchema) {\n    checkStrictMode(it, \"default is ignored in the schema root\")\n  }\n}\n\nfunction updateContext(it: SchemaObjCxt): void {\n  const schId = it.schema[it.opts.schemaId]\n  if (schId) it.baseId = resolveUrl(it.opts.uriResolver, it.baseId, schId)\n}\n\nfunction checkAsyncSchema(it: SchemaObjCxt): void {\n  if (it.schema.$async && !it.schemaEnv.$async) throw new Error(\"async schema in sync schema\")\n}\n\nfunction commentKeyword({gen, schemaEnv, schema, errSchemaPath, opts}: SchemaObjCxt): void {\n  const msg = schema.$comment\n  if (opts.$comment === true) {\n    gen.code(_`${N.self}.logger.log(${msg})`)\n  } else if (typeof opts.$comment == \"function\") {\n    const schemaPath = str`${errSchemaPath}/$comment`\n    const rootName = gen.scopeValue(\"root\", {ref: schemaEnv.root})\n    gen.code(_`${N.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`)\n  }\n}\n\nfunction returnResults(it: SchemaCxt): void {\n  const {gen, schemaEnv, validateName, ValidationError, opts} = it\n  if (schemaEnv.$async) {\n    // TODO assign unevaluated\n    gen.if(\n      _`${N.errors} === 0`,\n      () => gen.return(N.data),\n      () => gen.throw(_`new ${ValidationError as Name}(${N.vErrors})`)\n    )\n  } else {\n    gen.assign(_`${validateName}.errors`, N.vErrors)\n    if (opts.unevaluated) assignEvaluated(it)\n    gen.return(_`${N.errors} === 0`)\n  }\n}\n\nfunction assignEvaluated({gen, evaluated, props, items}: SchemaCxt): void {\n  if (props instanceof Name) gen.assign(_`${evaluated}.props`, props)\n  if (items instanceof Name) gen.assign(_`${evaluated}.items`, items)\n}\n\nfunction schemaKeywords(\n  it: SchemaObjCxt,\n  types: JSONType[],\n  typeErrors: boolean,\n  errsCount?: Name\n): void {\n  const {gen, schema, data, allErrors, opts, self} = it\n  const {RULES} = self\n  if (schema.$ref && (opts.ignoreKeywordsWithRef || !schemaHasRulesButRef(schema, RULES))) {\n    gen.block(() => keywordCode(it, \"$ref\", (RULES.all.$ref as Rule).definition)) // TODO typecast\n    return\n  }\n  if (!opts.jtd) checkStrictTypes(it, types)\n  gen.block(() => {\n    for (const group of RULES.rules) groupKeywords(group)\n    groupKeywords(RULES.post)\n  })\n\n  function groupKeywords(group: RuleGroup): void {\n    if (!shouldUseGroup(schema, group)) return\n    if (group.type) {\n      gen.if(checkDataType(group.type, data, opts.strictNumbers))\n      iterateKeywords(it, group)\n      if (types.length === 1 && types[0] === group.type && typeErrors) {\n        gen.else()\n        reportTypeError(it)\n      }\n      gen.endIf()\n    } else {\n      iterateKeywords(it, group)\n    }\n    // TODO make it \"ok\" call?\n    if (!allErrors) gen.if(_`${N.errors} === ${errsCount || 0}`)\n  }\n}\n\nfunction iterateKeywords(it: SchemaObjCxt, group: RuleGroup): void {\n  const {\n    gen,\n    schema,\n    opts: {useDefaults},\n  } = it\n  if (useDefaults) assignDefaults(it, group.type)\n  gen.block(() => {\n    for (const rule of group.rules) {\n      if (shouldUseRule(schema, rule)) {\n        keywordCode(it, rule.keyword, rule.definition, group.type)\n      }\n    }\n  })\n}\n\nfunction checkStrictTypes(it: SchemaObjCxt, types: JSONType[]): void {\n  if (it.schemaEnv.meta || !it.opts.strictTypes) return\n  checkContextTypes(it, types)\n  if (!it.opts.allowUnionTypes) checkMultipleTypes(it, types)\n  checkKeywordTypes(it, it.dataTypes)\n}\n\nfunction checkContextTypes(it: SchemaObjCxt, types: JSONType[]): void {\n  if (!types.length) return\n  if (!it.dataTypes.length) {\n    it.dataTypes = types\n    return\n  }\n  types.forEach((t) => {\n    if (!includesType(it.dataTypes, t)) {\n      strictTypesError(it, `type \"${t}\" not allowed by context \"${it.dataTypes.join(\",\")}\"`)\n    }\n  })\n  narrowSchemaTypes(it, types)\n}\n\nfunction checkMultipleTypes(it: SchemaObjCxt, ts: JSONType[]): void {\n  if (ts.length > 1 && !(ts.length === 2 && ts.includes(\"null\"))) {\n    strictTypesError(it, \"use allowUnionTypes to allow union type keyword\")\n  }\n}\n\nfunction checkKeywordTypes(it: SchemaObjCxt, ts: JSONType[]): void {\n  const rules = it.self.RULES.all\n  for (const keyword in rules) {\n    const rule = rules[keyword]\n    if (typeof rule == \"object\" && shouldUseRule(it.schema, rule)) {\n      const {type} = rule.definition\n      if (type.length && !type.some((t) => hasApplicableType(ts, t))) {\n        strictTypesError(it, `missing type \"${type.join(\",\")}\" for keyword \"${keyword}\"`)\n      }\n    }\n  }\n}\n\nfunction hasApplicableType(schTs: JSONType[], kwdT: JSONType): boolean {\n  return schTs.includes(kwdT) || (kwdT === \"number\" && schTs.includes(\"integer\"))\n}\n\nfunction includesType(ts: JSONType[], t: JSONType): boolean {\n  return ts.includes(t) || (t === \"integer\" && ts.includes(\"number\"))\n}\n\nfunction narrowSchemaTypes(it: SchemaObjCxt, withTypes: JSONType[]): void {\n  const ts: JSONType[] = []\n  for (const t of it.dataTypes) {\n    if (includesType(withTypes, t)) ts.push(t)\n    else if (withTypes.includes(\"integer\") && t === \"number\") ts.push(\"integer\")\n  }\n  it.dataTypes = ts\n}\n\nfunction strictTypesError(it: SchemaObjCxt, msg: string): void {\n  const schemaPath = it.schemaEnv.baseId + it.errSchemaPath\n  msg += ` at \"${schemaPath}\" (strictTypes)`\n  checkStrictMode(it, msg, it.opts.strictTypes)\n}\n\nexport class KeywordCxt implements KeywordErrorCxt {\n  readonly gen: CodeGen\n  readonly allErrors?: boolean\n  readonly keyword: string\n  readonly data: Name // Name referencing the current level of the data instance\n  readonly $data?: string | false\n  schema: any // keyword value in the schema\n  readonly schemaValue: Code | number | boolean // Code reference to keyword schema value or primitive value\n  readonly schemaCode: Code | number | boolean // Code reference to resolved schema value (different if schema is $data)\n  readonly schemaType: JSONType[] // allowed type(s) of keyword value in the schema\n  readonly parentSchema: AnySchemaObject\n  readonly errsCount?: Name // Name reference to the number of validation errors collected before this keyword,\n  // requires option trackErrors in keyword definition\n  params: KeywordCxtParams // object to pass parameters to error messages from keyword code\n  readonly it: SchemaObjCxt // schema compilation context (schema is guaranteed to be an object, not boolean)\n  readonly def: AddedKeywordDefinition\n\n  constructor(it: SchemaObjCxt, def: AddedKeywordDefinition, keyword: string) {\n    validateKeywordUsage(it, def, keyword)\n    this.gen = it.gen\n    this.allErrors = it.allErrors\n    this.keyword = keyword\n    this.data = it.data\n    this.schema = it.schema[keyword]\n    this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data\n    this.schemaValue = schemaRefOrVal(it, this.schema, keyword, this.$data)\n    this.schemaType = def.schemaType\n    this.parentSchema = it.schema\n    this.params = {}\n    this.it = it\n    this.def = def\n\n    if (this.$data) {\n      this.schemaCode = it.gen.const(\"vSchema\", getData(this.$data, it))\n    } else {\n      this.schemaCode = this.schemaValue\n      if (!validSchemaType(this.schema, def.schemaType, def.allowUndefined)) {\n        throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`)\n      }\n    }\n\n    if (\"code\" in def ? def.trackErrors : def.errors !== false) {\n      this.errsCount = it.gen.const(\"_errs\", N.errors)\n    }\n  }\n\n  result(condition: Code, successAction?: () => void, failAction?: () => void): void {\n    this.failResult(not(condition), successAction, failAction)\n  }\n\n  failResult(condition: Code, successAction?: () => void, failAction?: () => void): void {\n    this.gen.if(condition)\n    if (failAction) failAction()\n    else this.error()\n    if (successAction) {\n      this.gen.else()\n      successAction()\n      if (this.allErrors) this.gen.endIf()\n    } else {\n      if (this.allErrors) this.gen.endIf()\n      else this.gen.else()\n    }\n  }\n\n  pass(condition: Code, failAction?: () => void): void {\n    this.failResult(not(condition), undefined, failAction)\n  }\n\n  fail(condition?: Code): void {\n    if (condition === undefined) {\n      this.error()\n      if (!this.allErrors) this.gen.if(false) // this branch will be removed by gen.optimize\n      return\n    }\n    this.gen.if(condition)\n    this.error()\n    if (this.allErrors) this.gen.endIf()\n    else this.gen.else()\n  }\n\n  fail$data(condition: Code): void {\n    if (!this.$data) return this.fail(condition)\n    const {schemaCode} = this\n    this.fail(_`${schemaCode} !== undefined && (${or(this.invalid$data(), condition)})`)\n  }\n\n  error(append?: boolean, errorParams?: KeywordCxtParams, errorPaths?: ErrorPaths): void {\n    if (errorParams) {\n      this.setParams(errorParams)\n      this._error(append, errorPaths)\n      this.setParams({})\n      return\n    }\n    this._error(append, errorPaths)\n  }\n\n  private _error(append?: boolean, errorPaths?: ErrorPaths): void {\n    ;(append ? reportExtraError : reportError)(this, this.def.error, errorPaths)\n  }\n\n  $dataError(): void {\n    reportError(this, this.def.$dataError || keyword$DataError)\n  }\n\n  reset(): void {\n    if (this.errsCount === undefined) throw new Error('add \"trackErrors\" to keyword definition')\n    resetErrorsCount(this.gen, this.errsCount)\n  }\n\n  ok(cond: Code | boolean): void {\n    if (!this.allErrors) this.gen.if(cond)\n  }\n\n  setParams(obj: KeywordCxtParams, assign?: true): void {\n    if (assign) Object.assign(this.params, obj)\n    else this.params = obj\n  }\n\n  block$data(valid: Name, codeBlock: () => void, $dataValid: Code = nil): void {\n    this.gen.block(() => {\n      this.check$data(valid, $dataValid)\n      codeBlock()\n    })\n  }\n\n  check$data(valid: Name = nil, $dataValid: Code = nil): void {\n    if (!this.$data) return\n    const {gen, schemaCode, schemaType, def} = this\n    gen.if(or(_`${schemaCode} === undefined`, $dataValid))\n    if (valid !== nil) gen.assign(valid, true)\n    if (schemaType.length || def.validateSchema) {\n      gen.elseIf(this.invalid$data())\n      this.$dataError()\n      if (valid !== nil) gen.assign(valid, false)\n    }\n    gen.else()\n  }\n\n  invalid$data(): Code {\n    const {gen, schemaCode, schemaType, def, it} = this\n    return or(wrong$DataType(), invalid$DataSchema())\n\n    function wrong$DataType(): Code {\n      if (schemaType.length) {\n        /* istanbul ignore if */\n        if (!(schemaCode instanceof Name)) throw new Error(\"ajv implementation error\")\n        const st = Array.isArray(schemaType) ? schemaType : [schemaType]\n        return _`${checkDataTypes(st, schemaCode, it.opts.strictNumbers, DataType.Wrong)}`\n      }\n      return nil\n    }\n\n    function invalid$DataSchema(): Code {\n      if (def.validateSchema) {\n        const validateSchemaRef = gen.scopeValue(\"validate$data\", {ref: def.validateSchema}) // TODO value.code for standalone\n        return _`!${validateSchemaRef}(${schemaCode})`\n      }\n      return nil\n    }\n  }\n\n  subschema(appl: SubschemaArgs, valid: Name): SchemaCxt {\n    const subschema = getSubschema(this.it, appl)\n    extendSubschemaData(subschema, this.it, appl)\n    extendSubschemaMode(subschema, appl)\n    const nextContext = {...this.it, ...subschema, items: undefined, props: undefined}\n    subschemaCode(nextContext, valid)\n    return nextContext\n  }\n\n  mergeEvaluated(schemaCxt: SchemaCxt, toName?: typeof Name): void {\n    const {it, gen} = this\n    if (!it.opts.unevaluated) return\n    if (it.props !== true && schemaCxt.props !== undefined) {\n      it.props = mergeEvaluated.props(gen, schemaCxt.props, it.props, toName)\n    }\n    if (it.items !== true && schemaCxt.items !== undefined) {\n      it.items = mergeEvaluated.items(gen, schemaCxt.items, it.items, toName)\n    }\n  }\n\n  mergeValidEvaluated(schemaCxt: SchemaCxt, valid: Name): boolean | void {\n    const {it, gen} = this\n    if (it.opts.unevaluated && (it.props !== true || it.items !== true)) {\n      gen.if(valid, () => this.mergeEvaluated(schemaCxt, Name))\n      return true\n    }\n  }\n}\n\nfunction keywordCode(\n  it: SchemaObjCxt,\n  keyword: string,\n  def: AddedKeywordDefinition,\n  ruleType?: JSONType\n): void {\n  const cxt = new KeywordCxt(it, def, keyword)\n  if (\"code\" in def) {\n    def.code(cxt, ruleType)\n  } else if (cxt.$data && def.validate) {\n    funcKeywordCode(cxt, def)\n  } else if (\"macro\" in def) {\n    macroKeywordCode(cxt, def)\n  } else if (def.compile || def.validate) {\n    funcKeywordCode(cxt, def)\n  }\n}\n\nconst JSON_POINTER = /^\\/(?:[^~]|~0|~1)*$/\nconst RELATIVE_JSON_POINTER = /^([0-9]+)(#|\\/(?:[^~]|~0|~1)*)?$/\nexport function getData(\n  $data: string,\n  {dataLevel, dataNames, dataPathArr}: SchemaCxt\n): Code | number {\n  let jsonPointer\n  let data: Code\n  if ($data === \"\") return N.rootData\n  if ($data[0] === \"/\") {\n    if (!JSON_POINTER.test($data)) throw new Error(`Invalid JSON-pointer: ${$data}`)\n    jsonPointer = $data\n    data = N.rootData\n  } else {\n    const matches = RELATIVE_JSON_POINTER.exec($data)\n    if (!matches) throw new Error(`Invalid JSON-pointer: ${$data}`)\n    const up: number = +matches[1]\n    jsonPointer = matches[2]\n    if (jsonPointer === \"#\") {\n      if (up >= dataLevel) throw new Error(errorMsg(\"property/index\", up))\n      return dataPathArr[dataLevel - up]\n    }\n    if (up > dataLevel) throw new Error(errorMsg(\"data\", up))\n    data = dataNames[dataLevel - up]\n    if (!jsonPointer) return data\n  }\n\n  let expr = data\n  const segments = jsonPointer.split(\"/\")\n  for (const segment of segments) {\n    if (segment) {\n      data = _`${data}${getProperty(unescapeJsonPointer(segment))}`\n      expr = _`${expr} && ${data}`\n    }\n  }\n  return expr\n\n  function errorMsg(pointerType: string, up: number): string {\n    return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`\n  }\n}\n"
  },
  {
    "path": "lib/compile/validate/keyword.ts",
    "content": "import type {KeywordCxt} from \".\"\nimport type {\n  AnySchema,\n  SchemaValidateFunction,\n  AnyValidateFunction,\n  AddedKeywordDefinition,\n  MacroKeywordDefinition,\n  FuncKeywordDefinition,\n} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport {_, nil, not, stringify, Code, Name, CodeGen} from \"../codegen\"\nimport N from \"../names\"\nimport type {JSONType} from \"../rules\"\nimport {callValidateCode} from \"../../vocabularies/code\"\nimport {extendErrors} from \"../errors\"\n\ntype KeywordCompilationResult = AnySchema | SchemaValidateFunction | AnyValidateFunction\n\nexport function macroKeywordCode(cxt: KeywordCxt, def: MacroKeywordDefinition): void {\n  const {gen, keyword, schema, parentSchema, it} = cxt\n  const macroSchema = def.macro.call(it.self, schema, parentSchema, it)\n  const schemaRef = useKeyword(gen, keyword, macroSchema)\n  if (it.opts.validateSchema !== false) it.self.validateSchema(macroSchema, true)\n\n  const valid = gen.name(\"valid\")\n  cxt.subschema(\n    {\n      schema: macroSchema,\n      schemaPath: nil,\n      errSchemaPath: `${it.errSchemaPath}/${keyword}`,\n      topSchemaRef: schemaRef,\n      compositeRule: true,\n    },\n    valid\n  )\n  cxt.pass(valid, () => cxt.error(true))\n}\n\nexport function funcKeywordCode(cxt: KeywordCxt, def: FuncKeywordDefinition): void {\n  const {gen, keyword, schema, parentSchema, $data, it} = cxt\n  checkAsyncKeyword(it, def)\n  const validate =\n    !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate\n  const validateRef = useKeyword(gen, keyword, validate)\n  const valid = gen.let(\"valid\")\n  cxt.block$data(valid, validateKeyword)\n  cxt.ok(def.valid ?? valid)\n\n  function validateKeyword(): void {\n    if (def.errors === false) {\n      assignValid()\n      if (def.modifying) modifyData(cxt)\n      reportErrs(() => cxt.error())\n    } else {\n      const ruleErrs = def.async ? validateAsync() : validateSync()\n      if (def.modifying) modifyData(cxt)\n      reportErrs(() => addErrs(cxt, ruleErrs))\n    }\n  }\n\n  function validateAsync(): Name {\n    const ruleErrs = gen.let(\"ruleErrs\", null)\n    gen.try(\n      () => assignValid(_`await `),\n      (e) =>\n        gen.assign(valid, false).if(\n          _`${e} instanceof ${it.ValidationError as Name}`,\n          () => gen.assign(ruleErrs, _`${e}.errors`),\n          () => gen.throw(e)\n        )\n    )\n    return ruleErrs\n  }\n\n  function validateSync(): Code {\n    const validateErrs = _`${validateRef}.errors`\n    gen.assign(validateErrs, null)\n    assignValid(nil)\n    return validateErrs\n  }\n\n  function assignValid(_await: Code = def.async ? _`await ` : nil): void {\n    const passCxt = it.opts.passContext ? N.this : N.self\n    const passSchema = !((\"compile\" in def && !$data) || def.schema === false)\n    gen.assign(\n      valid,\n      _`${_await}${callValidateCode(cxt, validateRef, passCxt, passSchema)}`,\n      def.modifying\n    )\n  }\n\n  function reportErrs(errors: () => void): void {\n    gen.if(not(def.valid ?? valid), errors)\n  }\n}\n\nfunction modifyData(cxt: KeywordCxt): void {\n  const {gen, data, it} = cxt\n  gen.if(it.parentData, () => gen.assign(data, _`${it.parentData}[${it.parentDataProperty}]`))\n}\n\nfunction addErrs(cxt: KeywordCxt, errs: Code): void {\n  const {gen} = cxt\n  gen.if(\n    _`Array.isArray(${errs})`,\n    () => {\n      gen\n        .assign(N.vErrors, _`${N.vErrors} === null ? ${errs} : ${N.vErrors}.concat(${errs})`)\n        .assign(N.errors, _`${N.vErrors}.length`)\n      extendErrors(cxt)\n    },\n    () => cxt.error()\n  )\n}\n\nfunction checkAsyncKeyword({schemaEnv}: SchemaObjCxt, def: FuncKeywordDefinition): void {\n  if (def.async && !schemaEnv.$async) throw new Error(\"async keyword in sync schema\")\n}\n\nfunction useKeyword(gen: CodeGen, keyword: string, result?: KeywordCompilationResult): Name {\n  if (result === undefined) throw new Error(`keyword \"${keyword}\" failed to compile`)\n  return gen.scopeValue(\n    \"keyword\",\n    typeof result == \"function\" ? {ref: result} : {ref: result, code: stringify(result)}\n  )\n}\n\nexport function validSchemaType(\n  schema: unknown,\n  schemaType: JSONType[],\n  allowUndefined = false\n): boolean {\n  // TODO add tests\n  return (\n    !schemaType.length ||\n    schemaType.some((st) =>\n      st === \"array\"\n        ? Array.isArray(schema)\n        : st === \"object\"\n        ? schema && typeof schema == \"object\" && !Array.isArray(schema)\n        : typeof schema == st || (allowUndefined && typeof schema == \"undefined\")\n    )\n  )\n}\n\nexport function validateKeywordUsage(\n  {schema, opts, self, errSchemaPath}: SchemaObjCxt,\n  def: AddedKeywordDefinition,\n  keyword: string\n): void {\n  /* istanbul ignore if */\n  if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) {\n    throw new Error(\"ajv implementation error\")\n  }\n\n  const deps = def.dependencies\n  if (deps?.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) {\n    throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(\",\")}`)\n  }\n\n  if (def.validateSchema) {\n    const valid = def.validateSchema(schema[keyword])\n    if (!valid) {\n      const msg =\n        `keyword \"${keyword}\" value is invalid at path \"${errSchemaPath}\": ` +\n        self.errorsText(def.validateSchema.errors)\n      if (opts.validateSchema === \"log\") self.logger.error(msg)\n      else throw new Error(msg)\n    }\n  }\n}\n"
  },
  {
    "path": "lib/compile/validate/subschema.ts",
    "content": "import type {AnySchema} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport {_, str, getProperty, Code, Name} from \"../codegen\"\nimport {escapeFragment, getErrorPath, Type} from \"../util\"\nimport type {JSONType} from \"../rules\"\n\nexport interface SubschemaContext {\n  // TODO use Optional? align with SchemCxt property types\n  schema: AnySchema\n  schemaPath: Code\n  errSchemaPath: string\n  topSchemaRef?: Code\n  errorPath?: Code\n  dataLevel?: number\n  dataTypes?: JSONType[]\n  data?: Name\n  parentData?: Name\n  parentDataProperty?: Code | number\n  dataNames?: Name[]\n  dataPathArr?: (Code | number)[]\n  propertyName?: Name\n  jtdDiscriminator?: string\n  jtdMetadata?: boolean\n  compositeRule?: true\n  createErrors?: boolean\n  allErrors?: boolean\n}\n\nexport type SubschemaArgs = Partial<{\n  keyword: string\n  schemaProp: string | number\n  schema: AnySchema\n  schemaPath: Code\n  errSchemaPath: string\n  topSchemaRef: Code\n  data: Name | Code\n  dataProp: Code | string | number\n  dataTypes: JSONType[]\n  definedProperties: Set<string>\n  propertyName: Name\n  dataPropType: Type\n  jtdDiscriminator: string\n  jtdMetadata: boolean\n  compositeRule: true\n  createErrors: boolean\n  allErrors: boolean\n}>\n\nexport function getSubschema(\n  it: SchemaObjCxt,\n  {keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef}: SubschemaArgs\n): SubschemaContext {\n  if (keyword !== undefined && schema !== undefined) {\n    throw new Error('both \"keyword\" and \"schema\" passed, only one allowed')\n  }\n\n  if (keyword !== undefined) {\n    const sch = it.schema[keyword]\n    return schemaProp === undefined\n      ? {\n          schema: sch,\n          schemaPath: _`${it.schemaPath}${getProperty(keyword)}`,\n          errSchemaPath: `${it.errSchemaPath}/${keyword}`,\n        }\n      : {\n          schema: sch[schemaProp],\n          schemaPath: _`${it.schemaPath}${getProperty(keyword)}${getProperty(schemaProp)}`,\n          errSchemaPath: `${it.errSchemaPath}/${keyword}/${escapeFragment(schemaProp)}`,\n        }\n  }\n\n  if (schema !== undefined) {\n    if (schemaPath === undefined || errSchemaPath === undefined || topSchemaRef === undefined) {\n      throw new Error('\"schemaPath\", \"errSchemaPath\" and \"topSchemaRef\" are required with \"schema\"')\n    }\n    return {\n      schema,\n      schemaPath,\n      topSchemaRef,\n      errSchemaPath,\n    }\n  }\n\n  throw new Error('either \"keyword\" or \"schema\" must be passed')\n}\n\nexport function extendSubschemaData(\n  subschema: SubschemaContext,\n  it: SchemaObjCxt,\n  {dataProp, dataPropType: dpType, data, dataTypes, propertyName}: SubschemaArgs\n): void {\n  if (data !== undefined && dataProp !== undefined) {\n    throw new Error('both \"data\" and \"dataProp\" passed, only one allowed')\n  }\n\n  const {gen} = it\n\n  if (dataProp !== undefined) {\n    const {errorPath, dataPathArr, opts} = it\n    const nextData = gen.let(\"data\", _`${it.data}${getProperty(dataProp)}`, true)\n    dataContextProps(nextData)\n    subschema.errorPath = str`${errorPath}${getErrorPath(dataProp, dpType, opts.jsPropertySyntax)}`\n    subschema.parentDataProperty = _`${dataProp}`\n    subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]\n  }\n\n  if (data !== undefined) {\n    const nextData = data instanceof Name ? data : gen.let(\"data\", data, true) // replaceable if used once?\n    dataContextProps(nextData)\n    if (propertyName !== undefined) subschema.propertyName = propertyName\n    // TODO something is possibly wrong here with not changing parentDataProperty and not appending dataPathArr\n  }\n\n  if (dataTypes) subschema.dataTypes = dataTypes\n\n  function dataContextProps(_nextData: Name): void {\n    subschema.data = _nextData\n    subschema.dataLevel = it.dataLevel + 1\n    subschema.dataTypes = []\n    it.definedProperties = new Set<string>()\n    subschema.parentData = it.data\n    subschema.dataNames = [...it.dataNames, _nextData]\n  }\n}\n\nexport function extendSubschemaMode(\n  subschema: SubschemaContext,\n  {jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors}: SubschemaArgs\n): void {\n  if (compositeRule !== undefined) subschema.compositeRule = compositeRule\n  if (createErrors !== undefined) subschema.createErrors = createErrors\n  if (allErrors !== undefined) subschema.allErrors = allErrors\n  subschema.jtdDiscriminator = jtdDiscriminator // not inherited\n  subschema.jtdMetadata = jtdMetadata // not inherited\n}\n"
  },
  {
    "path": "lib/core.ts",
    "content": "export {\n  Format,\n  FormatDefinition,\n  AsyncFormatDefinition,\n  KeywordDefinition,\n  KeywordErrorDefinition,\n  CodeKeywordDefinition,\n  MacroKeywordDefinition,\n  FuncKeywordDefinition,\n  Vocabulary,\n  Schema,\n  SchemaObject,\n  AnySchemaObject,\n  AsyncSchema,\n  AnySchema,\n  ValidateFunction,\n  AsyncValidateFunction,\n  AnyValidateFunction,\n  ErrorObject,\n  ErrorNoParams,\n} from \"./types\"\n\nexport {SchemaCxt, SchemaObjCxt} from \"./compile\"\nexport interface Plugin<Opts> {\n  (ajv: Ajv, options?: Opts): Ajv\n  [prop: string]: any\n}\n\nexport {KeywordCxt} from \"./compile/validate\"\nexport {DefinedError} from \"./vocabularies/errors\"\nexport {JSONType} from \"./compile/rules\"\nexport {JSONSchemaType} from \"./types/json-schema\"\nexport {JTDSchemaType, SomeJTDSchemaType, JTDDataType} from \"./types/jtd-schema\"\nexport {_, str, stringify, nil, Name, Code, CodeGen, CodeGenOptions} from \"./compile/codegen\"\n\nimport type {\n  Schema,\n  AnySchema,\n  AnySchemaObject,\n  SchemaObject,\n  AsyncSchema,\n  Vocabulary,\n  KeywordDefinition,\n  AddedKeywordDefinition,\n  AnyValidateFunction,\n  ValidateFunction,\n  AsyncValidateFunction,\n  ErrorObject,\n  Format,\n  AddedFormat,\n  RegExpEngine,\n  UriResolver,\n} from \"./types\"\nimport type {JSONSchemaType} from \"./types/json-schema\"\nimport type {JTDSchemaType, SomeJTDSchemaType, JTDDataType} from \"./types/jtd-schema\"\nimport ValidationError from \"./runtime/validation_error\"\nimport MissingRefError from \"./compile/ref_error\"\nimport {getRules, ValidationRules, Rule, RuleGroup, JSONType} from \"./compile/rules\"\nimport {SchemaEnv, compileSchema, resolveSchema} from \"./compile\"\nimport {Code, ValueScope} from \"./compile/codegen\"\nimport {normalizeId, getSchemaRefs} from \"./compile/resolve\"\nimport {getJSONTypes} from \"./compile/validate/dataType\"\nimport {eachItem} from \"./compile/util\"\nimport * as $dataRefSchema from \"./refs/data.json\"\n\nimport DefaultUriResolver from \"./runtime/uri\"\n\nconst defaultRegExp: RegExpEngine = (str, flags) => new RegExp(str, flags)\ndefaultRegExp.code = \"new RegExp\"\n\nconst META_IGNORE_OPTIONS: (keyof Options)[] = [\"removeAdditional\", \"useDefaults\", \"coerceTypes\"]\nconst EXT_SCOPE_NAMES = new Set([\n  \"validate\",\n  \"serialize\",\n  \"parse\",\n  \"wrapper\",\n  \"root\",\n  \"schema\",\n  \"keyword\",\n  \"pattern\",\n  \"formats\",\n  \"validate$data\",\n  \"func\",\n  \"obj\",\n  \"Error\",\n])\n\nexport type Options = CurrentOptions & DeprecatedOptions\n\nexport interface CurrentOptions {\n  // strict mode options (NEW)\n  strict?: boolean | \"log\"\n  strictSchema?: boolean | \"log\"\n  strictNumbers?: boolean | \"log\"\n  strictTypes?: boolean | \"log\"\n  strictTuples?: boolean | \"log\"\n  strictRequired?: boolean | \"log\"\n  allowMatchingProperties?: boolean // disables a strict mode restriction\n  allowUnionTypes?: boolean\n  validateFormats?: boolean\n  // validation and reporting options:\n  $data?: boolean\n  allErrors?: boolean\n  verbose?: boolean\n  discriminator?: boolean\n  unicodeRegExp?: boolean\n  timestamp?: \"string\" | \"date\" // JTD only\n  parseDate?: boolean // JTD only\n  allowDate?: boolean // JTD only\n  specialNumbers?: \"fast\" | \"null\" // JTD only\n  $comment?:\n    | true\n    | ((comment: string, schemaPath?: string, rootSchema?: AnySchemaObject) => unknown)\n  formats?: {[Name in string]?: Format}\n  keywords?: Vocabulary\n  schemas?: AnySchema[] | {[Key in string]?: AnySchema}\n  logger?: Logger | false\n  loadSchema?: (uri: string) => Promise<AnySchemaObject>\n  // options to modify validated data:\n  removeAdditional?: boolean | \"all\" | \"failing\"\n  useDefaults?: boolean | \"empty\"\n  coerceTypes?: boolean | \"array\"\n  // advanced options:\n  next?: boolean // NEW\n  unevaluated?: boolean // NEW\n  dynamicRef?: boolean // NEW\n  schemaId?: \"id\" | \"$id\"\n  jtd?: boolean // NEW\n  meta?: SchemaObject | boolean\n  defaultMeta?: string | AnySchemaObject\n  validateSchema?: boolean | \"log\"\n  addUsedSchema?: boolean\n  inlineRefs?: boolean | number\n  passContext?: boolean\n  loopRequired?: number\n  loopEnum?: number // NEW\n  ownProperties?: boolean\n  multipleOfPrecision?: number\n  int32range?: boolean // JTD only\n  messages?: boolean\n  code?: CodeOptions // NEW\n  uriResolver?: UriResolver\n}\n\nexport interface CodeOptions {\n  es5?: boolean\n  esm?: boolean\n  lines?: boolean\n  optimize?: boolean | number\n  formats?: Code // code to require (or construct) map of available formats - for standalone code\n  source?: boolean\n  process?: (code: string, schema?: SchemaEnv) => string\n  regExp?: RegExpEngine\n}\n\ninterface InstanceCodeOptions extends CodeOptions {\n  regExp: RegExpEngine\n  optimize: number\n}\n\ninterface DeprecatedOptions {\n  /** @deprecated */\n  ignoreKeywordsWithRef?: boolean\n  /** @deprecated */\n  jsPropertySyntax?: boolean // added instead of jsonPointers\n  /** @deprecated */\n  unicode?: boolean\n}\n\ninterface RemovedOptions {\n  format?: boolean\n  errorDataPath?: \"object\" | \"property\"\n  nullable?: boolean // \"nullable\" keyword is supported by default\n  jsonPointers?: boolean\n  extendRefs?: true | \"ignore\" | \"fail\"\n  missingRefs?: true | \"ignore\" | \"fail\"\n  processCode?: (code: string, schema?: SchemaEnv) => string\n  sourceCode?: boolean\n  strictDefaults?: boolean\n  strictKeywords?: boolean\n  uniqueItems?: boolean\n  unknownFormats?: true | string[] | \"ignore\"\n  cache?: any\n  serialize?: (schema: AnySchema) => unknown\n  ajvErrors?: boolean\n}\n\ntype OptionsInfo<T extends RemovedOptions | DeprecatedOptions> = {\n  [K in keyof T]-?: string | undefined\n}\n\nconst removedOptions: OptionsInfo<RemovedOptions> = {\n  errorDataPath: \"\",\n  format: \"`validateFormats: false` can be used instead.\",\n  nullable: '\"nullable\" keyword is supported by default.',\n  jsonPointers: \"Deprecated jsPropertySyntax can be used instead.\",\n  extendRefs: \"Deprecated ignoreKeywordsWithRef can be used instead.\",\n  missingRefs: \"Pass empty schema with $id that should be ignored to ajv.addSchema.\",\n  processCode: \"Use option `code: {process: (code, schemaEnv: object) => string}`\",\n  sourceCode: \"Use option `code: {source: true}`\",\n  strictDefaults: \"It is default now, see option `strict`.\",\n  strictKeywords: \"It is default now, see option `strict`.\",\n  uniqueItems: '\"uniqueItems\" keyword is always validated.',\n  unknownFormats: \"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).\",\n  cache: \"Map is used as cache, schema object as key.\",\n  serialize: \"Map is used as cache, schema object as key.\",\n  ajvErrors: \"It is default now.\",\n}\n\nconst deprecatedOptions: OptionsInfo<DeprecatedOptions> = {\n  ignoreKeywordsWithRef: \"\",\n  jsPropertySyntax: \"\",\n  unicode: '\"minLength\"/\"maxLength\" account for unicode characters by default.',\n}\n\ntype RequiredInstanceOptions = {\n  [K in\n    | \"strictSchema\"\n    | \"strictNumbers\"\n    | \"strictTypes\"\n    | \"strictTuples\"\n    | \"strictRequired\"\n    | \"inlineRefs\"\n    | \"loopRequired\"\n    | \"loopEnum\"\n    | \"meta\"\n    | \"messages\"\n    | \"schemaId\"\n    | \"addUsedSchema\"\n    | \"validateSchema\"\n    | \"validateFormats\"\n    | \"int32range\"\n    | \"unicodeRegExp\"\n    | \"uriResolver\"]: NonNullable<Options[K]>\n} & {code: InstanceCodeOptions}\n\nexport type InstanceOptions = Options & RequiredInstanceOptions\n\nconst MAX_EXPRESSION = 200\n\n// eslint-disable-next-line complexity\nfunction requiredOptions(o: Options): RequiredInstanceOptions {\n  const s = o.strict\n  const _optz = o.code?.optimize\n  const optimize = _optz === true || _optz === undefined ? 1 : _optz || 0\n  const regExp = o.code?.regExp ?? defaultRegExp\n  const uriResolver = o.uriResolver ?? DefaultUriResolver\n  return {\n    strictSchema: o.strictSchema ?? s ?? true,\n    strictNumbers: o.strictNumbers ?? s ?? true,\n    strictTypes: o.strictTypes ?? s ?? \"log\",\n    strictTuples: o.strictTuples ?? s ?? \"log\",\n    strictRequired: o.strictRequired ?? s ?? false,\n    code: o.code ? {...o.code, optimize, regExp} : {optimize, regExp},\n    loopRequired: o.loopRequired ?? MAX_EXPRESSION,\n    loopEnum: o.loopEnum ?? MAX_EXPRESSION,\n    meta: o.meta ?? true,\n    messages: o.messages ?? true,\n    inlineRefs: o.inlineRefs ?? true,\n    schemaId: o.schemaId ?? \"$id\",\n    addUsedSchema: o.addUsedSchema ?? true,\n    validateSchema: o.validateSchema ?? true,\n    validateFormats: o.validateFormats ?? true,\n    unicodeRegExp: o.unicodeRegExp ?? true,\n    int32range: o.int32range ?? true,\n    uriResolver: uriResolver,\n  }\n}\n\nexport interface Logger {\n  log(...args: unknown[]): unknown\n  warn(...args: unknown[]): unknown\n  error(...args: unknown[]): unknown\n}\n\nexport default class Ajv {\n  opts: InstanceOptions\n  errors?: ErrorObject[] | null // errors from the last validation\n  logger: Logger\n  // shared external scope values for compiled functions\n  readonly scope: ValueScope\n  readonly schemas: {[Key in string]?: SchemaEnv} = {}\n  readonly refs: {[Ref in string]?: SchemaEnv | string} = {}\n  readonly formats: {[Name in string]?: AddedFormat} = {}\n  readonly RULES: ValidationRules\n  readonly _compilations: Set<SchemaEnv> = new Set()\n  private readonly _loading: {[Ref in string]?: Promise<AnySchemaObject>} = {}\n  private readonly _cache: Map<AnySchema, SchemaEnv> = new Map()\n  private readonly _metaOpts: InstanceOptions\n\n  static ValidationError = ValidationError\n  static MissingRefError = MissingRefError\n\n  constructor(opts: Options = {}) {\n    opts = this.opts = {...opts, ...requiredOptions(opts)}\n    const {es5, lines} = this.opts.code\n\n    this.scope = new ValueScope({scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines})\n    this.logger = getLogger(opts.logger)\n    const formatOpt = opts.validateFormats\n    opts.validateFormats = false\n\n    this.RULES = getRules()\n    checkOptions.call(this, removedOptions, opts, \"NOT SUPPORTED\")\n    checkOptions.call(this, deprecatedOptions, opts, \"DEPRECATED\", \"warn\")\n    this._metaOpts = getMetaSchemaOptions.call(this)\n\n    if (opts.formats) addInitialFormats.call(this)\n    this._addVocabularies()\n    this._addDefaultMetaSchema()\n    if (opts.keywords) addInitialKeywords.call(this, opts.keywords)\n    if (typeof opts.meta == \"object\") this.addMetaSchema(opts.meta)\n    addInitialSchemas.call(this)\n    opts.validateFormats = formatOpt\n  }\n\n  _addVocabularies(): void {\n    this.addKeyword(\"$async\")\n  }\n\n  _addDefaultMetaSchema(): void {\n    const {$data, meta, schemaId} = this.opts\n    let _dataRefSchema: SchemaObject = $dataRefSchema\n    if (schemaId === \"id\") {\n      _dataRefSchema = {...$dataRefSchema}\n      _dataRefSchema.id = _dataRefSchema.$id\n      delete _dataRefSchema.$id\n    }\n    if (meta && $data) this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false)\n  }\n\n  defaultMeta(): string | AnySchemaObject | undefined {\n    const {meta, schemaId} = this.opts\n    return (this.opts.defaultMeta = typeof meta == \"object\" ? meta[schemaId] || meta : undefined)\n  }\n\n  // Validate data using schema\n  // AnySchema will be compiled and cached using schema itself as a key for Map\n  validate(schema: Schema | string, data: unknown): boolean\n  validate(schemaKeyRef: AnySchema | string, data: unknown): boolean | Promise<unknown>\n  validate<T>(schema: Schema | JSONSchemaType<T> | string, data: unknown): data is T\n  // Separated for type inference to work\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  validate<T>(schema: JTDSchemaType<T>, data: unknown): data is T\n  // This overload is only intended for typescript inference, the first\n  // argument prevents manual type annotation from matching this overload\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  validate<N extends never, T extends SomeJTDSchemaType>(\n    schema: T,\n    data: unknown\n  ): data is JTDDataType<T>\n  // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n  validate<T>(schema: AsyncSchema, data: unknown | T): Promise<T>\n  validate<T>(schemaKeyRef: AnySchema | string, data: unknown): data is T | Promise<T>\n  validate<T>(\n    schemaKeyRef: AnySchema | string, // key, ref or schema object\n    // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n    data: unknown | T // to be validated\n  ): boolean | Promise<T> {\n    let v: AnyValidateFunction | undefined\n    if (typeof schemaKeyRef == \"string\") {\n      v = this.getSchema<T>(schemaKeyRef)\n      if (!v) throw new Error(`no schema with key or ref \"${schemaKeyRef}\"`)\n    } else {\n      v = this.compile<T>(schemaKeyRef)\n    }\n\n    const valid = v(data)\n    if (!(\"$async\" in v)) this.errors = v.errors\n    return valid\n  }\n\n  // Create validation function for passed schema\n  // _meta: true if schema is a meta-schema. Used internally to compile meta schemas of user-defined keywords.\n  compile<T = unknown>(schema: Schema | JSONSchemaType<T>, _meta?: boolean): ValidateFunction<T>\n  // Separated for type inference to work\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  compile<T = unknown>(schema: JTDSchemaType<T>, _meta?: boolean): ValidateFunction<T>\n  // This overload is only intended for typescript inference, the first\n  // argument prevents manual type annotation from matching this overload\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  compile<N extends never, T extends SomeJTDSchemaType>(\n    schema: T,\n    _meta?: boolean\n  ): ValidateFunction<JTDDataType<T>>\n  compile<T = unknown>(schema: AsyncSchema, _meta?: boolean): AsyncValidateFunction<T>\n  compile<T = unknown>(schema: AnySchema, _meta?: boolean): AnyValidateFunction<T>\n  compile<T = unknown>(schema: AnySchema, _meta?: boolean): AnyValidateFunction<T> {\n    const sch = this._addSchema(schema, _meta)\n    return (sch.validate || this._compileSchemaEnv(sch)) as AnyValidateFunction<T>\n  }\n\n  // Creates validating function for passed schema with asynchronous loading of missing schemas.\n  // `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.\n  // TODO allow passing schema URI\n  // meta - optional true to compile meta-schema\n  compileAsync<T = unknown>(\n    schema: SchemaObject | JSONSchemaType<T>,\n    _meta?: boolean\n  ): Promise<ValidateFunction<T>>\n  // Separated for type inference to work\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  compileAsync<T = unknown>(schema: JTDSchemaType<T>, _meta?: boolean): Promise<ValidateFunction<T>>\n  compileAsync<T = unknown>(schema: AsyncSchema, meta?: boolean): Promise<AsyncValidateFunction<T>>\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  compileAsync<T = unknown>(\n    schema: AnySchemaObject,\n    meta?: boolean\n  ): Promise<AnyValidateFunction<T>>\n  compileAsync<T = unknown>(\n    schema: AnySchemaObject,\n    meta?: boolean\n  ): Promise<AnyValidateFunction<T>> {\n    if (typeof this.opts.loadSchema != \"function\") {\n      throw new Error(\"options.loadSchema should be a function\")\n    }\n    const {loadSchema} = this.opts\n    return runCompileAsync.call(this, schema, meta)\n\n    async function runCompileAsync(\n      this: Ajv,\n      _schema: AnySchemaObject,\n      _meta?: boolean\n    ): Promise<AnyValidateFunction> {\n      await loadMetaSchema.call(this, _schema.$schema)\n      const sch = this._addSchema(_schema, _meta)\n      return sch.validate || _compileAsync.call(this, sch)\n    }\n\n    async function loadMetaSchema(this: Ajv, $ref?: string): Promise<void> {\n      if ($ref && !this.getSchema($ref)) {\n        await runCompileAsync.call(this, {$ref}, true)\n      }\n    }\n\n    async function _compileAsync(this: Ajv, sch: SchemaEnv): Promise<AnyValidateFunction> {\n      try {\n        return this._compileSchemaEnv(sch)\n      } catch (e) {\n        if (!(e instanceof MissingRefError)) throw e\n        checkLoaded.call(this, e)\n        await loadMissingSchema.call(this, e.missingSchema)\n        return _compileAsync.call(this, sch)\n      }\n    }\n\n    function checkLoaded(this: Ajv, {missingSchema: ref, missingRef}: MissingRefError): void {\n      if (this.refs[ref]) {\n        throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`)\n      }\n    }\n\n    async function loadMissingSchema(this: Ajv, ref: string): Promise<void> {\n      const _schema = await _loadSchema.call(this, ref)\n      if (!this.refs[ref]) await loadMetaSchema.call(this, _schema.$schema)\n      if (!this.refs[ref]) this.addSchema(_schema, ref, meta)\n    }\n\n    async function _loadSchema(this: Ajv, ref: string): Promise<AnySchemaObject> {\n      const p = this._loading[ref]\n      if (p) return p\n      try {\n        return await (this._loading[ref] = loadSchema(ref))\n      } finally {\n        delete this._loading[ref]\n      }\n    }\n  }\n\n  // Adds schema to the instance\n  addSchema(\n    schema: AnySchema | AnySchema[], // If array is passed, `key` will be ignored\n    key?: string, // Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.\n    _meta?: boolean, // true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.\n    _validateSchema = this.opts.validateSchema // false to skip schema validation. Used internally, option validateSchema should be used instead.\n  ): Ajv {\n    if (Array.isArray(schema)) {\n      for (const sch of schema) this.addSchema(sch, undefined, _meta, _validateSchema)\n      return this\n    }\n    let id: string | undefined\n    if (typeof schema === \"object\") {\n      const {schemaId} = this.opts\n      id = schema[schemaId]\n      if (id !== undefined && typeof id != \"string\") {\n        throw new Error(`schema ${schemaId} must be string`)\n      }\n    }\n    key = normalizeId(key || id)\n    this._checkUnique(key)\n    this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true)\n    return this\n  }\n\n  // Add schema that will be used to validate other schemas\n  // options in META_IGNORE_OPTIONS are alway set to false\n  addMetaSchema(\n    schema: AnySchemaObject,\n    key?: string, // schema key\n    _validateSchema = this.opts.validateSchema // false to skip schema validation, can be used to override validateSchema option for meta-schema\n  ): Ajv {\n    this.addSchema(schema, key, true, _validateSchema)\n    return this\n  }\n\n  //  Validate schema against its meta-schema\n  validateSchema(schema: AnySchema, throwOrLogError?: boolean): boolean | Promise<unknown> {\n    if (typeof schema == \"boolean\") return true\n    let $schema: string | AnySchemaObject | undefined\n    $schema = schema.$schema\n    if ($schema !== undefined && typeof $schema != \"string\") {\n      throw new Error(\"$schema must be a string\")\n    }\n    $schema = $schema || this.opts.defaultMeta || this.defaultMeta()\n    if (!$schema) {\n      this.logger.warn(\"meta-schema not available\")\n      this.errors = null\n      return true\n    }\n    const valid = this.validate($schema, schema)\n    if (!valid && throwOrLogError) {\n      const message = \"schema is invalid: \" + this.errorsText()\n      if (this.opts.validateSchema === \"log\") this.logger.error(message)\n      else throw new Error(message)\n    }\n    return valid\n  }\n\n  // Get compiled schema by `key` or `ref`.\n  // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id)\n  getSchema<T = unknown>(keyRef: string): AnyValidateFunction<T> | undefined {\n    let sch\n    while (typeof (sch = getSchEnv.call(this, keyRef)) == \"string\") keyRef = sch\n    if (sch === undefined) {\n      const {schemaId} = this.opts\n      const root = new SchemaEnv({schema: {}, schemaId})\n      sch = resolveSchema.call(this, root, keyRef)\n      if (!sch) return\n      this.refs[keyRef] = sch\n    }\n    return (sch.validate || this._compileSchemaEnv(sch)) as AnyValidateFunction<T> | undefined\n  }\n\n  // Remove cached schema(s).\n  // If no parameter is passed all schemas but meta-schemas are removed.\n  // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.\n  // Even if schema is referenced by other schemas it still can be removed as other schemas have local references.\n  removeSchema(schemaKeyRef?: AnySchema | string | RegExp): Ajv {\n    if (schemaKeyRef instanceof RegExp) {\n      this._removeAllSchemas(this.schemas, schemaKeyRef)\n      this._removeAllSchemas(this.refs, schemaKeyRef)\n      return this\n    }\n    switch (typeof schemaKeyRef) {\n      case \"undefined\":\n        this._removeAllSchemas(this.schemas)\n        this._removeAllSchemas(this.refs)\n        this._cache.clear()\n        return this\n      case \"string\": {\n        const sch = getSchEnv.call(this, schemaKeyRef)\n        if (typeof sch == \"object\") this._cache.delete(sch.schema)\n        delete this.schemas[schemaKeyRef]\n        delete this.refs[schemaKeyRef]\n        return this\n      }\n      case \"object\": {\n        const cacheKey = schemaKeyRef\n        this._cache.delete(cacheKey)\n        let id = schemaKeyRef[this.opts.schemaId]\n        if (id) {\n          id = normalizeId(id)\n          delete this.schemas[id]\n          delete this.refs[id]\n        }\n        return this\n      }\n      default:\n        throw new Error(\"ajv.removeSchema: invalid parameter\")\n    }\n  }\n\n  // add \"vocabulary\" - a collection of keywords\n  addVocabulary(definitions: Vocabulary): Ajv {\n    for (const def of definitions) this.addKeyword(def)\n    return this\n  }\n\n  addKeyword(\n    kwdOrDef: string | KeywordDefinition,\n    def?: KeywordDefinition // deprecated\n  ): Ajv {\n    let keyword: string | string[]\n    if (typeof kwdOrDef == \"string\") {\n      keyword = kwdOrDef\n      if (typeof def == \"object\") {\n        this.logger.warn(\"these parameters are deprecated, see docs for addKeyword\")\n        def.keyword = keyword\n      }\n    } else if (typeof kwdOrDef == \"object\" && def === undefined) {\n      def = kwdOrDef\n      keyword = def.keyword\n      if (Array.isArray(keyword) && !keyword.length) {\n        throw new Error(\"addKeywords: keyword must be string or non-empty array\")\n      }\n    } else {\n      throw new Error(\"invalid addKeywords parameters\")\n    }\n\n    checkKeyword.call(this, keyword, def)\n    if (!def) {\n      eachItem(keyword, (kwd) => addRule.call(this, kwd))\n      return this\n    }\n    keywordMetaschema.call(this, def)\n    const definition: AddedKeywordDefinition = {\n      ...def,\n      type: getJSONTypes(def.type),\n      schemaType: getJSONTypes(def.schemaType),\n    }\n    eachItem(\n      keyword,\n      definition.type.length === 0\n        ? (k) => addRule.call(this, k, definition)\n        : (k) => definition.type.forEach((t) => addRule.call(this, k, definition, t))\n    )\n    return this\n  }\n\n  getKeyword(keyword: string): AddedKeywordDefinition | boolean {\n    const rule = this.RULES.all[keyword]\n    return typeof rule == \"object\" ? rule.definition : !!rule\n  }\n\n  // Remove keyword\n  removeKeyword(keyword: string): Ajv {\n    // TODO return type should be Ajv\n    const {RULES} = this\n    delete RULES.keywords[keyword]\n    delete RULES.all[keyword]\n    for (const group of RULES.rules) {\n      const i = group.rules.findIndex((rule) => rule.keyword === keyword)\n      if (i >= 0) group.rules.splice(i, 1)\n    }\n    return this\n  }\n\n  // Add format\n  addFormat(name: string, format: Format): Ajv {\n    if (typeof format == \"string\") format = new RegExp(format)\n    this.formats[name] = format\n    return this\n  }\n\n  errorsText(\n    errors: ErrorObject[] | null | undefined = this.errors, // optional array of validation errors\n    {separator = \", \", dataVar = \"data\"}: ErrorsTextOptions = {} // optional options with properties `separator` and `dataVar`\n  ): string {\n    if (!errors || errors.length === 0) return \"No errors\"\n    return errors\n      .map((e) => `${dataVar}${e.instancePath} ${e.message}`)\n      .reduce((text, msg) => text + separator + msg)\n  }\n\n  $dataMetaSchema(metaSchema: AnySchemaObject, keywordsJsonPointers: string[]): AnySchemaObject {\n    const rules = this.RULES.all\n    metaSchema = JSON.parse(JSON.stringify(metaSchema))\n    for (const jsonPointer of keywordsJsonPointers) {\n      const segments = jsonPointer.split(\"/\").slice(1) // first segment is an empty string\n      let keywords = metaSchema\n      for (const seg of segments) keywords = keywords[seg] as AnySchemaObject\n\n      for (const key in rules) {\n        const rule = rules[key]\n        if (typeof rule != \"object\") continue\n        const {$data} = rule.definition\n        const schema = keywords[key] as AnySchemaObject | undefined\n        if ($data && schema) keywords[key] = schemaOrData(schema)\n      }\n    }\n\n    return metaSchema\n  }\n\n  private _removeAllSchemas(schemas: {[Ref in string]?: SchemaEnv | string}, regex?: RegExp): void {\n    for (const keyRef in schemas) {\n      const sch = schemas[keyRef]\n      if (!regex || regex.test(keyRef)) {\n        if (typeof sch == \"string\") {\n          delete schemas[keyRef]\n        } else if (sch && !sch.meta) {\n          this._cache.delete(sch.schema)\n          delete schemas[keyRef]\n        }\n      }\n    }\n  }\n\n  _addSchema(\n    schema: AnySchema,\n    meta?: boolean,\n    baseId?: string,\n    validateSchema = this.opts.validateSchema,\n    addSchema = this.opts.addUsedSchema\n  ): SchemaEnv {\n    let id: string | undefined\n    const {schemaId} = this.opts\n    if (typeof schema == \"object\") {\n      id = schema[schemaId]\n    } else {\n      if (this.opts.jtd) throw new Error(\"schema must be object\")\n      else if (typeof schema != \"boolean\") throw new Error(\"schema must be object or boolean\")\n    }\n    let sch = this._cache.get(schema)\n    if (sch !== undefined) return sch\n\n    baseId = normalizeId(id || baseId)\n    const localRefs = getSchemaRefs.call(this, schema, baseId)\n    sch = new SchemaEnv({schema, schemaId, meta, baseId, localRefs})\n    this._cache.set(sch.schema, sch)\n    if (addSchema && !baseId.startsWith(\"#\")) {\n      // TODO atm it is allowed to overwrite schemas without id (instead of not adding them)\n      if (baseId) this._checkUnique(baseId)\n      this.refs[baseId] = sch\n    }\n    if (validateSchema) this.validateSchema(schema, true)\n    return sch\n  }\n\n  private _checkUnique(id: string): void {\n    if (this.schemas[id] || this.refs[id]) {\n      throw new Error(`schema with key or id \"${id}\" already exists`)\n    }\n  }\n\n  private _compileSchemaEnv(sch: SchemaEnv): AnyValidateFunction {\n    if (sch.meta) this._compileMetaSchema(sch)\n    else compileSchema.call(this, sch)\n\n    /* istanbul ignore if */\n    if (!sch.validate) throw new Error(\"ajv implementation error\")\n    return sch.validate\n  }\n\n  private _compileMetaSchema(sch: SchemaEnv): void {\n    const currentOpts = this.opts\n    this.opts = this._metaOpts\n    try {\n      compileSchema.call(this, sch)\n    } finally {\n      this.opts = currentOpts\n    }\n  }\n}\n\nexport interface ErrorsTextOptions {\n  separator?: string\n  dataVar?: string\n}\n\nfunction checkOptions(\n  this: Ajv,\n  checkOpts: OptionsInfo<RemovedOptions | DeprecatedOptions>,\n  options: Options & RemovedOptions,\n  msg: string,\n  log: \"warn\" | \"error\" = \"error\"\n): void {\n  for (const key in checkOpts) {\n    const opt = key as keyof typeof checkOpts\n    if (opt in options) this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`)\n  }\n}\n\nfunction getSchEnv(this: Ajv, keyRef: string): SchemaEnv | string | undefined {\n  keyRef = normalizeId(keyRef) // TODO tests fail without this line\n  return this.schemas[keyRef] || this.refs[keyRef]\n}\n\nfunction addInitialSchemas(this: Ajv): void {\n  const optsSchemas = this.opts.schemas\n  if (!optsSchemas) return\n  if (Array.isArray(optsSchemas)) this.addSchema(optsSchemas)\n  else for (const key in optsSchemas) this.addSchema(optsSchemas[key] as AnySchema, key)\n}\n\nfunction addInitialFormats(this: Ajv): void {\n  for (const name in this.opts.formats) {\n    const format = this.opts.formats[name]\n    if (format) this.addFormat(name, format)\n  }\n}\n\nfunction addInitialKeywords(\n  this: Ajv,\n  defs: Vocabulary | {[K in string]?: KeywordDefinition}\n): void {\n  if (Array.isArray(defs)) {\n    this.addVocabulary(defs)\n    return\n  }\n  this.logger.warn(\"keywords option as map is deprecated, pass array\")\n  for (const keyword in defs) {\n    const def = defs[keyword] as KeywordDefinition\n    if (!def.keyword) def.keyword = keyword\n    this.addKeyword(def)\n  }\n}\n\nfunction getMetaSchemaOptions(this: Ajv): InstanceOptions {\n  const metaOpts = {...this.opts}\n  for (const opt of META_IGNORE_OPTIONS) delete metaOpts[opt]\n  return metaOpts\n}\n\nconst noLogs = {log() {}, warn() {}, error() {}}\n\nfunction getLogger(logger?: Partial<Logger> | false): Logger {\n  if (logger === false) return noLogs\n  if (logger === undefined) return console\n  if (logger.log && logger.warn && logger.error) return logger as Logger\n  throw new Error(\"logger must implement log, warn and error methods\")\n}\n\nconst KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i\n\nfunction checkKeyword(this: Ajv, keyword: string | string[], def?: KeywordDefinition): void {\n  const {RULES} = this\n  eachItem(keyword, (kwd) => {\n    if (RULES.keywords[kwd]) throw new Error(`Keyword ${kwd} is already defined`)\n    if (!KEYWORD_NAME.test(kwd)) throw new Error(`Keyword ${kwd} has invalid name`)\n  })\n  if (!def) return\n  if (def.$data && !(\"code\" in def || \"validate\" in def)) {\n    throw new Error('$data keyword must have \"code\" or \"validate\" function')\n  }\n}\n\nfunction addRule(\n  this: Ajv,\n  keyword: string,\n  definition?: AddedKeywordDefinition,\n  dataType?: JSONType\n): void {\n  const post = definition?.post\n  if (dataType && post) throw new Error('keyword with \"post\" flag cannot have \"type\"')\n  const {RULES} = this\n  let ruleGroup = post ? RULES.post : RULES.rules.find(({type: t}) => t === dataType)\n  if (!ruleGroup) {\n    ruleGroup = {type: dataType, rules: []}\n    RULES.rules.push(ruleGroup)\n  }\n  RULES.keywords[keyword] = true\n  if (!definition) return\n\n  const rule: Rule = {\n    keyword,\n    definition: {\n      ...definition,\n      type: getJSONTypes(definition.type),\n      schemaType: getJSONTypes(definition.schemaType),\n    },\n  }\n  if (definition.before) addBeforeRule.call(this, ruleGroup, rule, definition.before)\n  else ruleGroup.rules.push(rule)\n  RULES.all[keyword] = rule\n  definition.implements?.forEach((kwd) => this.addKeyword(kwd))\n}\n\nfunction addBeforeRule(this: Ajv, ruleGroup: RuleGroup, rule: Rule, before: string): void {\n  const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before)\n  if (i >= 0) {\n    ruleGroup.rules.splice(i, 0, rule)\n  } else {\n    ruleGroup.rules.push(rule)\n    this.logger.warn(`rule ${before} is not defined`)\n  }\n}\n\nfunction keywordMetaschema(this: Ajv, def: KeywordDefinition): void {\n  let {metaSchema} = def\n  if (metaSchema === undefined) return\n  if (def.$data && this.opts.$data) metaSchema = schemaOrData(metaSchema)\n  def.validateSchema = this.compile(metaSchema, true)\n}\n\nconst $dataRef = {\n  $ref: \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#\",\n}\n\nfunction schemaOrData(schema: AnySchema): AnySchemaObject {\n  return {anyOf: [schema, $dataRef]}\n}\n"
  },
  {
    "path": "lib/jtd.ts",
    "content": "import type {AnySchemaObject, SchemaObject, JTDParser} from \"./types\"\nimport type {JTDSchemaType, SomeJTDSchemaType, JTDDataType} from \"./types/jtd-schema\"\nimport AjvCore, {CurrentOptions} from \"./core\"\nimport jtdVocabulary from \"./vocabularies/jtd\"\nimport jtdMetaSchema from \"./refs/jtd-schema\"\nimport compileSerializer from \"./compile/jtd/serialize\"\nimport compileParser from \"./compile/jtd/parse\"\nimport {SchemaEnv} from \"./compile\"\n\nconst META_SCHEMA_ID = \"JTD-meta-schema\"\n\ntype JTDOptions = CurrentOptions & {\n  // strict mode options not supported with JTD:\n  strict?: never\n  allowMatchingProperties?: never\n  allowUnionTypes?: never\n  validateFormats?: never\n  // validation and reporting options not supported with JTD:\n  $data?: never\n  verbose?: boolean\n  $comment?: never\n  formats?: never\n  loadSchema?: never\n  // options to modify validated data:\n  useDefaults?: never\n  coerceTypes?: never\n  // advanced options:\n  next?: never\n  unevaluated?: never\n  dynamicRef?: never\n  meta?: boolean\n  defaultMeta?: never\n  inlineRefs?: boolean\n  loopRequired?: never\n  multipleOfPrecision?: never\n}\n\nexport class Ajv extends AjvCore {\n  constructor(opts: JTDOptions = {}) {\n    super({\n      ...opts,\n      jtd: true,\n    })\n  }\n\n  _addVocabularies(): void {\n    super._addVocabularies()\n    this.addVocabulary(jtdVocabulary)\n  }\n\n  _addDefaultMetaSchema(): void {\n    super._addDefaultMetaSchema()\n    if (!this.opts.meta) return\n    this.addMetaSchema(jtdMetaSchema, META_SCHEMA_ID, false)\n  }\n\n  defaultMeta(): string | AnySchemaObject | undefined {\n    return (this.opts.defaultMeta =\n      super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined))\n  }\n\n  compileSerializer<T = unknown>(schema: SchemaObject): (data: T) => string\n  // Separated for type inference to work\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  compileSerializer<T = unknown>(schema: JTDSchemaType<T>): (data: T) => string\n  compileSerializer<T = unknown>(schema: SchemaObject): (data: T) => string {\n    const sch = this._addSchema(schema)\n    return sch.serialize || this._compileSerializer(sch)\n  }\n\n  compileParser<T = unknown>(schema: SchemaObject): JTDParser<T>\n  // Separated for type inference to work\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  compileParser<T = unknown>(schema: JTDSchemaType<T>): JTDParser<T>\n  compileParser<T = unknown>(schema: SchemaObject): JTDParser<T> {\n    const sch = this._addSchema(schema)\n    return (sch.parse || this._compileParser(sch)) as JTDParser<T>\n  }\n\n  private _compileSerializer<T>(sch: SchemaEnv): (data: T) => string {\n    compileSerializer.call(this, sch, (sch.schema as AnySchemaObject).definitions || {})\n    /* istanbul ignore if */\n    if (!sch.serialize) throw new Error(\"ajv implementation error\")\n    return sch.serialize\n  }\n\n  private _compileParser(sch: SchemaEnv): JTDParser {\n    compileParser.call(this, sch, (sch.schema as AnySchemaObject).definitions || {})\n    /* istanbul ignore if */\n    if (!sch.parse) throw new Error(\"ajv implementation error\")\n    return sch.parse\n  }\n}\n\nmodule.exports = exports = Ajv\nmodule.exports.Ajv = Ajv\nObject.defineProperty(exports, \"__esModule\", {value: true})\n\nexport default Ajv\n\nexport {\n  Format,\n  FormatDefinition,\n  AsyncFormatDefinition,\n  KeywordDefinition,\n  KeywordErrorDefinition,\n  CodeKeywordDefinition,\n  MacroKeywordDefinition,\n  FuncKeywordDefinition,\n  Vocabulary,\n  Schema,\n  SchemaObject,\n  AnySchemaObject,\n  AsyncSchema,\n  AnySchema,\n  ValidateFunction,\n  AsyncValidateFunction,\n  ErrorObject,\n  ErrorNoParams,\n  JTDParser,\n} from \"./types\"\n\nexport {Plugin, Options, CodeOptions, InstanceOptions, Logger, ErrorsTextOptions} from \"./core\"\nexport {SchemaCxt, SchemaObjCxt} from \"./compile\"\nexport {KeywordCxt} from \"./compile/validate\"\nexport {JTDErrorObject} from \"./vocabularies/jtd\"\nexport {_, str, stringify, nil, Name, Code, CodeGen, CodeGenOptions} from \"./compile/codegen\"\n\nexport {JTDSchemaType, SomeJTDSchemaType, JTDDataType}\nexport {JTDOptions}\nexport {default as ValidationError} from \"./runtime/validation_error\"\nexport {default as MissingRefError} from \"./compile/ref_error\"\n"
  },
  {
    "path": "lib/refs/data.json",
    "content": "{\n  \"$id\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#\",\n  \"description\": \"Meta-schema for $data reference (JSON AnySchema extension proposal)\",\n  \"type\": \"object\",\n  \"required\": [\"$data\"],\n  \"properties\": {\n    \"$data\": {\n      \"type\": \"string\",\n      \"anyOf\": [{\"format\": \"relative-json-pointer\"}, {\"format\": \"json-pointer\"}]\n    }\n  },\n  \"additionalProperties\": false\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/index.ts",
    "content": "import type Ajv from \"../../core\"\nimport type {AnySchemaObject} from \"../../types\"\nimport * as metaSchema from \"./schema.json\"\nimport * as applicator from \"./meta/applicator.json\"\nimport * as content from \"./meta/content.json\"\nimport * as core from \"./meta/core.json\"\nimport * as format from \"./meta/format.json\"\nimport * as metadata from \"./meta/meta-data.json\"\nimport * as validation from \"./meta/validation.json\"\n\nconst META_SUPPORT_DATA = [\"/properties\"]\n\nexport default function addMetaSchema2019(this: Ajv, $data?: boolean): Ajv {\n  ;[\n    metaSchema,\n    applicator,\n    content,\n    core,\n    with$data(this, format),\n    metadata,\n    with$data(this, validation),\n  ].forEach((sch) => this.addMetaSchema(sch, undefined, false))\n  return this\n\n  function with$data(ajv: Ajv, sch: AnySchemaObject): AnySchemaObject {\n    return $data ? ajv.$dataMetaSchema(sch, META_SUPPORT_DATA) : sch\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/meta/applicator.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$id\": \"https://json-schema.org/draft/2019-09/meta/applicator\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2019-09/vocab/applicator\": true\n  },\n  \"$recursiveAnchor\": true,\n\n  \"title\": \"Applicator vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"additionalItems\": {\"$recursiveRef\": \"#\"},\n    \"unevaluatedItems\": {\"$recursiveRef\": \"#\"},\n    \"items\": {\n      \"anyOf\": [{\"$recursiveRef\": \"#\"}, {\"$ref\": \"#/$defs/schemaArray\"}]\n    },\n    \"contains\": {\"$recursiveRef\": \"#\"},\n    \"additionalProperties\": {\"$recursiveRef\": \"#\"},\n    \"unevaluatedProperties\": {\"$recursiveRef\": \"#\"},\n    \"properties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$recursiveRef\": \"#\"},\n      \"default\": {}\n    },\n    \"patternProperties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$recursiveRef\": \"#\"},\n      \"propertyNames\": {\"format\": \"regex\"},\n      \"default\": {}\n    },\n    \"dependentSchemas\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"$recursiveRef\": \"#\"\n      }\n    },\n    \"propertyNames\": {\"$recursiveRef\": \"#\"},\n    \"if\": {\"$recursiveRef\": \"#\"},\n    \"then\": {\"$recursiveRef\": \"#\"},\n    \"else\": {\"$recursiveRef\": \"#\"},\n    \"allOf\": {\"$ref\": \"#/$defs/schemaArray\"},\n    \"anyOf\": {\"$ref\": \"#/$defs/schemaArray\"},\n    \"oneOf\": {\"$ref\": \"#/$defs/schemaArray\"},\n    \"not\": {\"$recursiveRef\": \"#\"}\n  },\n  \"$defs\": {\n    \"schemaArray\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\"$recursiveRef\": \"#\"}\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/meta/content.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$id\": \"https://json-schema.org/draft/2019-09/meta/content\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2019-09/vocab/content\": true\n  },\n  \"$recursiveAnchor\": true,\n\n  \"title\": \"Content vocabulary meta-schema\",\n\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"contentMediaType\": {\"type\": \"string\"},\n    \"contentEncoding\": {\"type\": \"string\"},\n    \"contentSchema\": {\"$recursiveRef\": \"#\"}\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/meta/core.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$id\": \"https://json-schema.org/draft/2019-09/meta/core\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2019-09/vocab/core\": true\n  },\n  \"$recursiveAnchor\": true,\n\n  \"title\": \"Core vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"$id\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\",\n      \"$comment\": \"Non-empty fragments not allowed.\",\n      \"pattern\": \"^[^#]*#?$\"\n    },\n    \"$schema\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"$anchor\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[A-Za-z][-A-Za-z0-9.:_]*$\"\n    },\n    \"$ref\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    },\n    \"$recursiveRef\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    },\n    \"$recursiveAnchor\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"$vocabulary\": {\n      \"type\": \"object\",\n      \"propertyNames\": {\n        \"type\": \"string\",\n        \"format\": \"uri\"\n      },\n      \"additionalProperties\": {\n        \"type\": \"boolean\"\n      }\n    },\n    \"$comment\": {\n      \"type\": \"string\"\n    },\n    \"$defs\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$recursiveRef\": \"#\"},\n      \"default\": {}\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/meta/format.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$id\": \"https://json-schema.org/draft/2019-09/meta/format\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2019-09/vocab/format\": true\n  },\n  \"$recursiveAnchor\": true,\n\n  \"title\": \"Format vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"format\": {\"type\": \"string\"}\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/meta/meta-data.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$id\": \"https://json-schema.org/draft/2019-09/meta/meta-data\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2019-09/vocab/meta-data\": true\n  },\n  \"$recursiveAnchor\": true,\n\n  \"title\": \"Meta-data vocabulary meta-schema\",\n\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"title\": {\n      \"type\": \"string\"\n    },\n    \"description\": {\n      \"type\": \"string\"\n    },\n    \"default\": true,\n    \"deprecated\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"readOnly\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"writeOnly\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"examples\": {\n      \"type\": \"array\",\n      \"items\": true\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/meta/validation.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$id\": \"https://json-schema.org/draft/2019-09/meta/validation\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2019-09/vocab/validation\": true\n  },\n  \"$recursiveAnchor\": true,\n\n  \"title\": \"Validation vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"multipleOf\": {\n      \"type\": \"number\",\n      \"exclusiveMinimum\": 0\n    },\n    \"maximum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMaximum\": {\n      \"type\": \"number\"\n    },\n    \"minimum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMinimum\": {\n      \"type\": \"number\"\n    },\n    \"maxLength\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minLength\": {\"$ref\": \"#/$defs/nonNegativeIntegerDefault0\"},\n    \"pattern\": {\n      \"type\": \"string\",\n      \"format\": \"regex\"\n    },\n    \"maxItems\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minItems\": {\"$ref\": \"#/$defs/nonNegativeIntegerDefault0\"},\n    \"uniqueItems\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"maxContains\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minContains\": {\n      \"$ref\": \"#/$defs/nonNegativeInteger\",\n      \"default\": 1\n    },\n    \"maxProperties\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minProperties\": {\"$ref\": \"#/$defs/nonNegativeIntegerDefault0\"},\n    \"required\": {\"$ref\": \"#/$defs/stringArray\"},\n    \"dependentRequired\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"$ref\": \"#/$defs/stringArray\"\n      }\n    },\n    \"const\": true,\n    \"enum\": {\n      \"type\": \"array\",\n      \"items\": true\n    },\n    \"type\": {\n      \"anyOf\": [\n        {\"$ref\": \"#/$defs/simpleTypes\"},\n        {\n          \"type\": \"array\",\n          \"items\": {\"$ref\": \"#/$defs/simpleTypes\"},\n          \"minItems\": 1,\n          \"uniqueItems\": true\n        }\n      ]\n    }\n  },\n  \"$defs\": {\n    \"nonNegativeInteger\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"nonNegativeIntegerDefault0\": {\n      \"$ref\": \"#/$defs/nonNegativeInteger\",\n      \"default\": 0\n    },\n    \"simpleTypes\": {\n      \"enum\": [\"array\", \"boolean\", \"integer\", \"null\", \"number\", \"object\", \"string\"]\n    },\n    \"stringArray\": {\n      \"type\": \"array\",\n      \"items\": {\"type\": \"string\"},\n      \"uniqueItems\": true,\n      \"default\": []\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2019-09/schema.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$id\": \"https://json-schema.org/draft/2019-09/schema\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2019-09/vocab/core\": true,\n    \"https://json-schema.org/draft/2019-09/vocab/applicator\": true,\n    \"https://json-schema.org/draft/2019-09/vocab/validation\": true,\n    \"https://json-schema.org/draft/2019-09/vocab/meta-data\": true,\n    \"https://json-schema.org/draft/2019-09/vocab/format\": false,\n    \"https://json-schema.org/draft/2019-09/vocab/content\": true\n  },\n  \"$recursiveAnchor\": true,\n\n  \"title\": \"Core and Validation specifications meta-schema\",\n  \"allOf\": [\n    {\"$ref\": \"meta/core\"},\n    {\"$ref\": \"meta/applicator\"},\n    {\"$ref\": \"meta/validation\"},\n    {\"$ref\": \"meta/meta-data\"},\n    {\"$ref\": \"meta/format\"},\n    {\"$ref\": \"meta/content\"}\n  ],\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"definitions\": {\n      \"$comment\": \"While no longer an official keyword as it is replaced by $defs, this keyword is retained in the meta-schema to prevent incompatible extensions as it remains in common use.\",\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$recursiveRef\": \"#\"},\n      \"default\": {}\n    },\n    \"dependencies\": {\n      \"$comment\": \"\\\"dependencies\\\" is no longer a keyword, but schema authors should avoid redefining it to facilitate a smooth transition to \\\"dependentSchemas\\\" and \\\"dependentRequired\\\"\",\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"anyOf\": [{\"$recursiveRef\": \"#\"}, {\"$ref\": \"meta/validation#/$defs/stringArray\"}]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/index.ts",
    "content": "import type Ajv from \"../../core\"\nimport type {AnySchemaObject} from \"../../types\"\nimport * as metaSchema from \"./schema.json\"\nimport * as applicator from \"./meta/applicator.json\"\nimport * as unevaluated from \"./meta/unevaluated.json\"\nimport * as content from \"./meta/content.json\"\nimport * as core from \"./meta/core.json\"\nimport * as format from \"./meta/format-annotation.json\"\nimport * as metadata from \"./meta/meta-data.json\"\nimport * as validation from \"./meta/validation.json\"\n\nconst META_SUPPORT_DATA = [\"/properties\"]\n\nexport default function addMetaSchema2020(this: Ajv, $data?: boolean): Ajv {\n  ;[\n    metaSchema,\n    applicator,\n    unevaluated,\n    content,\n    core,\n    with$data(this, format),\n    metadata,\n    with$data(this, validation),\n  ].forEach((sch) => this.addMetaSchema(sch, undefined, false))\n  return this\n\n  function with$data(ajv: Ajv, sch: AnySchemaObject): AnySchemaObject {\n    return $data ? ajv.$dataMetaSchema(sch, META_SUPPORT_DATA) : sch\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/meta/applicator.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/meta/applicator\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/applicator\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Applicator vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"prefixItems\": {\"$ref\": \"#/$defs/schemaArray\"},\n    \"items\": {\"$dynamicRef\": \"#meta\"},\n    \"contains\": {\"$dynamicRef\": \"#meta\"},\n    \"additionalProperties\": {\"$dynamicRef\": \"#meta\"},\n    \"properties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$dynamicRef\": \"#meta\"},\n      \"default\": {}\n    },\n    \"patternProperties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$dynamicRef\": \"#meta\"},\n      \"propertyNames\": {\"format\": \"regex\"},\n      \"default\": {}\n    },\n    \"dependentSchemas\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$dynamicRef\": \"#meta\"},\n      \"default\": {}\n    },\n    \"propertyNames\": {\"$dynamicRef\": \"#meta\"},\n    \"if\": {\"$dynamicRef\": \"#meta\"},\n    \"then\": {\"$dynamicRef\": \"#meta\"},\n    \"else\": {\"$dynamicRef\": \"#meta\"},\n    \"allOf\": {\"$ref\": \"#/$defs/schemaArray\"},\n    \"anyOf\": {\"$ref\": \"#/$defs/schemaArray\"},\n    \"oneOf\": {\"$ref\": \"#/$defs/schemaArray\"},\n    \"not\": {\"$dynamicRef\": \"#meta\"}\n  },\n  \"$defs\": {\n    \"schemaArray\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\"$dynamicRef\": \"#meta\"}\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/meta/content.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/meta/content\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/content\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Content vocabulary meta-schema\",\n\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"contentEncoding\": {\"type\": \"string\"},\n    \"contentMediaType\": {\"type\": \"string\"},\n    \"contentSchema\": {\"$dynamicRef\": \"#meta\"}\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/meta/core.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/meta/core\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/core\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Core vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"$id\": {\n      \"$ref\": \"#/$defs/uriReferenceString\",\n      \"$comment\": \"Non-empty fragments not allowed.\",\n      \"pattern\": \"^[^#]*#?$\"\n    },\n    \"$schema\": {\"$ref\": \"#/$defs/uriString\"},\n    \"$ref\": {\"$ref\": \"#/$defs/uriReferenceString\"},\n    \"$anchor\": {\"$ref\": \"#/$defs/anchorString\"},\n    \"$dynamicRef\": {\"$ref\": \"#/$defs/uriReferenceString\"},\n    \"$dynamicAnchor\": {\"$ref\": \"#/$defs/anchorString\"},\n    \"$vocabulary\": {\n      \"type\": \"object\",\n      \"propertyNames\": {\"$ref\": \"#/$defs/uriString\"},\n      \"additionalProperties\": {\n        \"type\": \"boolean\"\n      }\n    },\n    \"$comment\": {\n      \"type\": \"string\"\n    },\n    \"$defs\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$dynamicRef\": \"#meta\"}\n    }\n  },\n  \"$defs\": {\n    \"anchorString\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[A-Za-z_][-A-Za-z0-9._]*$\"\n    },\n    \"uriString\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"uriReferenceString\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/meta/format-annotation.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/meta/format-annotation\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/format-annotation\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Format vocabulary meta-schema for annotation results\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"format\": {\"type\": \"string\"}\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/meta/meta-data.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/meta/meta-data\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/meta-data\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Meta-data vocabulary meta-schema\",\n\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"title\": {\n      \"type\": \"string\"\n    },\n    \"description\": {\n      \"type\": \"string\"\n    },\n    \"default\": true,\n    \"deprecated\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"readOnly\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"writeOnly\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"examples\": {\n      \"type\": \"array\",\n      \"items\": true\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/meta/unevaluated.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/meta/unevaluated\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/unevaluated\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Unevaluated applicator vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"unevaluatedItems\": {\"$dynamicRef\": \"#meta\"},\n    \"unevaluatedProperties\": {\"$dynamicRef\": \"#meta\"}\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/meta/validation.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/meta/validation\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/validation\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Validation vocabulary meta-schema\",\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"type\": {\n      \"anyOf\": [\n        {\"$ref\": \"#/$defs/simpleTypes\"},\n        {\n          \"type\": \"array\",\n          \"items\": {\"$ref\": \"#/$defs/simpleTypes\"},\n          \"minItems\": 1,\n          \"uniqueItems\": true\n        }\n      ]\n    },\n    \"const\": true,\n    \"enum\": {\n      \"type\": \"array\",\n      \"items\": true\n    },\n    \"multipleOf\": {\n      \"type\": \"number\",\n      \"exclusiveMinimum\": 0\n    },\n    \"maximum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMaximum\": {\n      \"type\": \"number\"\n    },\n    \"minimum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMinimum\": {\n      \"type\": \"number\"\n    },\n    \"maxLength\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minLength\": {\"$ref\": \"#/$defs/nonNegativeIntegerDefault0\"},\n    \"pattern\": {\n      \"type\": \"string\",\n      \"format\": \"regex\"\n    },\n    \"maxItems\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minItems\": {\"$ref\": \"#/$defs/nonNegativeIntegerDefault0\"},\n    \"uniqueItems\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"maxContains\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minContains\": {\n      \"$ref\": \"#/$defs/nonNegativeInteger\",\n      \"default\": 1\n    },\n    \"maxProperties\": {\"$ref\": \"#/$defs/nonNegativeInteger\"},\n    \"minProperties\": {\"$ref\": \"#/$defs/nonNegativeIntegerDefault0\"},\n    \"required\": {\"$ref\": \"#/$defs/stringArray\"},\n    \"dependentRequired\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"$ref\": \"#/$defs/stringArray\"\n      }\n    }\n  },\n  \"$defs\": {\n    \"nonNegativeInteger\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"nonNegativeIntegerDefault0\": {\n      \"$ref\": \"#/$defs/nonNegativeInteger\",\n      \"default\": 0\n    },\n    \"simpleTypes\": {\n      \"enum\": [\"array\", \"boolean\", \"integer\", \"null\", \"number\", \"object\", \"string\"]\n    },\n    \"stringArray\": {\n      \"type\": \"array\",\n      \"items\": {\"type\": \"string\"},\n      \"uniqueItems\": true,\n      \"default\": []\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-2020-12/schema.json",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$vocabulary\": {\n    \"https://json-schema.org/draft/2020-12/vocab/core\": true,\n    \"https://json-schema.org/draft/2020-12/vocab/applicator\": true,\n    \"https://json-schema.org/draft/2020-12/vocab/unevaluated\": true,\n    \"https://json-schema.org/draft/2020-12/vocab/validation\": true,\n    \"https://json-schema.org/draft/2020-12/vocab/meta-data\": true,\n    \"https://json-schema.org/draft/2020-12/vocab/format-annotation\": true,\n    \"https://json-schema.org/draft/2020-12/vocab/content\": true\n  },\n  \"$dynamicAnchor\": \"meta\",\n\n  \"title\": \"Core and Validation specifications meta-schema\",\n  \"allOf\": [\n    {\"$ref\": \"meta/core\"},\n    {\"$ref\": \"meta/applicator\"},\n    {\"$ref\": \"meta/unevaluated\"},\n    {\"$ref\": \"meta/validation\"},\n    {\"$ref\": \"meta/meta-data\"},\n    {\"$ref\": \"meta/format-annotation\"},\n    {\"$ref\": \"meta/content\"}\n  ],\n  \"type\": [\"object\", \"boolean\"],\n  \"$comment\": \"This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.\",\n  \"properties\": {\n    \"definitions\": {\n      \"$comment\": \"\\\"definitions\\\" has been replaced by \\\"$defs\\\".\",\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$dynamicRef\": \"#meta\"},\n      \"deprecated\": true,\n      \"default\": {}\n    },\n    \"dependencies\": {\n      \"$comment\": \"\\\"dependencies\\\" has been split and replaced by \\\"dependentSchemas\\\" and \\\"dependentRequired\\\" in order to serve their differing semantics.\",\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"anyOf\": [{\"$dynamicRef\": \"#meta\"}, {\"$ref\": \"meta/validation#/$defs/stringArray\"}]\n      },\n      \"deprecated\": true,\n      \"default\": {}\n    },\n    \"$recursiveAnchor\": {\n      \"$comment\": \"\\\"$recursiveAnchor\\\" has been replaced by \\\"$dynamicAnchor\\\".\",\n      \"$ref\": \"meta/core#/$defs/anchorString\",\n      \"deprecated\": true\n    },\n    \"$recursiveRef\": {\n      \"$comment\": \"\\\"$recursiveRef\\\" has been replaced by \\\"$dynamicRef\\\".\",\n      \"$ref\": \"meta/core#/$defs/uriReferenceString\",\n      \"deprecated\": true\n    }\n  }\n}\n"
  },
  {
    "path": "lib/refs/json-schema-draft-06.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-06/schema#\",\n  \"$id\": \"http://json-schema.org/draft-06/schema#\",\n  \"title\": \"Core schema meta-schema\",\n  \"definitions\": {\n    \"schemaArray\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\"$ref\": \"#\"}\n    },\n    \"nonNegativeInteger\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"nonNegativeIntegerDefault0\": {\n      \"allOf\": [{\"$ref\": \"#/definitions/nonNegativeInteger\"}, {\"default\": 0}]\n    },\n    \"simpleTypes\": {\n      \"enum\": [\"array\", \"boolean\", \"integer\", \"null\", \"number\", \"object\", \"string\"]\n    },\n    \"stringArray\": {\n      \"type\": \"array\",\n      \"items\": {\"type\": \"string\"},\n      \"uniqueItems\": true,\n      \"default\": []\n    }\n  },\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"$id\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    },\n    \"$schema\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"$ref\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    },\n    \"title\": {\n      \"type\": \"string\"\n    },\n    \"description\": {\n      \"type\": \"string\"\n    },\n    \"default\": {},\n    \"examples\": {\n      \"type\": \"array\",\n      \"items\": {}\n    },\n    \"multipleOf\": {\n      \"type\": \"number\",\n      \"exclusiveMinimum\": 0\n    },\n    \"maximum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMaximum\": {\n      \"type\": \"number\"\n    },\n    \"minimum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMinimum\": {\n      \"type\": \"number\"\n    },\n    \"maxLength\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n    \"minLength\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n    \"pattern\": {\n      \"type\": \"string\",\n      \"format\": \"regex\"\n    },\n    \"additionalItems\": {\"$ref\": \"#\"},\n    \"items\": {\n      \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/schemaArray\"}],\n      \"default\": {}\n    },\n    \"maxItems\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n    \"minItems\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n    \"uniqueItems\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"contains\": {\"$ref\": \"#\"},\n    \"maxProperties\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n    \"minProperties\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n    \"required\": {\"$ref\": \"#/definitions/stringArray\"},\n    \"additionalProperties\": {\"$ref\": \"#\"},\n    \"definitions\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$ref\": \"#\"},\n      \"default\": {}\n    },\n    \"properties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$ref\": \"#\"},\n      \"default\": {}\n    },\n    \"patternProperties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$ref\": \"#\"},\n      \"default\": {}\n    },\n    \"dependencies\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/stringArray\"}]\n      }\n    },\n    \"propertyNames\": {\"$ref\": \"#\"},\n    \"const\": {},\n    \"enum\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"uniqueItems\": true\n    },\n    \"type\": {\n      \"anyOf\": [\n        {\"$ref\": \"#/definitions/simpleTypes\"},\n        {\n          \"type\": \"array\",\n          \"items\": {\"$ref\": \"#/definitions/simpleTypes\"},\n          \"minItems\": 1,\n          \"uniqueItems\": true\n        }\n      ]\n    },\n    \"format\": {\"type\": \"string\"},\n    \"allOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"anyOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"oneOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"not\": {\"$ref\": \"#\"}\n  },\n  \"default\": {}\n}\n"
  },
  {
    "path": "lib/refs/json-schema-draft-07.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"http://json-schema.org/draft-07/schema#\",\n  \"title\": \"Core schema meta-schema\",\n  \"definitions\": {\n    \"schemaArray\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\"$ref\": \"#\"}\n    },\n    \"nonNegativeInteger\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"nonNegativeIntegerDefault0\": {\n      \"allOf\": [{\"$ref\": \"#/definitions/nonNegativeInteger\"}, {\"default\": 0}]\n    },\n    \"simpleTypes\": {\n      \"enum\": [\"array\", \"boolean\", \"integer\", \"null\", \"number\", \"object\", \"string\"]\n    },\n    \"stringArray\": {\n      \"type\": \"array\",\n      \"items\": {\"type\": \"string\"},\n      \"uniqueItems\": true,\n      \"default\": []\n    }\n  },\n  \"type\": [\"object\", \"boolean\"],\n  \"properties\": {\n    \"$id\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    },\n    \"$schema\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"$ref\": {\n      \"type\": \"string\",\n      \"format\": \"uri-reference\"\n    },\n    \"$comment\": {\n      \"type\": \"string\"\n    },\n    \"title\": {\n      \"type\": \"string\"\n    },\n    \"description\": {\n      \"type\": \"string\"\n    },\n    \"default\": true,\n    \"readOnly\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"examples\": {\n      \"type\": \"array\",\n      \"items\": true\n    },\n    \"multipleOf\": {\n      \"type\": \"number\",\n      \"exclusiveMinimum\": 0\n    },\n    \"maximum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMaximum\": {\n      \"type\": \"number\"\n    },\n    \"minimum\": {\n      \"type\": \"number\"\n    },\n    \"exclusiveMinimum\": {\n      \"type\": \"number\"\n    },\n    \"maxLength\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n    \"minLength\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n    \"pattern\": {\n      \"type\": \"string\",\n      \"format\": \"regex\"\n    },\n    \"additionalItems\": {\"$ref\": \"#\"},\n    \"items\": {\n      \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/schemaArray\"}],\n      \"default\": true\n    },\n    \"maxItems\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n    \"minItems\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n    \"uniqueItems\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"contains\": {\"$ref\": \"#\"},\n    \"maxProperties\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n    \"minProperties\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n    \"required\": {\"$ref\": \"#/definitions/stringArray\"},\n    \"additionalProperties\": {\"$ref\": \"#\"},\n    \"definitions\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$ref\": \"#\"},\n      \"default\": {}\n    },\n    \"properties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$ref\": \"#\"},\n      \"default\": {}\n    },\n    \"patternProperties\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\"$ref\": \"#\"},\n      \"propertyNames\": {\"format\": \"regex\"},\n      \"default\": {}\n    },\n    \"dependencies\": {\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/stringArray\"}]\n      }\n    },\n    \"propertyNames\": {\"$ref\": \"#\"},\n    \"const\": true,\n    \"enum\": {\n      \"type\": \"array\",\n      \"items\": true,\n      \"minItems\": 1,\n      \"uniqueItems\": true\n    },\n    \"type\": {\n      \"anyOf\": [\n        {\"$ref\": \"#/definitions/simpleTypes\"},\n        {\n          \"type\": \"array\",\n          \"items\": {\"$ref\": \"#/definitions/simpleTypes\"},\n          \"minItems\": 1,\n          \"uniqueItems\": true\n        }\n      ]\n    },\n    \"format\": {\"type\": \"string\"},\n    \"contentMediaType\": {\"type\": \"string\"},\n    \"contentEncoding\": {\"type\": \"string\"},\n    \"if\": {\"$ref\": \"#\"},\n    \"then\": {\"$ref\": \"#\"},\n    \"else\": {\"$ref\": \"#\"},\n    \"allOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"anyOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"oneOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"not\": {\"$ref\": \"#\"}\n  },\n  \"default\": true\n}\n"
  },
  {
    "path": "lib/refs/json-schema-secure.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$id\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#\",\n  \"title\": \"Meta-schema for the security assessment of JSON Schemas\",\n  \"description\": \"If a JSON AnySchema fails validation against this meta-schema, it may be unsafe to validate untrusted data\",\n  \"definitions\": {\n    \"schemaArray\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\"$ref\": \"#\"}\n    }\n  },\n  \"dependencies\": {\n    \"patternProperties\": {\n      \"description\": \"prevent slow validation of large property names\",\n      \"required\": [\"propertyNames\"],\n      \"properties\": {\n        \"propertyNames\": {\n          \"required\": [\"maxLength\"]\n        }\n      }\n    },\n    \"uniqueItems\": {\n      \"description\": \"prevent slow validation of large non-scalar arrays\",\n      \"if\": {\n        \"properties\": {\n          \"uniqueItems\": {\"const\": true},\n          \"items\": {\n            \"properties\": {\n              \"type\": {\n                \"anyOf\": [\n                  {\n                    \"enum\": [\"object\", \"array\"]\n                  },\n                  {\n                    \"type\": \"array\",\n                    \"contains\": {\"enum\": [\"object\", \"array\"]}\n                  }\n                ]\n              }\n            }\n          }\n        }\n      },\n      \"then\": {\n        \"required\": [\"maxItems\"]\n      }\n    },\n    \"pattern\": {\n      \"description\": \"prevent slow pattern matching of large strings\",\n      \"required\": [\"maxLength\"]\n    },\n    \"format\": {\n      \"description\": \"prevent slow format validation of large strings\",\n      \"required\": [\"maxLength\"]\n    }\n  },\n  \"properties\": {\n    \"additionalItems\": {\"$ref\": \"#\"},\n    \"additionalProperties\": {\"$ref\": \"#\"},\n    \"dependencies\": {\n      \"additionalProperties\": {\n        \"anyOf\": [{\"type\": \"array\"}, {\"$ref\": \"#\"}]\n      }\n    },\n    \"items\": {\n      \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/schemaArray\"}]\n    },\n    \"definitions\": {\n      \"additionalProperties\": {\"$ref\": \"#\"}\n    },\n    \"patternProperties\": {\n      \"additionalProperties\": {\"$ref\": \"#\"}\n    },\n    \"properties\": {\n      \"additionalProperties\": {\"$ref\": \"#\"}\n    },\n    \"if\": {\"$ref\": \"#\"},\n    \"then\": {\"$ref\": \"#\"},\n    \"else\": {\"$ref\": \"#\"},\n    \"allOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"anyOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"oneOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"not\": {\"$ref\": \"#\"},\n    \"contains\": {\"$ref\": \"#\"},\n    \"propertyNames\": {\"$ref\": \"#\"}\n  }\n}\n"
  },
  {
    "path": "lib/refs/jtd-schema.ts",
    "content": "import {SchemaObject} from \"../types\"\n\ntype MetaSchema = (root: boolean) => SchemaObject\n\nconst shared: MetaSchema = (root) => {\n  const sch: SchemaObject = {\n    nullable: {type: \"boolean\"},\n    metadata: {\n      optionalProperties: {\n        union: {elements: {ref: \"schema\"}},\n      },\n      additionalProperties: true,\n    },\n  }\n  if (root) sch.definitions = {values: {ref: \"schema\"}}\n  return sch\n}\n\nconst emptyForm: MetaSchema = (root) => ({\n  optionalProperties: shared(root),\n})\n\nconst refForm: MetaSchema = (root) => ({\n  properties: {\n    ref: {type: \"string\"},\n  },\n  optionalProperties: shared(root),\n})\n\nconst typeForm: MetaSchema = (root) => ({\n  properties: {\n    type: {\n      enum: [\n        \"boolean\",\n        \"timestamp\",\n        \"string\",\n        \"float32\",\n        \"float64\",\n        \"int8\",\n        \"uint8\",\n        \"int16\",\n        \"uint16\",\n        \"int32\",\n        \"uint32\",\n      ],\n    },\n  },\n  optionalProperties: shared(root),\n})\n\nconst enumForm: MetaSchema = (root) => ({\n  properties: {\n    enum: {elements: {type: \"string\"}},\n  },\n  optionalProperties: shared(root),\n})\n\nconst elementsForm: MetaSchema = (root) => ({\n  properties: {\n    elements: {ref: \"schema\"},\n  },\n  optionalProperties: shared(root),\n})\n\nconst propertiesForm: MetaSchema = (root) => ({\n  properties: {\n    properties: {values: {ref: \"schema\"}},\n  },\n  optionalProperties: {\n    optionalProperties: {values: {ref: \"schema\"}},\n    additionalProperties: {type: \"boolean\"},\n    ...shared(root),\n  },\n})\n\nconst optionalPropertiesForm: MetaSchema = (root) => ({\n  properties: {\n    optionalProperties: {values: {ref: \"schema\"}},\n  },\n  optionalProperties: {\n    additionalProperties: {type: \"boolean\"},\n    ...shared(root),\n  },\n})\n\nconst discriminatorForm: MetaSchema = (root) => ({\n  properties: {\n    discriminator: {type: \"string\"},\n    mapping: {\n      values: {\n        metadata: {\n          union: [propertiesForm(false), optionalPropertiesForm(false)],\n        },\n      },\n    },\n  },\n  optionalProperties: shared(root),\n})\n\nconst valuesForm: MetaSchema = (root) => ({\n  properties: {\n    values: {ref: \"schema\"},\n  },\n  optionalProperties: shared(root),\n})\n\nconst schema: MetaSchema = (root) => ({\n  metadata: {\n    union: [\n      emptyForm,\n      refForm,\n      typeForm,\n      enumForm,\n      elementsForm,\n      propertiesForm,\n      optionalPropertiesForm,\n      discriminatorForm,\n      valuesForm,\n    ].map((s) => s(root)),\n  },\n})\n\nconst jtdMetaSchema: SchemaObject = {\n  definitions: {\n    schema: schema(false),\n  },\n  ...schema(true),\n}\n\nexport default jtdMetaSchema\n"
  },
  {
    "path": "lib/runtime/equal.ts",
    "content": "// https://github.com/ajv-validator/ajv/issues/889\nimport * as equal from \"fast-deep-equal\"\n\ntype Equal = typeof equal & {code: string}\n;(equal as Equal).code = 'require(\"ajv/dist/runtime/equal\").default'\n\nexport default equal as Equal\n"
  },
  {
    "path": "lib/runtime/parseJson.ts",
    "content": "const rxParseJson = /position\\s(\\d+)(?: \\(line \\d+ column \\d+\\))?$/\n\nexport function parseJson(s: string, pos: number): unknown {\n  let endPos: number | undefined\n  parseJson.message = undefined\n  let matches: RegExpExecArray | null\n  if (pos) s = s.slice(pos)\n  try {\n    parseJson.position = pos + s.length\n    return JSON.parse(s)\n  } catch (e) {\n    matches = rxParseJson.exec((e as Error).message)\n    if (!matches) {\n      parseJson.message = \"unexpected end\"\n      return undefined\n    }\n    endPos = +matches[1]\n    const c = s[endPos]\n    s = s.slice(0, endPos)\n    parseJson.position = pos + endPos\n    try {\n      return JSON.parse(s)\n    } catch (e1) {\n      parseJson.message = `unexpected token ${c}`\n      return undefined\n    }\n  }\n}\n\nparseJson.message = undefined as string | undefined\nparseJson.position = 0 as number\nparseJson.code = 'require(\"ajv/dist/runtime/parseJson\").parseJson'\n\nexport function parseJsonNumber(s: string, pos: number, maxDigits?: number): number | undefined {\n  let numStr = \"\"\n  let c: string\n  parseJsonNumber.message = undefined\n  if (s[pos] === \"-\") {\n    numStr += \"-\"\n    pos++\n  }\n  if (s[pos] === \"0\") {\n    numStr += \"0\"\n    pos++\n  } else {\n    if (!parseDigits(maxDigits)) {\n      errorMessage()\n      return undefined\n    }\n  }\n  if (maxDigits) {\n    parseJsonNumber.position = pos\n    return +numStr\n  }\n  if (s[pos] === \".\") {\n    numStr += \".\"\n    pos++\n    if (!parseDigits()) {\n      errorMessage()\n      return undefined\n    }\n  }\n  if (((c = s[pos]), c === \"e\" || c === \"E\")) {\n    numStr += \"e\"\n    pos++\n    if (((c = s[pos]), c === \"+\" || c === \"-\")) {\n      numStr += c\n      pos++\n    }\n    if (!parseDigits()) {\n      errorMessage()\n      return undefined\n    }\n  }\n  parseJsonNumber.position = pos\n  return +numStr\n\n  function parseDigits(maxLen?: number): boolean {\n    let digit = false\n    while (((c = s[pos]), c >= \"0\" && c <= \"9\" && (maxLen === undefined || maxLen-- > 0))) {\n      digit = true\n      numStr += c\n      pos++\n    }\n    return digit\n  }\n\n  function errorMessage(): void {\n    parseJsonNumber.position = pos\n    parseJsonNumber.message = pos < s.length ? `unexpected token ${s[pos]}` : \"unexpected end\"\n  }\n}\n\nparseJsonNumber.message = undefined as string | undefined\nparseJsonNumber.position = 0 as number\nparseJsonNumber.code = 'require(\"ajv/dist/runtime/parseJson\").parseJsonNumber'\n\nconst escapedChars: {[X in string]?: string} = {\n  b: \"\\b\",\n  f: \"\\f\",\n  n: \"\\n\",\n  r: \"\\r\",\n  t: \"\\t\",\n  '\"': '\"',\n  \"/\": \"/\",\n  \"\\\\\": \"\\\\\",\n}\n\nconst CODE_A: number = \"a\".charCodeAt(0)\nconst CODE_0: number = \"0\".charCodeAt(0)\n\nexport function parseJsonString(s: string, pos: number): string | undefined {\n  let str = \"\"\n  let c: string | undefined\n  parseJsonString.message = undefined\n  // eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition\n  while (true) {\n    c = s[pos++]\n    if (c === '\"') break\n    if (c === \"\\\\\") {\n      c = s[pos]\n      if (c in escapedChars) {\n        str += escapedChars[c]\n        pos++\n      } else if (c === \"u\") {\n        pos++\n        let count = 4\n        let code = 0\n        while (count--) {\n          code <<= 4\n          c = s[pos]\n          // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n          if (c === undefined) {\n            errorMessage(\"unexpected end\")\n            return undefined\n          }\n          c = c.toLowerCase()\n          if (c >= \"a\" && c <= \"f\") {\n            code += c.charCodeAt(0) - CODE_A + 10\n          } else if (c >= \"0\" && c <= \"9\") {\n            code += c.charCodeAt(0) - CODE_0\n          } else {\n            errorMessage(`unexpected token ${c}`)\n            return undefined\n          }\n          pos++\n        }\n        str += String.fromCharCode(code)\n      } else {\n        errorMessage(`unexpected token ${c}`)\n        return undefined\n      }\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    } else if (c === undefined) {\n      errorMessage(\"unexpected end\")\n      return undefined\n    } else {\n      if (c.charCodeAt(0) >= 0x20) {\n        str += c\n      } else {\n        errorMessage(`unexpected token ${c}`)\n        return undefined\n      }\n    }\n  }\n  parseJsonString.position = pos\n  return str\n\n  function errorMessage(msg: string): void {\n    parseJsonString.position = pos\n    parseJsonString.message = msg\n  }\n}\n\nparseJsonString.message = undefined as string | undefined\nparseJsonString.position = 0 as number\nparseJsonString.code = 'require(\"ajv/dist/runtime/parseJson\").parseJsonString'\n"
  },
  {
    "path": "lib/runtime/quote.ts",
    "content": "const rxEscapable =\n  // eslint-disable-next-line no-control-regex, no-misleading-character-class\n  /[\\\\\"\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g\n\nconst escaped: {[K in string]?: string} = {\n  \"\\b\": \"\\\\b\",\n  \"\\t\": \"\\\\t\",\n  \"\\n\": \"\\\\n\",\n  \"\\f\": \"\\\\f\",\n  \"\\r\": \"\\\\r\",\n  '\"': '\\\\\"',\n  \"\\\\\": \"\\\\\\\\\",\n}\n\nexport default function quote(s: string): string {\n  rxEscapable.lastIndex = 0\n  return (\n    '\"' +\n    (rxEscapable.test(s)\n      ? s.replace(rxEscapable, (a) => {\n          const c = escaped[a]\n          return typeof c === \"string\"\n            ? c\n            : \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4)\n        })\n      : s) +\n    '\"'\n  )\n}\n\nquote.code = 'require(\"ajv/dist/runtime/quote\").default'\n"
  },
  {
    "path": "lib/runtime/re2.ts",
    "content": "import * as re2 from \"re2\"\n\ntype Re2 = typeof re2 & {code: string}\n;(re2 as Re2).code = 'require(\"ajv/dist/runtime/re2\").default'\n\nexport default re2 as Re2\n"
  },
  {
    "path": "lib/runtime/timestamp.ts",
    "content": "const DT_SEPARATOR = /t|\\s/i\nconst DATE = /^(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)$/\nconst TIME = /^(\\d\\d):(\\d\\d):(\\d\\d)(?:\\.\\d+)?(?:z|([+-]\\d\\d)(?::?(\\d\\d))?)$/i\nconst DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n\nexport default function validTimestamp(str: string, allowDate: boolean): boolean {\n  // http://tools.ietf.org/html/rfc3339#section-5.6\n  const dt: string[] = str.split(DT_SEPARATOR)\n  return (\n    (dt.length === 2 && validDate(dt[0]) && validTime(dt[1])) ||\n    (allowDate && dt.length === 1 && validDate(dt[0]))\n  )\n}\n\nfunction validDate(str: string): boolean {\n  const matches: string[] | null = DATE.exec(str)\n  if (!matches) return false\n  const y: number = +matches[1]\n  const m: number = +matches[2]\n  const d: number = +matches[3]\n  return (\n    m >= 1 &&\n    m <= 12 &&\n    d >= 1 &&\n    (d <= DAYS[m] ||\n      // leap year: https://tools.ietf.org/html/rfc3339#appendix-C\n      (m === 2 && d === 29 && (y % 100 === 0 ? y % 400 === 0 : y % 4 === 0)))\n  )\n}\n\nfunction validTime(str: string): boolean {\n  const matches: string[] | null = TIME.exec(str)\n  if (!matches) return false\n  const hr: number = +matches[1]\n  const min: number = +matches[2]\n  const sec: number = +matches[3]\n  const tzH: number = +(matches[4] || 0)\n  const tzM: number = +(matches[5] || 0)\n  return (\n    (hr <= 23 && min <= 59 && sec <= 59) ||\n    // leap second\n    (hr - tzH === 23 && min - tzM === 59 && sec === 60)\n  )\n}\n\nvalidTimestamp.code = 'require(\"ajv/dist/runtime/timestamp\").default'\n"
  },
  {
    "path": "lib/runtime/ucs2length.ts",
    "content": "// https://mathiasbynens.be/notes/javascript-encoding\n// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\nexport default function ucs2length(str: string): number {\n  const len = str.length\n  let length = 0\n  let pos = 0\n  let value: number\n  while (pos < len) {\n    length++\n    value = str.charCodeAt(pos++)\n    if (value >= 0xd800 && value <= 0xdbff && pos < len) {\n      // high surrogate, and there is a next character\n      value = str.charCodeAt(pos)\n      if ((value & 0xfc00) === 0xdc00) pos++ // low surrogate\n    }\n  }\n  return length\n}\n\nucs2length.code = 'require(\"ajv/dist/runtime/ucs2length\").default'\n"
  },
  {
    "path": "lib/runtime/uri.ts",
    "content": "import * as uri from \"fast-uri\"\n\ntype URI = typeof uri & {code: string}\n;(uri as URI).code = 'require(\"ajv/dist/runtime/uri\").default'\n\nexport default uri as URI\n"
  },
  {
    "path": "lib/runtime/validation_error.ts",
    "content": "import type {ErrorObject} from \"../types\"\n\nexport default class ValidationError extends Error {\n  readonly errors: Partial<ErrorObject>[]\n  readonly ajv: true\n  readonly validation: true\n\n  constructor(errors: Partial<ErrorObject>[]) {\n    super(\"validation failed\")\n    this.errors = errors\n    this.ajv = this.validation = true\n  }\n}\n"
  },
  {
    "path": "lib/standalone/index.ts",
    "content": "import type AjvCore from \"../core\"\nimport type {AnyValidateFunction, SourceCode} from \"../types\"\nimport type {SchemaEnv} from \"../compile\"\nimport {UsedScopeValues, UsedValueState, ValueScopeName, varKinds} from \"../compile/codegen/scope\"\nimport {_, nil, _Code, Code, getProperty, getEsmExportName} from \"../compile/codegen/code\"\n\nfunction standaloneCode(\n  ajv: AjvCore,\n  refsOrFunc?: {[K in string]?: string} | AnyValidateFunction\n): string {\n  if (!ajv.opts.code.source) {\n    throw new Error(\"moduleCode: ajv instance must have code.source option\")\n  }\n  const {_n} = ajv.scope.opts\n  return typeof refsOrFunc == \"function\"\n    ? funcExportCode(refsOrFunc.source)\n    : refsOrFunc !== undefined\n    ? multiExportsCode<string>(refsOrFunc, getValidate)\n    : multiExportsCode<SchemaEnv>(ajv.schemas, (sch) =>\n        sch.meta ? undefined : ajv.compile(sch.schema)\n      )\n\n  function getValidate(id: string): AnyValidateFunction {\n    const v = ajv.getSchema(id)\n    if (!v) throw new Error(`moduleCode: no schema with id ${id}`)\n    return v\n  }\n\n  function funcExportCode(source?: SourceCode): string {\n    const usedValues: UsedScopeValues = {}\n    const n = source?.validateName\n    const vCode = validateCode(usedValues, source)\n    if (ajv.opts.code.esm) {\n      // Always do named export as `validate` rather than the variable `n` which is `validateXX` for known export value\n      return `\"use strict\";${_n}export const validate = ${n};${_n}export default ${n};${_n}${vCode}`\n    }\n    return `\"use strict\";${_n}module.exports = ${n};${_n}module.exports.default = ${n};${_n}${vCode}`\n  }\n\n  function multiExportsCode<T extends SchemaEnv | string>(\n    schemas: {[K in string]?: T},\n    getValidateFunc: (schOrId: T) => AnyValidateFunction | undefined\n  ): string {\n    const usedValues: UsedScopeValues = {}\n    let code = _`\"use strict\";`\n    for (const name in schemas) {\n      const v = getValidateFunc(schemas[name] as T)\n      if (v) {\n        const vCode = validateCode(usedValues, v.source)\n        const exportSyntax = ajv.opts.code.esm\n          ? _`export const ${getEsmExportName(name)}`\n          : _`exports${getProperty(name)}`\n        code = _`${code}${_n}${exportSyntax} = ${v.source?.validateName};${_n}${vCode}`\n      }\n    }\n    return `${code}`\n  }\n\n  function validateCode(usedValues: UsedScopeValues, s?: SourceCode): Code {\n    if (!s) throw new Error('moduleCode: function does not have \"source\" property')\n    if (usedState(s.validateName) === UsedValueState.Completed) return nil\n    setUsedState(s.validateName, UsedValueState.Started)\n\n    const scopeCode = ajv.scope.scopeCode(s.scopeValues, usedValues, refValidateCode)\n    const code = new _Code(`${scopeCode}${_n}${s.validateCode}`)\n    return s.evaluated ? _`${code}${s.validateName}.evaluated = ${s.evaluated};${_n}` : code\n\n    function refValidateCode(n: ValueScopeName): Code | undefined {\n      const vRef = n.value?.ref\n      if (n.prefix === \"validate\" && typeof vRef == \"function\") {\n        const v = vRef as AnyValidateFunction\n        return validateCode(usedValues, v.source)\n      } else if ((n.prefix === \"root\" || n.prefix === \"wrapper\") && typeof vRef == \"object\") {\n        const {validate, validateName} = vRef as SchemaEnv\n        if (!validateName) throw new Error(\"ajv internal error\")\n        const def = ajv.opts.code.es5 ? varKinds.var : varKinds.const\n        const wrapper = _`${def} ${n} = {validate: ${validateName}};`\n        if (usedState(validateName) === UsedValueState.Started) return wrapper\n        const vCode = validateCode(usedValues, validate?.source)\n        return _`${wrapper}${_n}${vCode}`\n      }\n      return undefined\n    }\n\n    function usedState(name: ValueScopeName): UsedValueState | undefined {\n      return usedValues[name.prefix]?.get(name)\n    }\n\n    function setUsedState(name: ValueScopeName, state: UsedValueState): void {\n      const {prefix} = name\n      const names = (usedValues[prefix] = usedValues[prefix] || new Map())\n      names.set(name, state)\n    }\n  }\n}\n\nmodule.exports = exports = standaloneCode\nObject.defineProperty(exports, \"__esModule\", {value: true})\n\nexport default standaloneCode\n"
  },
  {
    "path": "lib/standalone/instance.ts",
    "content": "import Ajv, {AnySchema, AnyValidateFunction, ErrorObject} from \"../core\"\nimport standaloneCode from \".\"\nimport * as requireFromString from \"require-from-string\"\n\nexport default class AjvPack {\n  errors?: ErrorObject[] | null // errors from the last validation\n  constructor(readonly ajv: Ajv) {}\n\n  validate(schemaKeyRef: AnySchema | string, data: unknown): boolean | Promise<unknown> {\n    return Ajv.prototype.validate.call(this, schemaKeyRef, data)\n  }\n\n  compile<T = unknown>(schema: AnySchema, meta?: boolean): AnyValidateFunction<T> {\n    return this.getStandalone(this.ajv.compile<T>(schema, meta))\n  }\n\n  getSchema<T = unknown>(keyRef: string): AnyValidateFunction<T> | undefined {\n    const v = this.ajv.getSchema<T>(keyRef)\n    if (!v) return undefined\n    return this.getStandalone(v)\n  }\n\n  private getStandalone<T = unknown>(v: AnyValidateFunction<T>): AnyValidateFunction<T> {\n    return requireFromString(standaloneCode(this.ajv, v)) as AnyValidateFunction<T>\n  }\n\n  addSchema(...args: Parameters<typeof Ajv.prototype.addSchema>): AjvPack {\n    this.ajv.addSchema.call(this.ajv, ...args)\n    return this\n  }\n\n  addKeyword(...args: Parameters<typeof Ajv.prototype.addKeyword>): AjvPack {\n    this.ajv.addKeyword.call(this.ajv, ...args)\n    return this\n  }\n}\n"
  },
  {
    "path": "lib/types/index.ts",
    "content": "import {URIComponent} from \"fast-uri\"\nimport type {CodeGen, Code, Name, ScopeValueSets, ValueScopeName} from \"../compile/codegen\"\nimport type {SchemaEnv, SchemaCxt, SchemaObjCxt} from \"../compile\"\nimport type {JSONType} from \"../compile/rules\"\nimport type {KeywordCxt} from \"../compile/validate\"\nimport type Ajv from \"../core\"\n\ninterface _SchemaObject {\n  id?: string\n  $id?: string\n  $schema?: string\n  [x: string]: any // TODO\n}\n\nexport interface SchemaObject extends _SchemaObject {\n  id?: string\n  $id?: string\n  $schema?: string\n  $async?: false\n  [x: string]: any // TODO\n}\n\nexport interface AsyncSchema extends _SchemaObject {\n  $async: true\n}\n\nexport type AnySchemaObject = SchemaObject | AsyncSchema\n\nexport type Schema = SchemaObject | boolean\n\nexport type AnySchema = Schema | AsyncSchema\n\nexport type SchemaMap = {[Key in string]?: AnySchema}\n\nexport interface SourceCode {\n  validateName: ValueScopeName\n  validateCode: string\n  scopeValues: ScopeValueSets\n  evaluated?: Code\n}\n\nexport interface DataValidationCxt<T extends string | number = string | number> {\n  instancePath: string\n  parentData: {[K in T]: any} // object or array\n  parentDataProperty: T // string or number\n  rootData: Record<string, any> | any[]\n  dynamicAnchors: {[Ref in string]?: ValidateFunction}\n}\n\nexport interface ValidateFunction<T = unknown> {\n  // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n  (this: Ajv | any, data: any, dataCxt?: DataValidationCxt): data is T\n  errors?: null | ErrorObject[]\n  evaluated?: Evaluated\n  schema: AnySchema\n  schemaEnv: SchemaEnv\n  source?: SourceCode\n}\n\nexport interface JTDParser<T = unknown> {\n  (json: string): T | undefined\n  message?: string\n  position?: number\n}\n\nexport type EvaluatedProperties = {[K in string]?: true} | true\n\nexport type EvaluatedItems = number | true\n\nexport interface Evaluated {\n  // determined at compile time if staticProps/Items is true\n  props?: EvaluatedProperties\n  items?: EvaluatedItems\n  // whether props/items determined at compile time\n  dynamicProps: boolean\n  dynamicItems: boolean\n}\n\nexport interface AsyncValidateFunction<T = unknown> extends ValidateFunction<T> {\n  (...args: Parameters<ValidateFunction<T>>): Promise<T>\n  $async: true\n}\n\nexport type AnyValidateFunction<T = any> = ValidateFunction<T> | AsyncValidateFunction<T>\n\nexport interface ErrorObject<K extends string = string, P = Record<string, any>, S = unknown> {\n  keyword: K\n  instancePath: string\n  schemaPath: string\n  params: P\n  // Added to validation errors of \"propertyNames\" keyword schema\n  propertyName?: string\n  // Excluded if option `messages` set to false.\n  message?: string\n  // These are added with the `verbose` option.\n  schema?: S\n  parentSchema?: AnySchemaObject\n  data?: unknown\n}\n\nexport type ErrorNoParams<K extends string, S = unknown> = ErrorObject<K, Record<string, never>, S>\n\ninterface _KeywordDef {\n  keyword: string | string[]\n  type?: JSONType | JSONType[] // data types that keyword applies to\n  schemaType?: JSONType | JSONType[] // allowed type(s) of keyword value in the schema\n  allowUndefined?: boolean // used for keywords that can be invoked by other keywords, not being present in the schema\n  $data?: boolean // keyword supports [$data reference](../../docs/guide/combining-schemas.md#data-reference)\n  implements?: string[] // other schema keywords that this keyword implements\n  before?: string // keyword should be executed before this keyword (should be applicable to the same type)\n  post?: boolean // keyword should be executed after other keywords without post flag\n  metaSchema?: AnySchemaObject // meta-schema for keyword schema value - it is better to use schemaType where applicable\n  validateSchema?: AnyValidateFunction // compiled keyword metaSchema - should not be passed\n  dependencies?: string[] // keywords that must be present in the same schema\n  error?: KeywordErrorDefinition\n  $dataError?: KeywordErrorDefinition\n}\n\nexport interface CodeKeywordDefinition extends _KeywordDef {\n  code: (cxt: KeywordCxt, ruleType?: string) => void\n  trackErrors?: boolean\n}\n\nexport type MacroKeywordFunc = (\n  schema: any,\n  parentSchema: AnySchemaObject,\n  it: SchemaCxt\n) => AnySchema\n\nexport type CompileKeywordFunc = (\n  schema: any,\n  parentSchema: AnySchemaObject,\n  it: SchemaObjCxt\n) => DataValidateFunction\n\nexport interface DataValidateFunction {\n  (...args: Parameters<ValidateFunction>): boolean | Promise<any>\n  errors?: Partial<ErrorObject>[]\n}\n\nexport interface SchemaValidateFunction {\n  (\n    schema: any,\n    data: any,\n    parentSchema?: AnySchemaObject,\n    dataCxt?: DataValidationCxt\n  ): boolean | Promise<any>\n  errors?: Partial<ErrorObject>[]\n}\n\nexport interface FuncKeywordDefinition extends _KeywordDef {\n  validate?: SchemaValidateFunction | DataValidateFunction\n  compile?: CompileKeywordFunc\n  // schema: false makes validate not to expect schema (DataValidateFunction)\n  schema?: boolean // requires \"validate\"\n  modifying?: boolean\n  async?: boolean\n  valid?: boolean\n  errors?: boolean | \"full\"\n}\n\nexport interface MacroKeywordDefinition extends FuncKeywordDefinition {\n  macro: MacroKeywordFunc\n}\n\nexport type KeywordDefinition =\n  | CodeKeywordDefinition\n  | FuncKeywordDefinition\n  | MacroKeywordDefinition\n\nexport type AddedKeywordDefinition = KeywordDefinition & {\n  type: JSONType[]\n  schemaType: JSONType[]\n}\n\nexport interface KeywordErrorDefinition {\n  message: string | Code | ((cxt: KeywordErrorCxt) => string | Code)\n  params?: Code | ((cxt: KeywordErrorCxt) => Code)\n}\n\nexport type Vocabulary = (KeywordDefinition | string)[]\n\nexport interface KeywordErrorCxt {\n  gen: CodeGen\n  keyword: string\n  data: Name\n  $data?: string | false\n  schema: any // TODO\n  parentSchema?: AnySchemaObject\n  schemaCode: Code | number | boolean\n  schemaValue: Code | number | boolean\n  schemaType?: JSONType[]\n  errsCount?: Name\n  params: KeywordCxtParams\n  it: SchemaCxt\n}\n\nexport type KeywordCxtParams = {[P in string]?: Code | string | number}\n\nexport type FormatValidator<T extends string | number> = (data: T) => boolean\n\nexport type FormatCompare<T extends string | number> = (data1: T, data2: T) => number | undefined\n\nexport type AsyncFormatValidator<T extends string | number> = (data: T) => Promise<boolean>\n\nexport interface FormatDefinition<T extends string | number> {\n  type?: T extends string ? \"string\" | undefined : \"number\"\n  validate: FormatValidator<T> | (T extends string ? string | RegExp : never)\n  async?: false | undefined\n  compare?: FormatCompare<T>\n}\n\nexport interface AsyncFormatDefinition<T extends string | number> {\n  type?: T extends string ? \"string\" | undefined : \"number\"\n  validate: AsyncFormatValidator<T>\n  async: true\n  compare?: FormatCompare<T>\n}\n\nexport type AddedFormat =\n  | true\n  | RegExp\n  | FormatValidator<string>\n  | FormatDefinition<string>\n  | FormatDefinition<number>\n  | AsyncFormatDefinition<string>\n  | AsyncFormatDefinition<number>\n\nexport type Format = AddedFormat | string\n\nexport interface RegExpEngine {\n  (pattern: string, u: string): RegExpLike\n  code: string\n}\n\nexport interface RegExpLike {\n  test: (s: string) => boolean\n}\n\nexport interface UriResolver {\n  parse(uri: string): URIComponent\n  resolve(base: string, path: string): string\n  serialize(component: URIComponent): string\n}\n"
  },
  {
    "path": "lib/types/json-schema.ts",
    "content": "/* eslint-disable @typescript-eslint/no-empty-interface */\ntype StrictNullChecksWrapper<Name extends string, Type> = undefined extends null\n  ? `strictNullChecks must be true in tsconfig to use ${Name}`\n  : Type\n\ntype UnionToIntersection<U> = (U extends any ? (_: U) => void : never) extends (_: infer I) => void\n  ? I\n  : never\n\nexport type SomeJSONSchema = UncheckedJSONSchemaType<Known, true>\n\ntype UncheckedPartialSchema<T> = Partial<UncheckedJSONSchemaType<T, true>>\n\nexport type PartialSchema<T> = StrictNullChecksWrapper<\"PartialSchema\", UncheckedPartialSchema<T>>\n\ntype JSONType<T extends string, IsPartial extends boolean> = IsPartial extends true\n  ? T | undefined\n  : T\n\ninterface NumberKeywords {\n  minimum?: number\n  maximum?: number\n  exclusiveMinimum?: number\n  exclusiveMaximum?: number\n  multipleOf?: number\n  format?: string\n}\n\ninterface StringKeywords {\n  minLength?: number\n  maxLength?: number\n  pattern?: string\n  format?: string\n}\n\ntype UncheckedJSONSchemaType<T, IsPartial extends boolean> = (\n  | // these two unions allow arbitrary unions of types\n  {\n      anyOf: readonly UncheckedJSONSchemaType<T, IsPartial>[]\n    }\n  | {\n      oneOf: readonly UncheckedJSONSchemaType<T, IsPartial>[]\n    }\n  // this union allows for { type: (primitive)[] } style schemas\n  | ({\n      type: readonly (T extends number\n        ? JSONType<\"number\" | \"integer\", IsPartial>\n        : T extends string\n        ? JSONType<\"string\", IsPartial>\n        : T extends boolean\n        ? JSONType<\"boolean\", IsPartial>\n        : never)[]\n    } & UnionToIntersection<\n      T extends number\n        ? NumberKeywords\n        : T extends string\n        ? StringKeywords\n        : T extends boolean\n        ? // eslint-disable-next-line @typescript-eslint/ban-types\n          {}\n        : never\n    >)\n  // this covers \"normal\" types; it's last so typescript looks to it first for errors\n  | ((T extends number\n      ? {\n          type: JSONType<\"number\" | \"integer\", IsPartial>\n        } & NumberKeywords\n      : T extends string\n      ? {\n          type: JSONType<\"string\", IsPartial>\n        } & StringKeywords\n      : T extends boolean\n      ? {\n          type: JSONType<\"boolean\", IsPartial>\n        }\n      : T extends readonly [any, ...any[]]\n      ? {\n          // JSON AnySchema for tuple\n          type: JSONType<\"array\", IsPartial>\n          items: {\n            readonly [K in keyof T]-?: UncheckedJSONSchemaType<T[K], false> & Nullable<T[K]>\n          } & {length: T[\"length\"]}\n          minItems: T[\"length\"]\n        } & ({maxItems: T[\"length\"]} | {additionalItems: false})\n      : T extends readonly any[]\n      ? {\n          type: JSONType<\"array\", IsPartial>\n          items: UncheckedJSONSchemaType<T[0], false>\n          contains?: UncheckedPartialSchema<T[0]>\n          minItems?: number\n          maxItems?: number\n          minContains?: number\n          maxContains?: number\n          uniqueItems?: true\n          additionalItems?: never\n        }\n      : T extends Record<string, any>\n      ? {\n          // JSON AnySchema for records and dictionaries\n          // \"required\" is not optional because it is often forgotten\n          // \"properties\" are optional for more concise dictionary schemas\n          // \"patternProperties\" and can be only used with interfaces that have string index\n          type: JSONType<\"object\", IsPartial>\n          additionalProperties?: boolean | UncheckedJSONSchemaType<T[string], false>\n          unevaluatedProperties?: boolean | UncheckedJSONSchemaType<T[string], false>\n          properties?: IsPartial extends true\n            ? Partial<UncheckedPropertiesSchema<T>>\n            : UncheckedPropertiesSchema<T>\n          patternProperties?: Record<string, UncheckedJSONSchemaType<T[string], false>>\n          propertyNames?: Omit<UncheckedJSONSchemaType<string, false>, \"type\"> & {type?: \"string\"}\n          dependencies?: {[K in keyof T]?: readonly (keyof T)[] | UncheckedPartialSchema<T>}\n          dependentRequired?: {[K in keyof T]?: readonly (keyof T)[]}\n          dependentSchemas?: {[K in keyof T]?: UncheckedPartialSchema<T>}\n          minProperties?: number\n          maxProperties?: number\n        } & (IsPartial extends true // \"required\" is not necessary if it's a non-partial type with no required keys // are listed it only asserts that optional cannot be listed. // \"required\" type does not guarantee that all required properties\n          ? {required: readonly (keyof T)[]}\n          : [UncheckedRequiredMembers<T>] extends [never]\n          ? {required?: readonly UncheckedRequiredMembers<T>[]}\n          : {required: readonly UncheckedRequiredMembers<T>[]})\n      : T extends null\n      ? {\n          type: JSONType<\"null\", IsPartial>\n          nullable: true\n        }\n      : never) & {\n      allOf?: readonly UncheckedPartialSchema<T>[]\n      anyOf?: readonly UncheckedPartialSchema<T>[]\n      oneOf?: readonly UncheckedPartialSchema<T>[]\n      if?: UncheckedPartialSchema<T>\n      then?: UncheckedPartialSchema<T>\n      else?: UncheckedPartialSchema<T>\n      not?: UncheckedPartialSchema<T>\n    })\n) & {\n  [keyword: string]: any\n  $id?: string\n  $ref?: string\n  $defs?: Record<string, UncheckedJSONSchemaType<Known, true>>\n  definitions?: Record<string, UncheckedJSONSchemaType<Known, true>>\n}\n\nexport type JSONSchemaType<T> = StrictNullChecksWrapper<\n  \"JSONSchemaType\",\n  UncheckedJSONSchemaType<T, false>\n>\n\ntype Known =\n  | {[key: string]: Known}\n  | [Known, ...Known[]]\n  | Known[]\n  | number\n  | string\n  | boolean\n  | null\n\ntype UncheckedPropertiesSchema<T> = {\n  [K in keyof T]-?: (UncheckedJSONSchemaType<T[K], false> & Nullable<T[K]>) | {$ref: string}\n}\n\nexport type PropertiesSchema<T> = StrictNullChecksWrapper<\n  \"PropertiesSchema\",\n  UncheckedPropertiesSchema<T>\n>\n\ntype UncheckedRequiredMembers<T> = {\n  [K in keyof T]-?: undefined extends T[K] ? never : K\n}[keyof T]\n\nexport type RequiredMembers<T> = StrictNullChecksWrapper<\n  \"RequiredMembers\",\n  UncheckedRequiredMembers<T>\n>\n\ntype Nullable<T> = undefined extends T\n  ? {\n      nullable: true\n      const?: null // any non-null value would fail `const: null`, `null` would fail any other value in const\n      enum?: readonly (T | null)[] // `null` must be explicitly included in \"enum\" for `null` to pass\n      default?: T | null\n    }\n  : {\n      nullable?: false\n      const?: T\n      enum?: readonly T[]\n      default?: T\n    }\n"
  },
  {
    "path": "lib/types/jtd-schema.ts",
    "content": "/** numeric strings */\ntype NumberType = \"float32\" | \"float64\" | \"int8\" | \"uint8\" | \"int16\" | \"uint16\" | \"int32\" | \"uint32\"\n\n/** string strings */\ntype StringType = \"string\" | \"timestamp\"\n\n/** Generic JTD Schema without inference of the represented type */\nexport type SomeJTDSchemaType = (\n  | // ref\n  {ref: string}\n  // primitives\n  | {type: NumberType | StringType | \"boolean\"}\n  // enum\n  | {enum: string[]}\n  // elements\n  | {elements: SomeJTDSchemaType}\n  // values\n  | {values: SomeJTDSchemaType}\n  // properties\n  | {\n      properties: Record<string, SomeJTDSchemaType>\n      optionalProperties?: Record<string, SomeJTDSchemaType>\n      additionalProperties?: boolean\n    }\n  | {\n      properties?: Record<string, SomeJTDSchemaType>\n      optionalProperties: Record<string, SomeJTDSchemaType>\n      additionalProperties?: boolean\n    }\n  // discriminator\n  | {discriminator: string; mapping: Record<string, SomeJTDSchemaType>}\n  // empty\n  // NOTE see the end of\n  // https://github.com/typescript-eslint/typescript-eslint/issues/2063#issuecomment-675156492\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  | {}\n) & {\n  nullable?: boolean\n  metadata?: Record<string, unknown>\n  definitions?: Record<string, SomeJTDSchemaType>\n}\n\n/** required keys of an object, not undefined */\ntype RequiredKeys<T> = {\n  [K in keyof T]-?: undefined extends T[K] ? never : K\n}[keyof T]\n\n/** optional or undifined-able keys of an object */\ntype OptionalKeys<T> = {\n  [K in keyof T]-?: undefined extends T[K] ? K : never\n}[keyof T]\n\n/** type is true if T is a union type */\ntype IsUnion_<T, U extends T = T> = false extends (\n  T extends unknown ? ([U] extends [T] ? false : true) : never\n)\n  ? false\n  : true\ntype IsUnion<T> = IsUnion_<T>\n\n/** type is true if T is identically E */\ntype TypeEquality<T, E> = [T] extends [E] ? ([E] extends [T] ? true : false) : false\n\n/** type is true if T or null is identically E or null*/\ntype NullTypeEquality<T, E> = TypeEquality<T | null, E | null>\n\n/** gets only the string literals of a type or null if a type isn't a string literal */\ntype EnumString<T> = [T] extends [never]\n  ? null\n  : T extends string\n  ? string extends T\n    ? null\n    : T\n  : null\n\n/** true if type is a union of string literals */\ntype IsEnum<T> = null extends EnumString<T> ? false : true\n\n/** true only if all types are array types (not tuples) */\n// NOTE relies on the fact that tuples don't have an index at 0.5, but arrays\n// have an index at every number\ntype IsElements<T> = false extends IsUnion<T>\n  ? [T] extends [readonly unknown[]]\n    ? undefined extends T[0.5]\n      ? false\n      : true\n    : false\n  : false\n\n/** true if the the type is a values type */\ntype IsValues<T> = false extends IsUnion<T> ? TypeEquality<keyof T, string> : false\n\n/** true if type is a properties type and Union is false, or type is a discriminator type and Union is true */\ntype IsRecord<T, Union extends boolean> = Union extends IsUnion<T>\n  ? null extends EnumString<keyof T>\n    ? false\n    : true\n  : false\n\n/** true if type represents an empty record */\ntype IsEmptyRecord<T> = [T] extends [Record<string, never>]\n  ? [T] extends [never]\n    ? false\n    : true\n  : false\n\n/** actual schema */\nexport type JTDSchemaType<T, D extends Record<string, unknown> = Record<string, never>> = (\n  | // refs - where null wasn't specified, must match exactly\n  (null extends EnumString<keyof D>\n      ? never\n      :\n          | ({[K in keyof D]: [T] extends [D[K]] ? {ref: K} : never}[keyof D] & {nullable?: false})\n          // nulled refs - if ref is nullable and nullable is specified, then it can\n          // match either null or non-null definitions\n          | (null extends T\n              ? {\n                  [K in keyof D]: [Exclude<T, null>] extends [Exclude<D[K], null>]\n                    ? {ref: K}\n                    : never\n                }[keyof D] & {nullable: true}\n              : never))\n  // empty - empty schemas also treat nullable differently in that it's now fully ignored\n  | (unknown extends T ? {nullable?: boolean} : never)\n  // all other types // numbers - only accepts the type number\n  | ((true extends NullTypeEquality<T, number>\n      ? {type: NumberType}\n      : // booleans - accepts the type boolean\n      true extends NullTypeEquality<T, boolean>\n      ? {type: \"boolean\"}\n      : // strings - only accepts the type string\n      true extends NullTypeEquality<T, string>\n      ? {type: StringType}\n      : // strings - only accepts the type Date\n      true extends NullTypeEquality<T, Date>\n      ? {type: \"timestamp\"}\n      : // enums - only accepts union of string literals\n      // TODO we can't actually check that everything in the union was specified\n      true extends IsEnum<Exclude<T, null>>\n      ? {enum: EnumString<Exclude<T, null>>[]}\n      : // arrays - only accepts arrays, could be array of unions to be resolved later\n      true extends IsElements<Exclude<T, null>>\n      ? T extends readonly (infer E)[]\n        ? {\n            elements: JTDSchemaType<E, D>\n          }\n        : never\n      : // empty properties\n      true extends IsEmptyRecord<Exclude<T, null>>\n      ?\n          | {properties: Record<string, never>; optionalProperties?: Record<string, never>}\n          | {optionalProperties: Record<string, never>}\n      : // values\n      true extends IsValues<Exclude<T, null>>\n      ? T extends Record<string, infer V>\n        ? {\n            values: JTDSchemaType<V, D>\n          }\n        : never\n      : // properties\n      true extends IsRecord<Exclude<T, null>, false>\n      ? ([RequiredKeys<Exclude<T, null>>] extends [never]\n          ? {\n              properties?: Record<string, never>\n            }\n          : {\n              properties: {[K in RequiredKeys<T>]: JTDSchemaType<T[K], D>}\n            }) &\n          ([OptionalKeys<Exclude<T, null>>] extends [never]\n            ? {\n                optionalProperties?: Record<string, never>\n              }\n            : {\n                optionalProperties: {\n                  [K in OptionalKeys<T>]: JTDSchemaType<Exclude<T[K], undefined>, D>\n                }\n              }) & {\n            additionalProperties?: boolean\n          }\n      : // discriminator\n      true extends IsRecord<Exclude<T, null>, true>\n      ? {\n          [K in keyof Exclude<T, null>]-?: Exclude<T, null>[K] extends string\n            ? {\n                discriminator: K\n                mapping: {\n                  // TODO currently allows descriminator to be present in schema\n                  [M in Exclude<T, null>[K]]: JTDSchemaType<\n                    Omit<T extends Record<K, M> ? T : never, K>,\n                    D\n                  >\n                }\n              }\n            : never\n        }[keyof Exclude<T, null>]\n      : never) &\n      (null extends T\n        ? {\n            nullable: true\n          }\n        : {nullable?: false}))\n) & {\n  // extra properties\n  metadata?: Record<string, unknown>\n  // TODO these should only be allowed at the top level\n  definitions?: {[K in keyof D]: JTDSchemaType<D[K], D>}\n}\n\ntype JTDDataDef<S, D extends Record<string, unknown>> =\n  | // ref\n  (S extends {ref: string}\n      ? D extends {[K in S[\"ref\"]]: infer V}\n        ? JTDDataDef<V, D>\n        : never\n      : // type\n      S extends {type: NumberType}\n      ? number\n      : S extends {type: \"boolean\"}\n      ? boolean\n      : S extends {type: \"string\"}\n      ? string\n      : S extends {type: \"timestamp\"}\n      ? string | Date\n      : // enum\n      S extends {enum: readonly (infer E)[]}\n      ? string extends E\n        ? never\n        : [E] extends [string]\n        ? E\n        : never\n      : // elements\n      S extends {elements: infer E}\n      ? JTDDataDef<E, D>[]\n      : // properties\n      S extends {\n          properties: Record<string, unknown>\n          optionalProperties?: Record<string, unknown>\n          additionalProperties?: boolean\n        }\n      ? {-readonly [K in keyof S[\"properties\"]]-?: JTDDataDef<S[\"properties\"][K], D>} & {\n          -readonly [K in keyof S[\"optionalProperties\"]]+?: JTDDataDef<\n            S[\"optionalProperties\"][K],\n            D\n          >\n        } & ([S[\"additionalProperties\"]] extends [true] ? Record<string, unknown> : unknown)\n      : S extends {\n          properties?: Record<string, unknown>\n          optionalProperties: Record<string, unknown>\n          additionalProperties?: boolean\n        }\n      ? {-readonly [K in keyof S[\"properties\"]]-?: JTDDataDef<S[\"properties\"][K], D>} & {\n          -readonly [K in keyof S[\"optionalProperties\"]]+?: JTDDataDef<\n            S[\"optionalProperties\"][K],\n            D\n          >\n        } & ([S[\"additionalProperties\"]] extends [true] ? Record<string, unknown> : unknown)\n      : // values\n      S extends {values: infer V}\n      ? Record<string, JTDDataDef<V, D>>\n      : // discriminator\n      S extends {discriminator: infer M; mapping: Record<string, unknown>}\n      ? [M] extends [string]\n        ? {\n            [K in keyof S[\"mapping\"]]: JTDDataDef<S[\"mapping\"][K], D> & {[KM in M]: K}\n          }[keyof S[\"mapping\"]]\n        : never\n      : // empty\n        unknown)\n  | (S extends {nullable: true} ? null : never)\n\nexport type JTDDataType<S> = S extends {definitions: Record<string, unknown>}\n  ? JTDDataDef<S, S[\"definitions\"]>\n  : JTDDataDef<S, Record<string, never>>\n"
  },
  {
    "path": "lib/vocabularies/applicator/additionalItems.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, not, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode, Type} from \"../../compile/util\"\n\nexport type AdditionalItemsError = ErrorObject<\"additionalItems\", {limit: number}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params: {len}}) => str`must NOT have more than ${len} items`,\n  params: ({params: {len}}) => _`{limit: ${len}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"additionalItems\" as const,\n  type: \"array\",\n  schemaType: [\"boolean\", \"object\"],\n  before: \"uniqueItems\",\n  error,\n  code(cxt: KeywordCxt) {\n    const {parentSchema, it} = cxt\n    const {items} = parentSchema\n    if (!Array.isArray(items)) {\n      checkStrictMode(it, '\"additionalItems\" is ignored when \"items\" is not an array of schemas')\n      return\n    }\n    validateAdditionalItems(cxt, items)\n  },\n}\n\nexport function validateAdditionalItems(cxt: KeywordCxt, items: AnySchema[]): void {\n  const {gen, schema, data, keyword, it} = cxt\n  it.items = true\n  const len = gen.const(\"len\", _`${data}.length`)\n  if (schema === false) {\n    cxt.setParams({len: items.length})\n    cxt.pass(_`${len} <= ${items.length}`)\n  } else if (typeof schema == \"object\" && !alwaysValidSchema(it, schema)) {\n    const valid = gen.var(\"valid\", _`${len} <= ${items.length}`) // TODO var\n    gen.if(not(valid), () => validateItems(valid))\n    cxt.ok(valid)\n  }\n\n  function validateItems(valid: Name): void {\n    gen.forRange(\"i\", items.length, len, (i) => {\n      cxt.subschema({keyword, dataProp: i, dataPropType: Type.Num}, valid)\n      if (!it.allErrors) gen.if(not(valid), () => gen.break())\n    })\n  }\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/additionalProperties.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  AddedKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  AnySchema,\n} from \"../../types\"\nimport {allSchemaProperties, usePattern, isOwnProperty} from \"../code\"\nimport {_, nil, or, not, Code, Name} from \"../../compile/codegen\"\nimport N from \"../../compile/names\"\nimport type {SubschemaArgs} from \"../../compile/validate/subschema\"\nimport {alwaysValidSchema, schemaRefOrVal, Type} from \"../../compile/util\"\n\nexport type AdditionalPropertiesError = ErrorObject<\n  \"additionalProperties\",\n  {additionalProperty: string},\n  AnySchema\n>\n\nconst error: KeywordErrorDefinition = {\n  message: \"must NOT have additional properties\",\n  params: ({params}) => _`{additionalProperty: ${params.additionalProperty}}`,\n}\n\nconst def: CodeKeywordDefinition & AddedKeywordDefinition = {\n  keyword: \"additionalProperties\",\n  type: [\"object\"],\n  schemaType: [\"boolean\", \"object\"],\n  allowUndefined: true,\n  trackErrors: true,\n  error,\n  code(cxt) {\n    const {gen, schema, parentSchema, data, errsCount, it} = cxt\n    /* istanbul ignore if */\n    if (!errsCount) throw new Error(\"ajv implementation error\")\n    const {allErrors, opts} = it\n    it.props = true\n    if (opts.removeAdditional !== \"all\" && alwaysValidSchema(it, schema)) return\n    const props = allSchemaProperties(parentSchema.properties)\n    const patProps = allSchemaProperties(parentSchema.patternProperties)\n    checkAdditionalProperties()\n    cxt.ok(_`${errsCount} === ${N.errors}`)\n\n    function checkAdditionalProperties(): void {\n      gen.forIn(\"key\", data, (key: Name) => {\n        if (!props.length && !patProps.length) additionalPropertyCode(key)\n        else gen.if(isAdditional(key), () => additionalPropertyCode(key))\n      })\n    }\n\n    function isAdditional(key: Name): Code {\n      let definedProp: Code\n      if (props.length > 8) {\n        // TODO maybe an option instead of hard-coded 8?\n        const propsSchema = schemaRefOrVal(it, parentSchema.properties, \"properties\")\n        definedProp = isOwnProperty(gen, propsSchema as Code, key)\n      } else if (props.length) {\n        definedProp = or(...props.map((p) => _`${key} === ${p}`))\n      } else {\n        definedProp = nil\n      }\n      if (patProps.length) {\n        definedProp = or(definedProp, ...patProps.map((p) => _`${usePattern(cxt, p)}.test(${key})`))\n      }\n      return not(definedProp)\n    }\n\n    function deleteAdditional(key: Name): void {\n      gen.code(_`delete ${data}[${key}]`)\n    }\n\n    function additionalPropertyCode(key: Name): void {\n      if (opts.removeAdditional === \"all\" || (opts.removeAdditional && schema === false)) {\n        deleteAdditional(key)\n        return\n      }\n\n      if (schema === false) {\n        cxt.setParams({additionalProperty: key})\n        cxt.error()\n        if (!allErrors) gen.break()\n        return\n      }\n\n      if (typeof schema == \"object\" && !alwaysValidSchema(it, schema)) {\n        const valid = gen.name(\"valid\")\n        if (opts.removeAdditional === \"failing\") {\n          applyAdditionalSchema(key, valid, false)\n          gen.if(not(valid), () => {\n            cxt.reset()\n            deleteAdditional(key)\n          })\n        } else {\n          applyAdditionalSchema(key, valid)\n          if (!allErrors) gen.if(not(valid), () => gen.break())\n        }\n      }\n    }\n\n    function applyAdditionalSchema(key: Name, valid: Name, errors?: false): void {\n      const subschema: SubschemaArgs = {\n        keyword: \"additionalProperties\",\n        dataProp: key,\n        dataPropType: Type.Str,\n      }\n      if (errors === false) {\n        Object.assign(subschema, {\n          compositeRule: true,\n          createErrors: false,\n          allErrors: false,\n        })\n      }\n      cxt.subschema(subschema, valid)\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/allOf.ts",
    "content": "import type {CodeKeywordDefinition, AnySchema} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {alwaysValidSchema} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"allOf\",\n  schemaType: \"array\",\n  code(cxt: KeywordCxt) {\n    const {gen, schema, it} = cxt\n    /* istanbul ignore if */\n    if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n    const valid = gen.name(\"valid\")\n    schema.forEach((sch: AnySchema, i: number) => {\n      if (alwaysValidSchema(it, sch)) return\n      const schCxt = cxt.subschema({keyword: \"allOf\", schemaProp: i}, valid)\n      cxt.ok(valid)\n      cxt.mergeEvaluated(schCxt)\n    })\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/anyOf.ts",
    "content": "import type {CodeKeywordDefinition, ErrorNoParams, AnySchema} from \"../../types\"\nimport {validateUnion} from \"../code\"\n\nexport type AnyOfError = ErrorNoParams<\"anyOf\", AnySchema[]>\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"anyOf\",\n  schemaType: \"array\",\n  trackErrors: true,\n  code: validateUnion,\n  error: {message: \"must match a schema in anyOf\"},\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/contains.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  KeywordErrorDefinition,\n  ErrorObject,\n  AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode, Type} from \"../../compile/util\"\n\nexport type ContainsError = ErrorObject<\n  \"contains\",\n  {minContains: number; maxContains?: number},\n  AnySchema\n>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params: {min, max}}) =>\n    max === undefined\n      ? str`must contain at least ${min} valid item(s)`\n      : str`must contain at least ${min} and no more than ${max} valid item(s)`,\n  params: ({params: {min, max}}) =>\n    max === undefined ? _`{minContains: ${min}}` : _`{minContains: ${min}, maxContains: ${max}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"contains\",\n  type: \"array\",\n  schemaType: [\"object\", \"boolean\"],\n  before: \"uniqueItems\",\n  trackErrors: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, schema, parentSchema, data, it} = cxt\n    let min: number\n    let max: number | undefined\n    const {minContains, maxContains} = parentSchema\n    if (it.opts.next) {\n      min = minContains === undefined ? 1 : minContains\n      max = maxContains\n    } else {\n      min = 1\n    }\n    const len = gen.const(\"len\", _`${data}.length`)\n    cxt.setParams({min, max})\n    if (max === undefined && min === 0) {\n      checkStrictMode(it, `\"minContains\" == 0 without \"maxContains\": \"contains\" keyword ignored`)\n      return\n    }\n    if (max !== undefined && min > max) {\n      checkStrictMode(it, `\"minContains\" > \"maxContains\" is always invalid`)\n      cxt.fail()\n      return\n    }\n    if (alwaysValidSchema(it, schema)) {\n      let cond = _`${len} >= ${min}`\n      if (max !== undefined) cond = _`${cond} && ${len} <= ${max}`\n      cxt.pass(cond)\n      return\n    }\n\n    it.items = true\n    const valid = gen.name(\"valid\")\n    if (max === undefined && min === 1) {\n      validateItems(valid, () => gen.if(valid, () => gen.break()))\n    } else if (min === 0) {\n      gen.let(valid, true)\n      if (max !== undefined) gen.if(_`${data}.length > 0`, validateItemsWithCount)\n    } else {\n      gen.let(valid, false)\n      validateItemsWithCount()\n    }\n    cxt.result(valid, () => cxt.reset())\n\n    function validateItemsWithCount(): void {\n      const schValid = gen.name(\"_valid\")\n      const count = gen.let(\"count\", 0)\n      validateItems(schValid, () => gen.if(schValid, () => checkLimits(count)))\n    }\n\n    function validateItems(_valid: Name, block: () => void): void {\n      gen.forRange(\"i\", 0, len, (i) => {\n        cxt.subschema(\n          {\n            keyword: \"contains\",\n            dataProp: i,\n            dataPropType: Type.Num,\n            compositeRule: true,\n          },\n          _valid\n        )\n        block()\n      })\n    }\n\n    function checkLimits(count: Name): void {\n      gen.code(_`${count}++`)\n      if (max === undefined) {\n        gen.if(_`${count} >= ${min}`, () => gen.assign(valid, true).break())\n      } else {\n        gen.if(_`${count} > ${max}`, () => gen.assign(valid, false).break())\n        if (min === 1) gen.assign(valid, true)\n        else gen.if(_`${count} >= ${min}`, () => gen.assign(valid, true))\n      }\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/dependencies.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  SchemaMap,\n  AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\nimport {checkReportMissingProp, checkMissingProp, reportMissingProp, propertyInData} from \"../code\"\n\nexport type PropertyDependencies = {[K in string]?: string[]}\n\nexport interface DependenciesErrorParams {\n  property: string\n  missingProperty: string\n  depsCount: number\n  deps: string // TODO change to string[]\n}\n\ntype SchemaDependencies = SchemaMap\n\nexport type DependenciesError = ErrorObject<\n  \"dependencies\",\n  DependenciesErrorParams,\n  {[K in string]?: string[] | AnySchema}\n>\n\nexport const error: KeywordErrorDefinition = {\n  message: ({params: {property, depsCount, deps}}) => {\n    const property_ies = depsCount === 1 ? \"property\" : \"properties\"\n    return str`must have ${property_ies} ${deps} when property ${property} is present`\n  },\n  params: ({params: {property, depsCount, deps, missingProperty}}) =>\n    _`{property: ${property},\n    missingProperty: ${missingProperty},\n    depsCount: ${depsCount},\n    deps: ${deps}}`, // TODO change to reference\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"dependencies\",\n  type: \"object\",\n  schemaType: \"object\",\n  error,\n  code(cxt: KeywordCxt) {\n    const [propDeps, schDeps] = splitDependencies(cxt)\n    validatePropertyDeps(cxt, propDeps)\n    validateSchemaDeps(cxt, schDeps)\n  },\n}\n\nfunction splitDependencies({schema}: KeywordCxt): [PropertyDependencies, SchemaDependencies] {\n  const propertyDeps: PropertyDependencies = {}\n  const schemaDeps: SchemaDependencies = {}\n  for (const key in schema) {\n    if (key === \"__proto__\") continue\n    const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps\n    deps[key] = schema[key]\n  }\n  return [propertyDeps, schemaDeps]\n}\n\nexport function validatePropertyDeps(\n  cxt: KeywordCxt,\n  propertyDeps: {[K in string]?: string[]} = cxt.schema\n): void {\n  const {gen, data, it} = cxt\n  if (Object.keys(propertyDeps).length === 0) return\n  const missing = gen.let(\"missing\")\n  for (const prop in propertyDeps) {\n    const deps = propertyDeps[prop] as string[]\n    if (deps.length === 0) continue\n    const hasProperty = propertyInData(gen, data, prop, it.opts.ownProperties)\n    cxt.setParams({\n      property: prop,\n      depsCount: deps.length,\n      deps: deps.join(\", \"),\n    })\n    if (it.allErrors) {\n      gen.if(hasProperty, () => {\n        for (const depProp of deps) {\n          checkReportMissingProp(cxt, depProp)\n        }\n      })\n    } else {\n      gen.if(_`${hasProperty} && (${checkMissingProp(cxt, deps, missing)})`)\n      reportMissingProp(cxt, missing)\n      gen.else()\n    }\n  }\n}\n\nexport function validateSchemaDeps(cxt: KeywordCxt, schemaDeps: SchemaMap = cxt.schema): void {\n  const {gen, data, keyword, it} = cxt\n  const valid = gen.name(\"valid\")\n  for (const prop in schemaDeps) {\n    if (alwaysValidSchema(it, schemaDeps[prop] as AnySchema)) continue\n    gen.if(\n      propertyInData(gen, data, prop, it.opts.ownProperties),\n      () => {\n        const schCxt = cxt.subschema({keyword, schemaProp: prop}, valid)\n        cxt.mergeValidEvaluated(schCxt, valid)\n      },\n      () => gen.var(valid, true) // TODO var\n    )\n    cxt.ok(valid)\n  }\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/dependentSchemas.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport {validateSchemaDeps} from \"./dependencies\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"dependentSchemas\",\n  type: \"object\",\n  schemaType: \"object\",\n  code: (cxt) => validateSchemaDeps(cxt),\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/if.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  AnySchema,\n} from \"../../types\"\nimport type {SchemaObjCxt} from \"../../compile\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, not, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode} from \"../../compile/util\"\n\nexport type IfKeywordError = ErrorObject<\"if\", {failingKeyword: string}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params}) => str`must match \"${params.ifClause}\" schema`,\n  params: ({params}) => _`{failingKeyword: ${params.ifClause}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"if\",\n  schemaType: [\"object\", \"boolean\"],\n  trackErrors: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, parentSchema, it} = cxt\n    if (parentSchema.then === undefined && parentSchema.else === undefined) {\n      checkStrictMode(it, '\"if\" without \"then\" and \"else\" is ignored')\n    }\n    const hasThen = hasSchema(it, \"then\")\n    const hasElse = hasSchema(it, \"else\")\n    if (!hasThen && !hasElse) return\n\n    const valid = gen.let(\"valid\", true)\n    const schValid = gen.name(\"_valid\")\n    validateIf()\n    cxt.reset()\n\n    if (hasThen && hasElse) {\n      const ifClause = gen.let(\"ifClause\")\n      cxt.setParams({ifClause})\n      gen.if(schValid, validateClause(\"then\", ifClause), validateClause(\"else\", ifClause))\n    } else if (hasThen) {\n      gen.if(schValid, validateClause(\"then\"))\n    } else {\n      gen.if(not(schValid), validateClause(\"else\"))\n    }\n\n    cxt.pass(valid, () => cxt.error(true))\n\n    function validateIf(): void {\n      const schCxt = cxt.subschema(\n        {\n          keyword: \"if\",\n          compositeRule: true,\n          createErrors: false,\n          allErrors: false,\n        },\n        schValid\n      )\n      cxt.mergeEvaluated(schCxt)\n    }\n\n    function validateClause(keyword: string, ifClause?: Name): () => void {\n      return () => {\n        const schCxt = cxt.subschema({keyword}, schValid)\n        gen.assign(valid, schValid)\n        cxt.mergeValidEvaluated(schCxt, valid)\n        if (ifClause) gen.assign(ifClause, _`${keyword}`)\n        else cxt.setParams({ifClause: keyword})\n      }\n    }\n  },\n}\n\nfunction hasSchema(it: SchemaObjCxt, keyword: string): boolean {\n  const schema = it.schema[keyword]\n  return schema !== undefined && !alwaysValidSchema(it, schema)\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/index.ts",
    "content": "import type {ErrorNoParams, Vocabulary} from \"../../types\"\nimport additionalItems, {AdditionalItemsError} from \"./additionalItems\"\nimport prefixItems from \"./prefixItems\"\nimport items from \"./items\"\nimport items2020, {ItemsError} from \"./items2020\"\nimport contains, {ContainsError} from \"./contains\"\nimport dependencies, {DependenciesError} from \"./dependencies\"\nimport propertyNames, {PropertyNamesError} from \"./propertyNames\"\nimport additionalProperties, {AdditionalPropertiesError} from \"./additionalProperties\"\nimport properties from \"./properties\"\nimport patternProperties from \"./patternProperties\"\nimport notKeyword, {NotKeywordError} from \"./not\"\nimport anyOf, {AnyOfError} from \"./anyOf\"\nimport oneOf, {OneOfError} from \"./oneOf\"\nimport allOf from \"./allOf\"\nimport ifKeyword, {IfKeywordError} from \"./if\"\nimport thenElse from \"./thenElse\"\n\nexport default function getApplicator(draft2020 = false): Vocabulary {\n  const applicator = [\n    // any\n    notKeyword,\n    anyOf,\n    oneOf,\n    allOf,\n    ifKeyword,\n    thenElse,\n    // object\n    propertyNames,\n    additionalProperties,\n    dependencies,\n    properties,\n    patternProperties,\n  ]\n  // array\n  if (draft2020) applicator.push(prefixItems, items2020)\n  else applicator.push(additionalItems, items)\n  applicator.push(contains)\n  return applicator\n}\n\nexport type ApplicatorKeywordError =\n  | ErrorNoParams<\"false schema\">\n  | AdditionalItemsError\n  | ItemsError\n  | ContainsError\n  | AdditionalPropertiesError\n  | DependenciesError\n  | IfKeywordError\n  | AnyOfError\n  | OneOfError\n  | NotKeywordError\n  | PropertyNamesError\n"
  },
  {
    "path": "lib/vocabularies/applicator/items.ts",
    "content": "import type {CodeKeywordDefinition, AnySchema, AnySchemaObject} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_} from \"../../compile/codegen\"\nimport {alwaysValidSchema, mergeEvaluated, checkStrictMode} from \"../../compile/util\"\nimport {validateArray} from \"../code\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"items\",\n  type: \"array\",\n  schemaType: [\"object\", \"array\", \"boolean\"],\n  before: \"uniqueItems\",\n  code(cxt: KeywordCxt) {\n    const {schema, it} = cxt\n    if (Array.isArray(schema)) return validateTuple(cxt, \"additionalItems\", schema)\n    it.items = true\n    if (alwaysValidSchema(it, schema)) return\n    cxt.ok(validateArray(cxt))\n  },\n}\n\nexport function validateTuple(\n  cxt: KeywordCxt,\n  extraItems: string,\n  schArr: AnySchema[] = cxt.schema\n): void {\n  const {gen, parentSchema, data, keyword, it} = cxt\n  checkStrictTuple(parentSchema)\n  if (it.opts.unevaluated && schArr.length && it.items !== true) {\n    it.items = mergeEvaluated.items(gen, schArr.length, it.items)\n  }\n  const valid = gen.name(\"valid\")\n  const len = gen.const(\"len\", _`${data}.length`)\n  schArr.forEach((sch: AnySchema, i: number) => {\n    if (alwaysValidSchema(it, sch)) return\n    gen.if(_`${len} > ${i}`, () =>\n      cxt.subschema(\n        {\n          keyword,\n          schemaProp: i,\n          dataProp: i,\n        },\n        valid\n      )\n    )\n    cxt.ok(valid)\n  })\n\n  function checkStrictTuple(sch: AnySchemaObject): void {\n    const {opts, errSchemaPath} = it\n    const l = schArr.length\n    const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false)\n    if (opts.strictTuples && !fullTuple) {\n      const msg = `\"${keyword}\" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path \"${errSchemaPath}\"`\n      checkStrictMode(it, msg, opts.strictTuples)\n    }\n  }\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/items2020.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  KeywordErrorDefinition,\n  ErrorObject,\n  AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\nimport {validateArray} from \"../code\"\nimport {validateAdditionalItems} from \"./additionalItems\"\n\nexport type ItemsError = ErrorObject<\"items\", {limit: number}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params: {len}}) => str`must NOT have more than ${len} items`,\n  params: ({params: {len}}) => _`{limit: ${len}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"items\",\n  type: \"array\",\n  schemaType: [\"object\", \"boolean\"],\n  before: \"uniqueItems\",\n  error,\n  code(cxt: KeywordCxt) {\n    const {schema, parentSchema, it} = cxt\n    const {prefixItems} = parentSchema\n    it.items = true\n    if (alwaysValidSchema(it, schema)) return\n    if (prefixItems) validateAdditionalItems(cxt, prefixItems)\n    else cxt.ok(validateArray(cxt))\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/not.ts",
    "content": "import type {CodeKeywordDefinition, ErrorNoParams, AnySchema} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {alwaysValidSchema} from \"../../compile/util\"\n\nexport type NotKeywordError = ErrorNoParams<\"not\", AnySchema>\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"not\",\n  schemaType: [\"object\", \"boolean\"],\n  trackErrors: true,\n  code(cxt: KeywordCxt) {\n    const {gen, schema, it} = cxt\n    if (alwaysValidSchema(it, schema)) {\n      cxt.fail()\n      return\n    }\n\n    const valid = gen.name(\"valid\")\n    cxt.subschema(\n      {\n        keyword: \"not\",\n        compositeRule: true,\n        createErrors: false,\n        allErrors: false,\n      },\n      valid\n    )\n\n    cxt.failResult(\n      valid,\n      () => cxt.reset(),\n      () => cxt.error()\n    )\n  },\n  error: {message: \"must NOT be valid\"},\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/oneOf.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\nimport {SchemaCxt} from \"../../compile\"\n\nexport type OneOfError = ErrorObject<\n  \"oneOf\",\n  {passingSchemas: [number, number] | null},\n  AnySchema[]\n>\n\nconst error: KeywordErrorDefinition = {\n  message: \"must match exactly one schema in oneOf\",\n  params: ({params}) => _`{passingSchemas: ${params.passing}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"oneOf\",\n  schemaType: \"array\",\n  trackErrors: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, schema, parentSchema, it} = cxt\n    /* istanbul ignore if */\n    if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n    if (it.opts.discriminator && parentSchema.discriminator) return\n    const schArr: AnySchema[] = schema\n    const valid = gen.let(\"valid\", false)\n    const passing = gen.let(\"passing\", null)\n    const schValid = gen.name(\"_valid\")\n    cxt.setParams({passing})\n    // TODO possibly fail straight away (with warning or exception) if there are two empty always valid schemas\n\n    gen.block(validateOneOf)\n\n    cxt.result(\n      valid,\n      () => cxt.reset(),\n      () => cxt.error(true)\n    )\n\n    function validateOneOf(): void {\n      schArr.forEach((sch: AnySchema, i: number) => {\n        let schCxt: SchemaCxt | undefined\n        if (alwaysValidSchema(it, sch)) {\n          gen.var(schValid, true)\n        } else {\n          schCxt = cxt.subschema(\n            {\n              keyword: \"oneOf\",\n              schemaProp: i,\n              compositeRule: true,\n            },\n            schValid\n          )\n        }\n\n        if (i > 0) {\n          gen\n            .if(_`${schValid} && ${valid}`)\n            .assign(valid, false)\n            .assign(passing, _`[${passing}, ${i}]`)\n            .else()\n        }\n\n        gen.if(schValid, () => {\n          gen.assign(valid, true)\n          gen.assign(passing, i)\n          if (schCxt) cxt.mergeEvaluated(schCxt, Name)\n        })\n      })\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/patternProperties.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {allSchemaProperties, usePattern} from \"../code\"\nimport {_, not, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode} from \"../../compile/util\"\nimport {evaluatedPropsToName, Type} from \"../../compile/util\"\nimport {AnySchema} from \"../../types\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"patternProperties\",\n  type: \"object\",\n  schemaType: \"object\",\n  code(cxt: KeywordCxt) {\n    const {gen, schema, data, parentSchema, it} = cxt\n    const {opts} = it\n    const patterns = allSchemaProperties(schema)\n    const alwaysValidPatterns = patterns.filter((p) =>\n      alwaysValidSchema(it, schema[p] as AnySchema)\n    )\n\n    if (\n      patterns.length === 0 ||\n      (alwaysValidPatterns.length === patterns.length &&\n        (!it.opts.unevaluated || it.props === true))\n    ) {\n      return\n    }\n\n    const checkProperties =\n      opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties\n    const valid = gen.name(\"valid\")\n    if (it.props !== true && !(it.props instanceof Name)) {\n      it.props = evaluatedPropsToName(gen, it.props)\n    }\n    const {props} = it\n    validatePatternProperties()\n\n    function validatePatternProperties(): void {\n      for (const pat of patterns) {\n        if (checkProperties) checkMatchingProperties(pat)\n        if (it.allErrors) {\n          validateProperties(pat)\n        } else {\n          gen.var(valid, true) // TODO var\n          validateProperties(pat)\n          gen.if(valid)\n        }\n      }\n    }\n\n    function checkMatchingProperties(pat: string): void {\n      for (const prop in checkProperties) {\n        if (new RegExp(pat).test(prop)) {\n          checkStrictMode(\n            it,\n            `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`\n          )\n        }\n      }\n    }\n\n    function validateProperties(pat: string): void {\n      gen.forIn(\"key\", data, (key) => {\n        gen.if(_`${usePattern(cxt, pat)}.test(${key})`, () => {\n          const alwaysValid = alwaysValidPatterns.includes(pat)\n          if (!alwaysValid) {\n            cxt.subschema(\n              {\n                keyword: \"patternProperties\",\n                schemaProp: pat,\n                dataProp: key,\n                dataPropType: Type.Str,\n              },\n              valid\n            )\n          }\n\n          if (it.opts.unevaluated && props !== true) {\n            gen.assign(_`${props}[${key}]`, true)\n          } else if (!alwaysValid && !it.allErrors) {\n            // can short-circuit if `unevaluatedProperties` is not supported (opts.next === false)\n            // or if all properties were evaluated (props === true)\n            gen.if(not(valid), () => gen.break())\n          }\n        })\n      })\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/prefixItems.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport {validateTuple} from \"./items\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"prefixItems\",\n  type: \"array\",\n  schemaType: [\"array\"],\n  before: \"uniqueItems\",\n  code: (cxt) => validateTuple(cxt, \"items\"),\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/properties.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport {KeywordCxt} from \"../../compile/validate\"\nimport {propertyInData, allSchemaProperties} from \"../code\"\nimport {alwaysValidSchema, toHash, mergeEvaluated} from \"../../compile/util\"\nimport apDef from \"./additionalProperties\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"properties\",\n  type: \"object\",\n  schemaType: \"object\",\n  code(cxt: KeywordCxt) {\n    const {gen, schema, parentSchema, data, it} = cxt\n    if (it.opts.removeAdditional === \"all\" && parentSchema.additionalProperties === undefined) {\n      apDef.code(new KeywordCxt(it, apDef, \"additionalProperties\"))\n    }\n    const allProps = allSchemaProperties(schema)\n    for (const prop of allProps) {\n      it.definedProperties.add(prop)\n    }\n    if (it.opts.unevaluated && allProps.length && it.props !== true) {\n      it.props = mergeEvaluated.props(gen, toHash(allProps), it.props)\n    }\n    const properties = allProps.filter((p) => !alwaysValidSchema(it, schema[p]))\n    if (properties.length === 0) return\n    const valid = gen.name(\"valid\")\n\n    for (const prop of properties) {\n      if (hasDefault(prop)) {\n        applyPropertySchema(prop)\n      } else {\n        gen.if(propertyInData(gen, data, prop, it.opts.ownProperties))\n        applyPropertySchema(prop)\n        if (!it.allErrors) gen.else().var(valid, true)\n        gen.endIf()\n      }\n      cxt.it.definedProperties.add(prop)\n      cxt.ok(valid)\n    }\n\n    function hasDefault(prop: string): boolean | undefined {\n      return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== undefined\n    }\n\n    function applyPropertySchema(prop: string): void {\n      cxt.subschema(\n        {\n          keyword: \"properties\",\n          schemaProp: prop,\n          dataProp: prop,\n        },\n        valid\n      )\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/propertyNames.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, not} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\n\nexport type PropertyNamesError = ErrorObject<\"propertyNames\", {propertyName: string}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n  message: \"property name must be valid\",\n  params: ({params}) => _`{propertyName: ${params.propertyName}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"propertyNames\",\n  type: \"object\",\n  schemaType: [\"object\", \"boolean\"],\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, schema, data, it} = cxt\n    if (alwaysValidSchema(it, schema)) return\n    const valid = gen.name(\"valid\")\n\n    gen.forIn(\"key\", data, (key) => {\n      cxt.setParams({propertyName: key})\n      cxt.subschema(\n        {\n          keyword: \"propertyNames\",\n          data: key,\n          dataTypes: [\"string\"],\n          propertyName: key,\n          compositeRule: true,\n        },\n        valid\n      )\n      gen.if(not(valid), () => {\n        cxt.error(true)\n        if (!it.allErrors) gen.break()\n      })\n    })\n\n    cxt.ok(valid)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/applicator/thenElse.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {checkStrictMode} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: [\"then\", \"else\"],\n  schemaType: [\"object\", \"boolean\"],\n  code({keyword, parentSchema, it}: KeywordCxt) {\n    if (parentSchema.if === undefined) checkStrictMode(it, `\"${keyword}\" without \"if\" is ignored`)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/code.ts",
    "content": "import type {AnySchema, SchemaMap} from \"../types\"\nimport type {SchemaCxt} from \"../compile\"\nimport type {KeywordCxt} from \"../compile/validate\"\nimport {CodeGen, _, and, or, not, nil, strConcat, getProperty, Code, Name} from \"../compile/codegen\"\nimport {alwaysValidSchema, Type} from \"../compile/util\"\nimport N from \"../compile/names\"\nimport {useFunc} from \"../compile/util\"\nexport function checkReportMissingProp(cxt: KeywordCxt, prop: string): void {\n  const {gen, data, it} = cxt\n  gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => {\n    cxt.setParams({missingProperty: _`${prop}`}, true)\n    cxt.error()\n  })\n}\n\nexport function checkMissingProp(\n  {gen, data, it: {opts}}: KeywordCxt,\n  properties: string[],\n  missing: Name\n): Code {\n  return or(\n    ...properties.map((prop) =>\n      and(noPropertyInData(gen, data, prop, opts.ownProperties), _`${missing} = ${prop}`)\n    )\n  )\n}\n\nexport function reportMissingProp(cxt: KeywordCxt, missing: Name): void {\n  cxt.setParams({missingProperty: missing}, true)\n  cxt.error()\n}\n\nexport function hasPropFunc(gen: CodeGen): Name {\n  return gen.scopeValue(\"func\", {\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    ref: Object.prototype.hasOwnProperty,\n    code: _`Object.prototype.hasOwnProperty`,\n  })\n}\n\nexport function isOwnProperty(gen: CodeGen, data: Name, property: Name | string): Code {\n  return _`${hasPropFunc(gen)}.call(${data}, ${property})`\n}\n\nexport function propertyInData(\n  gen: CodeGen,\n  data: Name,\n  property: Name | string,\n  ownProperties?: boolean\n): Code {\n  const cond = _`${data}${getProperty(property)} !== undefined`\n  return ownProperties ? _`${cond} && ${isOwnProperty(gen, data, property)}` : cond\n}\n\nexport function noPropertyInData(\n  gen: CodeGen,\n  data: Name,\n  property: Name | string,\n  ownProperties?: boolean\n): Code {\n  const cond = _`${data}${getProperty(property)} === undefined`\n  return ownProperties ? or(cond, not(isOwnProperty(gen, data, property))) : cond\n}\n\nexport function allSchemaProperties(schemaMap?: SchemaMap): string[] {\n  return schemaMap ? Object.keys(schemaMap).filter((p) => p !== \"__proto__\") : []\n}\n\nexport function schemaProperties(it: SchemaCxt, schemaMap: SchemaMap): string[] {\n  return allSchemaProperties(schemaMap).filter(\n    (p) => !alwaysValidSchema(it, schemaMap[p] as AnySchema)\n  )\n}\n\nexport function callValidateCode(\n  {schemaCode, data, it: {gen, topSchemaRef, schemaPath, errorPath}, it}: KeywordCxt,\n  func: Code,\n  context: Code,\n  passSchema?: boolean\n): Code {\n  const dataAndSchema = passSchema ? _`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data\n  const valCxt: [Name, Code | number][] = [\n    [N.instancePath, strConcat(N.instancePath, errorPath)],\n    [N.parentData, it.parentData],\n    [N.parentDataProperty, it.parentDataProperty],\n    [N.rootData, N.rootData],\n  ]\n  if (it.opts.dynamicRef) valCxt.push([N.dynamicAnchors, N.dynamicAnchors])\n  const args = _`${dataAndSchema}, ${gen.object(...valCxt)}`\n  return context !== nil ? _`${func}.call(${context}, ${args})` : _`${func}(${args})`\n}\n\nconst newRegExp = _`new RegExp`\n\nexport function usePattern({gen, it: {opts}}: KeywordCxt, pattern: string): Name {\n  const u = opts.unicodeRegExp ? \"u\" : \"\"\n  const {regExp} = opts.code\n  const rx = regExp(pattern, u)\n\n  return gen.scopeValue(\"pattern\", {\n    key: rx.toString(),\n    ref: rx,\n    code: _`${regExp.code === \"new RegExp\" ? newRegExp : useFunc(gen, regExp)}(${pattern}, ${u})`,\n  })\n}\n\nexport function validateArray(cxt: KeywordCxt): Name {\n  const {gen, data, keyword, it} = cxt\n  const valid = gen.name(\"valid\")\n  if (it.allErrors) {\n    const validArr = gen.let(\"valid\", true)\n    validateItems(() => gen.assign(validArr, false))\n    return validArr\n  }\n  gen.var(valid, true)\n  validateItems(() => gen.break())\n  return valid\n\n  function validateItems(notValid: () => void): void {\n    const len = gen.const(\"len\", _`${data}.length`)\n    gen.forRange(\"i\", 0, len, (i) => {\n      cxt.subschema(\n        {\n          keyword,\n          dataProp: i,\n          dataPropType: Type.Num,\n        },\n        valid\n      )\n      gen.if(not(valid), notValid)\n    })\n  }\n}\n\nexport function validateUnion(cxt: KeywordCxt): void {\n  const {gen, schema, keyword, it} = cxt\n  /* istanbul ignore if */\n  if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n  const alwaysValid = schema.some((sch: AnySchema) => alwaysValidSchema(it, sch))\n  if (alwaysValid && !it.opts.unevaluated) return\n\n  const valid = gen.let(\"valid\", false)\n  const schValid = gen.name(\"_valid\")\n\n  gen.block(() =>\n    schema.forEach((_sch: AnySchema, i: number) => {\n      const schCxt = cxt.subschema(\n        {\n          keyword,\n          schemaProp: i,\n          compositeRule: true,\n        },\n        schValid\n      )\n      gen.assign(valid, _`${valid} || ${schValid}`)\n      const merged = cxt.mergeValidEvaluated(schCxt, schValid)\n      // can short-circuit if `unevaluatedProperties/Items` not supported (opts.unevaluated !== true)\n      // or if all properties and items were evaluated (it.props === true && it.items === true)\n      if (!merged) gen.if(not(valid))\n    })\n  )\n\n  cxt.result(\n    valid,\n    () => cxt.reset(),\n    () => cxt.error(true)\n  )\n}\n"
  },
  {
    "path": "lib/vocabularies/core/id.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"id\",\n  code() {\n    throw new Error('NOT SUPPORTED: keyword \"id\", use \"$id\" for schema ID')\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/core/index.ts",
    "content": "import type {Vocabulary} from \"../../types\"\nimport idKeyword from \"./id\"\nimport refKeyword from \"./ref\"\n\nconst core: Vocabulary = [\n  \"$schema\",\n  \"$id\",\n  \"$defs\",\n  \"$vocabulary\",\n  {keyword: \"$comment\"},\n  \"definitions\",\n  idKeyword,\n  refKeyword,\n]\n\nexport default core\n"
  },
  {
    "path": "lib/vocabularies/core/ref.ts",
    "content": "import type {CodeKeywordDefinition, AnySchema} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport MissingRefError from \"../../compile/ref_error\"\nimport {callValidateCode} from \"../code\"\nimport {_, nil, stringify, Code, Name} from \"../../compile/codegen\"\nimport N from \"../../compile/names\"\nimport {SchemaEnv, resolveRef} from \"../../compile\"\nimport {mergeEvaluated} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"$ref\",\n  schemaType: \"string\",\n  code(cxt: KeywordCxt): void {\n    const {gen, schema: $ref, it} = cxt\n    const {baseId, schemaEnv: env, validateName, opts, self} = it\n    const {root} = env\n    if (($ref === \"#\" || $ref === \"#/\") && baseId === root.baseId) return callRootRef()\n    const schOrEnv = resolveRef.call(self, root, baseId, $ref)\n    if (schOrEnv === undefined) throw new MissingRefError(it.opts.uriResolver, baseId, $ref)\n    if (schOrEnv instanceof SchemaEnv) return callValidate(schOrEnv)\n    return inlineRefSchema(schOrEnv)\n\n    function callRootRef(): void {\n      if (env === root) return callRef(cxt, validateName, env, env.$async)\n      const rootName = gen.scopeValue(\"root\", {ref: root})\n      return callRef(cxt, _`${rootName}.validate`, root, root.$async)\n    }\n\n    function callValidate(sch: SchemaEnv): void {\n      const v = getValidate(cxt, sch)\n      callRef(cxt, v, sch, sch.$async)\n    }\n\n    function inlineRefSchema(sch: AnySchema): void {\n      const schName = gen.scopeValue(\n        \"schema\",\n        opts.code.source === true ? {ref: sch, code: stringify(sch)} : {ref: sch}\n      )\n      const valid = gen.name(\"valid\")\n      const schCxt = cxt.subschema(\n        {\n          schema: sch,\n          dataTypes: [],\n          schemaPath: nil,\n          topSchemaRef: schName,\n          errSchemaPath: $ref,\n        },\n        valid\n      )\n      cxt.mergeEvaluated(schCxt)\n      cxt.ok(valid)\n    }\n  },\n}\n\nexport function getValidate(cxt: KeywordCxt, sch: SchemaEnv): Code {\n  const {gen} = cxt\n  return sch.validate\n    ? gen.scopeValue(\"validate\", {ref: sch.validate})\n    : _`${gen.scopeValue(\"wrapper\", {ref: sch})}.validate`\n}\n\nexport function callRef(cxt: KeywordCxt, v: Code, sch?: SchemaEnv, $async?: boolean): void {\n  const {gen, it} = cxt\n  const {allErrors, schemaEnv: env, opts} = it\n  const passCxt = opts.passContext ? N.this : nil\n  if ($async) callAsyncRef()\n  else callSyncRef()\n\n  function callAsyncRef(): void {\n    if (!env.$async) throw new Error(\"async schema referenced by sync schema\")\n    const valid = gen.let(\"valid\")\n    gen.try(\n      () => {\n        gen.code(_`await ${callValidateCode(cxt, v, passCxt)}`)\n        addEvaluatedFrom(v) // TODO will not work with async, it has to be returned with the result\n        if (!allErrors) gen.assign(valid, true)\n      },\n      (e) => {\n        gen.if(_`!(${e} instanceof ${it.ValidationError as Name})`, () => gen.throw(e))\n        addErrorsFrom(e)\n        if (!allErrors) gen.assign(valid, false)\n      }\n    )\n    cxt.ok(valid)\n  }\n\n  function callSyncRef(): void {\n    cxt.result(\n      callValidateCode(cxt, v, passCxt),\n      () => addEvaluatedFrom(v),\n      () => addErrorsFrom(v)\n    )\n  }\n\n  function addErrorsFrom(source: Code): void {\n    const errs = _`${source}.errors`\n    gen.assign(N.vErrors, _`${N.vErrors} === null ? ${errs} : ${N.vErrors}.concat(${errs})`) // TODO tagged\n    gen.assign(N.errors, _`${N.vErrors}.length`)\n  }\n\n  function addEvaluatedFrom(source: Code): void {\n    if (!it.opts.unevaluated) return\n    const schEvaluated = sch?.validate?.evaluated\n    // TODO refactor\n    if (it.props !== true) {\n      if (schEvaluated && !schEvaluated.dynamicProps) {\n        if (schEvaluated.props !== undefined) {\n          it.props = mergeEvaluated.props(gen, schEvaluated.props, it.props)\n        }\n      } else {\n        const props = gen.var(\"props\", _`${source}.evaluated.props`)\n        it.props = mergeEvaluated.props(gen, props, it.props, Name)\n      }\n    }\n    if (it.items !== true) {\n      if (schEvaluated && !schEvaluated.dynamicItems) {\n        if (schEvaluated.items !== undefined) {\n          it.items = mergeEvaluated.items(gen, schEvaluated.items, it.items)\n        }\n      } else {\n        const items = gen.var(\"items\", _`${source}.evaluated.items`)\n        it.items = mergeEvaluated.items(gen, items, it.items, Name)\n      }\n    }\n  }\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/discriminator/index.ts",
    "content": "import type {CodeKeywordDefinition, AnySchemaObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, getProperty, Name} from \"../../compile/codegen\"\nimport {DiscrError, DiscrErrorObj} from \"../discriminator/types\"\nimport {resolveRef, SchemaEnv} from \"../../compile\"\nimport MissingRefError from \"../../compile/ref_error\"\nimport {schemaHasRulesButRef} from \"../../compile/util\"\n\nexport type DiscriminatorError = DiscrErrorObj<DiscrError.Tag> | DiscrErrorObj<DiscrError.Mapping>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params: {discrError, tagName}}) =>\n    discrError === DiscrError.Tag\n      ? `tag \"${tagName}\" must be string`\n      : `value of tag \"${tagName}\" must be in oneOf`,\n  params: ({params: {discrError, tag, tagName}}) =>\n    _`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"discriminator\",\n  type: \"object\",\n  schemaType: \"object\",\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, data, schema, parentSchema, it} = cxt\n    const {oneOf} = parentSchema\n    if (!it.opts.discriminator) {\n      throw new Error(\"discriminator: requires discriminator option\")\n    }\n    const tagName = schema.propertyName\n    if (typeof tagName != \"string\") throw new Error(\"discriminator: requires propertyName\")\n    if (schema.mapping) throw new Error(\"discriminator: mapping is not supported\")\n    if (!oneOf) throw new Error(\"discriminator: requires oneOf keyword\")\n    const valid = gen.let(\"valid\", false)\n    const tag = gen.const(\"tag\", _`${data}${getProperty(tagName)}`)\n    gen.if(\n      _`typeof ${tag} == \"string\"`,\n      () => validateMapping(),\n      () => cxt.error(false, {discrError: DiscrError.Tag, tag, tagName})\n    )\n    cxt.ok(valid)\n\n    function validateMapping(): void {\n      const mapping = getMapping()\n      gen.if(false)\n      for (const tagValue in mapping) {\n        gen.elseIf(_`${tag} === ${tagValue}`)\n        gen.assign(valid, applyTagSchema(mapping[tagValue]))\n      }\n      gen.else()\n      cxt.error(false, {discrError: DiscrError.Mapping, tag, tagName})\n      gen.endIf()\n    }\n\n    function applyTagSchema(schemaProp?: number): Name {\n      const _valid = gen.name(\"valid\")\n      const schCxt = cxt.subschema({keyword: \"oneOf\", schemaProp}, _valid)\n      cxt.mergeEvaluated(schCxt, Name)\n      return _valid\n    }\n\n    function getMapping(): {[T in string]?: number} {\n      const oneOfMapping: {[T in string]?: number} = {}\n      const topRequired = hasRequired(parentSchema)\n      let tagRequired = true\n      for (let i = 0; i < oneOf.length; i++) {\n        let sch = oneOf[i]\n        if (sch?.$ref && !schemaHasRulesButRef(sch, it.self.RULES)) {\n          const ref = sch.$ref\n          sch = resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref)\n          if (sch instanceof SchemaEnv) sch = sch.schema\n          if (sch === undefined) throw new MissingRefError(it.opts.uriResolver, it.baseId, ref)\n        }\n        const propSch = sch?.properties?.[tagName]\n        if (typeof propSch != \"object\") {\n          throw new Error(\n            `discriminator: oneOf subschemas (or referenced schemas) must have \"properties/${tagName}\"`\n          )\n        }\n        tagRequired = tagRequired && (topRequired || hasRequired(sch))\n        addMappings(propSch, i)\n      }\n      if (!tagRequired) throw new Error(`discriminator: \"${tagName}\" must be required`)\n      return oneOfMapping\n\n      function hasRequired({required}: AnySchemaObject): boolean {\n        return Array.isArray(required) && required.includes(tagName)\n      }\n\n      function addMappings(sch: AnySchemaObject, i: number): void {\n        if (sch.const) {\n          addMapping(sch.const, i)\n        } else if (sch.enum) {\n          for (const tagValue of sch.enum) {\n            addMapping(tagValue, i)\n          }\n        } else {\n          throw new Error(`discriminator: \"properties/${tagName}\" must have \"const\" or \"enum\"`)\n        }\n      }\n\n      function addMapping(tagValue: unknown, i: number): void {\n        if (typeof tagValue != \"string\" || tagValue in oneOfMapping) {\n          throw new Error(`discriminator: \"${tagName}\" values must be unique strings`)\n        }\n        oneOfMapping[tagValue] = i\n      }\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/discriminator/types.ts",
    "content": "import type {ErrorObject} from \"../../types\"\n\nexport enum DiscrError {\n  Tag = \"tag\",\n  Mapping = \"mapping\",\n}\n\nexport type DiscrErrorObj<E extends DiscrError> = ErrorObject<\n  \"discriminator\",\n  {error: E; tag: string; tagValue: unknown},\n  string\n>\n"
  },
  {
    "path": "lib/vocabularies/draft2020.ts",
    "content": "import type {Vocabulary} from \"../types\"\nimport coreVocabulary from \"./core\"\nimport validationVocabulary from \"./validation\"\nimport getApplicatorVocabulary from \"./applicator\"\nimport dynamicVocabulary from \"./dynamic\"\nimport nextVocabulary from \"./next\"\nimport unevaluatedVocabulary from \"./unevaluated\"\nimport formatVocabulary from \"./format\"\nimport {metadataVocabulary, contentVocabulary} from \"./metadata\"\n\nconst draft2020Vocabularies: Vocabulary[] = [\n  dynamicVocabulary,\n  coreVocabulary,\n  validationVocabulary,\n  getApplicatorVocabulary(true),\n  formatVocabulary,\n  metadataVocabulary,\n  contentVocabulary,\n  nextVocabulary,\n  unevaluatedVocabulary,\n]\n\nexport default draft2020Vocabularies\n"
  },
  {
    "path": "lib/vocabularies/draft7.ts",
    "content": "import type {Vocabulary} from \"../types\"\nimport coreVocabulary from \"./core\"\nimport validationVocabulary from \"./validation\"\nimport getApplicatorVocabulary from \"./applicator\"\nimport formatVocabulary from \"./format\"\nimport {metadataVocabulary, contentVocabulary} from \"./metadata\"\n\nconst draft7Vocabularies: Vocabulary[] = [\n  coreVocabulary,\n  validationVocabulary,\n  getApplicatorVocabulary(),\n  formatVocabulary,\n  metadataVocabulary,\n  contentVocabulary,\n]\n\nexport default draft7Vocabularies\n"
  },
  {
    "path": "lib/vocabularies/dynamic/dynamicAnchor.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, getProperty, Code} from \"../../compile/codegen\"\nimport N from \"../../compile/names\"\nimport {SchemaEnv, compileSchema} from \"../../compile\"\nimport {getValidate} from \"../core/ref\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"$dynamicAnchor\",\n  schemaType: \"string\",\n  code: (cxt) => dynamicAnchor(cxt, cxt.schema),\n}\n\nexport function dynamicAnchor(cxt: KeywordCxt, anchor: string): void {\n  const {gen, it} = cxt\n  it.schemaEnv.root.dynamicAnchors[anchor] = true\n  const v = _`${N.dynamicAnchors}${getProperty(anchor)}`\n  const validate = it.errSchemaPath === \"#\" ? it.validateName : _getValidate(cxt)\n  gen.if(_`!${v}`, () => gen.assign(v, validate))\n}\n\nfunction _getValidate(cxt: KeywordCxt): Code {\n  const {schemaEnv, schema, self} = cxt.it\n  const {root, baseId, localRefs, meta} = schemaEnv.root\n  const {schemaId} = self.opts\n  const sch = new SchemaEnv({schema, schemaId, root, baseId, localRefs, meta})\n  compileSchema.call(self, sch)\n  return getValidate(cxt, sch)\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/dynamic/dynamicRef.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, getProperty, Code, Name} from \"../../compile/codegen\"\nimport N from \"../../compile/names\"\nimport {callRef} from \"../core/ref\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"$dynamicRef\",\n  schemaType: \"string\",\n  code: (cxt) => dynamicRef(cxt, cxt.schema),\n}\n\nexport function dynamicRef(cxt: KeywordCxt, ref: string): void {\n  const {gen, keyword, it} = cxt\n  if (ref[0] !== \"#\") throw new Error(`\"${keyword}\" only supports hash fragment reference`)\n  const anchor = ref.slice(1)\n  if (it.allErrors) {\n    _dynamicRef()\n  } else {\n    const valid = gen.let(\"valid\", false)\n    _dynamicRef(valid)\n    cxt.ok(valid)\n  }\n\n  function _dynamicRef(valid?: Name): void {\n    // TODO the assumption here is that `recursiveRef: #` always points to the root\n    // of the schema object, which is not correct, because there may be $id that\n    // makes # point to it, and the target schema may not contain dynamic/recursiveAnchor.\n    // Because of that 2 tests in recursiveRef.json fail.\n    // This is a similar problem to #815 (`$id` doesn't alter resolution scope for `{ \"$ref\": \"#\" }`).\n    // (This problem is not tested in JSON-Schema-Test-Suite)\n    if (it.schemaEnv.root.dynamicAnchors[anchor]) {\n      const v = gen.let(\"_v\", _`${N.dynamicAnchors}${getProperty(anchor)}`)\n      gen.if(v, _callRef(v, valid), _callRef(it.validateName, valid))\n    } else {\n      _callRef(it.validateName, valid)()\n    }\n  }\n\n  function _callRef(validate: Code, valid?: Name): () => void {\n    return valid\n      ? () =>\n          gen.block(() => {\n            callRef(cxt, validate)\n            gen.let(valid, true)\n          })\n      : () => callRef(cxt, validate)\n  }\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/dynamic/index.ts",
    "content": "import type {Vocabulary} from \"../../types\"\nimport dynamicAnchor from \"./dynamicAnchor\"\nimport dynamicRef from \"./dynamicRef\"\nimport recursiveAnchor from \"./recursiveAnchor\"\nimport recursiveRef from \"./recursiveRef\"\n\nconst dynamic: Vocabulary = [dynamicAnchor, dynamicRef, recursiveAnchor, recursiveRef]\n\nexport default dynamic\n"
  },
  {
    "path": "lib/vocabularies/dynamic/recursiveAnchor.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport {dynamicAnchor} from \"./dynamicAnchor\"\nimport {checkStrictMode} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"$recursiveAnchor\",\n  schemaType: \"boolean\",\n  code(cxt) {\n    if (cxt.schema) dynamicAnchor(cxt, \"\")\n    else checkStrictMode(cxt.it, \"$recursiveAnchor: false is ignored\")\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/dynamic/recursiveRef.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport {dynamicRef} from \"./dynamicRef\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"$recursiveRef\",\n  schemaType: \"string\",\n  code: (cxt) => dynamicRef(cxt, cxt.schema),\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/errors.ts",
    "content": "import type {TypeError} from \"../compile/validate/dataType\"\nimport type {ApplicatorKeywordError} from \"./applicator\"\nimport type {ValidationKeywordError} from \"./validation\"\nimport type {FormatError} from \"./format/format\"\nimport type {UnevaluatedPropertiesError} from \"./unevaluated/unevaluatedProperties\"\nimport type {UnevaluatedItemsError} from \"./unevaluated/unevaluatedItems\"\nimport type {DependentRequiredError} from \"./validation/dependentRequired\"\nimport type {DiscriminatorError} from \"./discriminator\"\n\nexport type DefinedError =\n  | TypeError\n  | ApplicatorKeywordError\n  | ValidationKeywordError\n  | FormatError\n  | UnevaluatedPropertiesError\n  | UnevaluatedItemsError\n  | DependentRequiredError\n  | DiscriminatorError\n"
  },
  {
    "path": "lib/vocabularies/format/format.ts",
    "content": "import type {\n  AddedFormat,\n  FormatValidator,\n  AsyncFormatValidator,\n  CodeKeywordDefinition,\n  KeywordErrorDefinition,\n  ErrorObject,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, nil, or, Code, getProperty, regexpCode} from \"../../compile/codegen\"\n\ntype FormatValidate =\n  | FormatValidator<string>\n  | FormatValidator<number>\n  | AsyncFormatValidator<string>\n  | AsyncFormatValidator<number>\n  | RegExp\n  | string\n  | true\n\nexport type FormatError = ErrorObject<\"format\", {format: string}, string | {$data: string}>\n\nconst error: KeywordErrorDefinition = {\n  message: ({schemaCode}) => str`must match format \"${schemaCode}\"`,\n  params: ({schemaCode}) => _`{format: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"format\",\n  type: [\"number\", \"string\"],\n  schemaType: \"string\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt, ruleType?: string) {\n    const {gen, data, $data, schema, schemaCode, it} = cxt\n    const {opts, errSchemaPath, schemaEnv, self} = it\n    if (!opts.validateFormats) return\n\n    if ($data) validate$DataFormat()\n    else validateFormat()\n\n    function validate$DataFormat(): void {\n      const fmts = gen.scopeValue(\"formats\", {\n        ref: self.formats,\n        code: opts.code.formats,\n      })\n      const fDef = gen.const(\"fDef\", _`${fmts}[${schemaCode}]`)\n      const fType = gen.let(\"fType\")\n      const format = gen.let(\"format\")\n      // TODO simplify\n      gen.if(\n        _`typeof ${fDef} == \"object\" && !(${fDef} instanceof RegExp)`,\n        () => gen.assign(fType, _`${fDef}.type || \"string\"`).assign(format, _`${fDef}.validate`),\n        () => gen.assign(fType, _`\"string\"`).assign(format, fDef)\n      )\n      cxt.fail$data(or(unknownFmt(), invalidFmt()))\n\n      function unknownFmt(): Code {\n        if (opts.strictSchema === false) return nil\n        return _`${schemaCode} && !${format}`\n      }\n\n      function invalidFmt(): Code {\n        const callFormat = schemaEnv.$async\n          ? _`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))`\n          : _`${format}(${data})`\n        const validData = _`(typeof ${format} == \"function\" ? ${callFormat} : ${format}.test(${data}))`\n        return _`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`\n      }\n    }\n\n    function validateFormat(): void {\n      const formatDef: AddedFormat | undefined = self.formats[schema]\n      if (!formatDef) {\n        unknownFormat()\n        return\n      }\n      if (formatDef === true) return\n      const [fmtType, format, fmtRef] = getFormat(formatDef)\n      if (fmtType === ruleType) cxt.pass(validCondition())\n\n      function unknownFormat(): void {\n        if (opts.strictSchema === false) {\n          self.logger.warn(unknownMsg())\n          return\n        }\n        throw new Error(unknownMsg())\n\n        function unknownMsg(): string {\n          return `unknown format \"${schema as string}\" ignored in schema at path \"${errSchemaPath}\"`\n        }\n      }\n\n      function getFormat(fmtDef: AddedFormat): [string, FormatValidate, Code] {\n        const code =\n          fmtDef instanceof RegExp\n            ? regexpCode(fmtDef)\n            : opts.code.formats\n            ? _`${opts.code.formats}${getProperty(schema)}`\n            : undefined\n        const fmt = gen.scopeValue(\"formats\", {key: schema, ref: fmtDef, code})\n        if (typeof fmtDef == \"object\" && !(fmtDef instanceof RegExp)) {\n          return [fmtDef.type || \"string\", fmtDef.validate, _`${fmt}.validate`]\n        }\n\n        return [\"string\", fmtDef, fmt]\n      }\n\n      function validCondition(): Code {\n        if (typeof formatDef == \"object\" && !(formatDef instanceof RegExp) && formatDef.async) {\n          if (!schemaEnv.$async) throw new Error(\"async format in sync schema\")\n          return _`await ${fmtRef}(${data})`\n        }\n        return typeof format == \"function\" ? _`${fmtRef}(${data})` : _`${fmtRef}.test(${data})`\n      }\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/format/index.ts",
    "content": "import type {Vocabulary} from \"../../types\"\nimport formatKeyword from \"./format\"\n\nconst format: Vocabulary = [formatKeyword]\n\nexport default format\n"
  },
  {
    "path": "lib/vocabularies/jtd/discriminator.ts",
    "content": "import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, not, getProperty, Name} from \"../../compile/codegen\"\nimport {checkMetadata} from \"./metadata\"\nimport {checkNullableObject} from \"./nullable\"\nimport {typeErrorMessage, typeErrorParams, _JTDTypeError} from \"./error\"\nimport {DiscrError, DiscrErrorObj} from \"../discriminator/types\"\n\nexport type JTDDiscriminatorError =\n  | _JTDTypeError<\"discriminator\", \"object\", string>\n  | DiscrErrorObj<DiscrError.Tag>\n  | DiscrErrorObj<DiscrError.Mapping>\n\nconst error: KeywordErrorDefinition = {\n  message: (cxt) => {\n    const {schema, params} = cxt\n    return params.discrError\n      ? params.discrError === DiscrError.Tag\n        ? `tag \"${schema}\" must be string`\n        : `value of tag \"${schema}\" must be in mapping`\n      : typeErrorMessage(cxt, \"object\")\n  },\n  params: (cxt) => {\n    const {schema, params} = cxt\n    return params.discrError\n      ? _`{error: ${params.discrError}, tag: ${schema}, tagValue: ${params.tag}}`\n      : typeErrorParams(cxt, \"object\")\n  },\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"discriminator\",\n  schemaType: \"string\",\n  implements: [\"mapping\"],\n  error,\n  code(cxt: KeywordCxt) {\n    checkMetadata(cxt)\n    const {gen, data, schema, parentSchema} = cxt\n    const [valid, cond] = checkNullableObject(cxt, data)\n\n    gen.if(cond)\n    validateDiscriminator()\n    gen.elseIf(not(valid))\n    cxt.error()\n    gen.endIf()\n    cxt.ok(valid)\n\n    function validateDiscriminator(): void {\n      const tag = gen.const(\"tag\", _`${data}${getProperty(schema)}`)\n      gen.if(_`${tag} === undefined`)\n      cxt.error(false, {discrError: DiscrError.Tag, tag})\n      gen.elseIf(_`typeof ${tag} == \"string\"`)\n      validateMapping(tag)\n      gen.else()\n      cxt.error(false, {discrError: DiscrError.Tag, tag}, {instancePath: schema})\n      gen.endIf()\n    }\n\n    function validateMapping(tag: Name): void {\n      gen.if(false)\n      for (const tagValue in parentSchema.mapping) {\n        gen.elseIf(_`${tag} === ${tagValue}`)\n        gen.assign(valid, applyTagSchema(tagValue))\n      }\n      gen.else()\n      cxt.error(\n        false,\n        {discrError: DiscrError.Mapping, tag},\n        {instancePath: schema, schemaPath: \"mapping\", parentSchema: true}\n      )\n      gen.endIf()\n    }\n\n    function applyTagSchema(schemaProp: string): Name {\n      const _valid = gen.name(\"valid\")\n      cxt.subschema(\n        {\n          keyword: \"mapping\",\n          schemaProp,\n          jtdDiscriminator: schema,\n        },\n        _valid\n      )\n      return _valid\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/elements.ts",
    "content": "import type {CodeKeywordDefinition, SchemaObject} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {alwaysValidSchema} from \"../../compile/util\"\nimport {validateArray} from \"../code\"\nimport {_, not} from \"../../compile/codegen\"\nimport {checkMetadata} from \"./metadata\"\nimport {checkNullable} from \"./nullable\"\nimport {typeError, _JTDTypeError} from \"./error\"\n\nexport type JTDElementsError = _JTDTypeError<\"elements\", \"array\", SchemaObject>\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"elements\",\n  schemaType: \"object\",\n  error: typeError(\"array\"),\n  code(cxt: KeywordCxt) {\n    checkMetadata(cxt)\n    const {gen, data, schema, it} = cxt\n    if (alwaysValidSchema(it, schema)) return\n    const [valid] = checkNullable(cxt)\n    gen.if(not(valid), () =>\n      gen.if(\n        _`Array.isArray(${data})`,\n        () => gen.assign(valid, validateArray(cxt)),\n        () => cxt.error()\n      )\n    )\n    cxt.ok(valid)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/enum.ts",
    "content": "import type {CodeKeywordDefinition, KeywordErrorDefinition, ErrorObject} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, or, and, Code} from \"../../compile/codegen\"\nimport {checkMetadata} from \"./metadata\"\nimport {checkNullable} from \"./nullable\"\n\nexport type JTDEnumError = ErrorObject<\"enum\", {allowedValues: string[]}, string[]>\n\nconst error: KeywordErrorDefinition = {\n  message: \"must be equal to one of the allowed values\",\n  params: ({schemaCode}) => _`{allowedValues: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"enum\",\n  schemaType: \"array\",\n  error,\n  code(cxt: KeywordCxt) {\n    checkMetadata(cxt)\n    const {gen, data, schema, schemaValue, parentSchema, it} = cxt\n    if (schema.length === 0) throw new Error(\"enum must have non-empty array\")\n    if (schema.length !== new Set(schema).size) throw new Error(\"enum items must be unique\")\n    let valid: Code\n    const isString = _`typeof ${data} == \"string\"`\n    if (schema.length >= it.opts.loopEnum) {\n      let cond: Code\n      ;[valid, cond] = checkNullable(cxt, isString)\n      gen.if(cond, loopEnum)\n    } else {\n      /* istanbul ignore if */\n      if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n      valid = and(isString, or(...schema.map((value: string) => _`${data} === ${value}`)))\n      if (parentSchema.nullable) valid = or(_`${data} === null`, valid)\n    }\n    cxt.pass(valid)\n\n    function loopEnum(): void {\n      gen.forOf(\"v\", schemaValue as Code, (v) =>\n        gen.if(_`${valid} = ${data} === ${v}`, () => gen.break())\n      )\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/error.ts",
    "content": "import type {KeywordErrorDefinition, KeywordErrorCxt, ErrorObject} from \"../../types\"\nimport {_, Code} from \"../../compile/codegen\"\n\nexport type _JTDTypeError<K extends string, T extends string, S> = ErrorObject<\n  K,\n  {type: T; nullable: boolean},\n  S\n>\n\nexport function typeError(t: string): KeywordErrorDefinition {\n  return {\n    message: (cxt) => typeErrorMessage(cxt, t),\n    params: (cxt) => typeErrorParams(cxt, t),\n  }\n}\n\nexport function typeErrorMessage({parentSchema}: KeywordErrorCxt, t: string): string {\n  return parentSchema?.nullable ? `must be ${t} or null` : `must be ${t}`\n}\n\nexport function typeErrorParams({parentSchema}: KeywordErrorCxt, t: string): Code {\n  return _`{type: ${t}, nullable: ${!!parentSchema?.nullable}}`\n}\n"
  },
  {
    "path": "lib/vocabularies/jtd/index.ts",
    "content": "import type {Vocabulary} from \"../../types\"\nimport refKeyword from \"./ref\"\nimport typeKeyword, {JTDTypeError} from \"./type\"\nimport enumKeyword, {JTDEnumError} from \"./enum\"\nimport elements, {JTDElementsError} from \"./elements\"\nimport properties, {JTDPropertiesError} from \"./properties\"\nimport optionalProperties from \"./optionalProperties\"\nimport discriminator, {JTDDiscriminatorError} from \"./discriminator\"\nimport values, {JTDValuesError} from \"./values\"\nimport union from \"./union\"\nimport metadata from \"./metadata\"\n\nconst jtdVocabulary: Vocabulary = [\n  \"definitions\",\n  refKeyword,\n  typeKeyword,\n  enumKeyword,\n  elements,\n  properties,\n  optionalProperties,\n  discriminator,\n  values,\n  union,\n  metadata,\n  {keyword: \"additionalProperties\", schemaType: \"boolean\"},\n  {keyword: \"nullable\", schemaType: \"boolean\"},\n]\n\nexport default jtdVocabulary\n\nexport type JTDErrorObject =\n  | JTDTypeError\n  | JTDEnumError\n  | JTDElementsError\n  | JTDPropertiesError\n  | JTDDiscriminatorError\n  | JTDValuesError\n"
  },
  {
    "path": "lib/vocabularies/jtd/metadata.ts",
    "content": "import {KeywordCxt} from \"../../ajv\"\nimport type {CodeKeywordDefinition} from \"../../types\"\nimport {alwaysValidSchema} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"metadata\",\n  schemaType: \"object\",\n  code(cxt: KeywordCxt) {\n    checkMetadata(cxt)\n    const {gen, schema, it} = cxt\n    if (alwaysValidSchema(it, schema)) return\n    const valid = gen.name(\"valid\")\n    cxt.subschema({keyword: \"metadata\", jtdMetadata: true}, valid)\n    cxt.ok(valid)\n  },\n}\n\nexport function checkMetadata({it, keyword}: KeywordCxt, metadata?: boolean): void {\n  if (it.jtdMetadata !== metadata) {\n    throw new Error(`JTD: \"${keyword}\" cannot be used in this schema location`)\n  }\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/nullable.ts",
    "content": "import type {KeywordCxt} from \"../../compile/validate\"\nimport {_, not, nil, Code, Name} from \"../../compile/codegen\"\n\nexport function checkNullable(\n  {gen, data, parentSchema}: KeywordCxt,\n  cond: Code = nil\n): [Name, Code] {\n  const valid = gen.name(\"valid\")\n  if (parentSchema.nullable) {\n    gen.let(valid, _`${data} === null`)\n    cond = not(valid)\n  } else {\n    gen.let(valid, false)\n  }\n  return [valid, cond]\n}\n\nexport function checkNullableObject(cxt: KeywordCxt, cond: Code): [Name, Code] {\n  const [valid, cond_] = checkNullable(cxt, cond)\n  return [valid, _`${cond_} && typeof ${cxt.data} == \"object\" && !Array.isArray(${cxt.data})`]\n}\n"
  },
  {
    "path": "lib/vocabularies/jtd/optionalProperties.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {validateProperties, error} from \"./properties\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"optionalProperties\",\n  schemaType: \"object\",\n  error,\n  code(cxt: KeywordCxt) {\n    if (cxt.parentSchema.properties) return\n    validateProperties(cxt)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/properties.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  SchemaObject,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {propertyInData, allSchemaProperties, isOwnProperty} from \"../code\"\nimport {alwaysValidSchema, schemaRefOrVal} from \"../../compile/util\"\nimport {_, and, not, Code, Name} from \"../../compile/codegen\"\nimport {checkMetadata} from \"./metadata\"\nimport {checkNullableObject} from \"./nullable\"\nimport {typeErrorMessage, typeErrorParams, _JTDTypeError} from \"./error\"\n\nenum PropError {\n  Additional = \"additional\",\n  Missing = \"missing\",\n}\n\ntype PropKeyword = \"properties\" | \"optionalProperties\"\n\ntype PropSchema = {[P in string]?: SchemaObject}\n\nexport type JTDPropertiesError =\n  | _JTDTypeError<PropKeyword, \"object\", PropSchema>\n  | ErrorObject<PropKeyword, {error: PropError.Additional; additionalProperty: string}, PropSchema>\n  | ErrorObject<PropKeyword, {error: PropError.Missing; missingProperty: string}, PropSchema>\n\nexport const error: KeywordErrorDefinition = {\n  message: (cxt) => {\n    const {params} = cxt\n    return params.propError\n      ? params.propError === PropError.Additional\n        ? \"must NOT have additional properties\"\n        : `must have property '${params.missingProperty}'`\n      : typeErrorMessage(cxt, \"object\")\n  },\n  params: (cxt) => {\n    const {params} = cxt\n    return params.propError\n      ? params.propError === PropError.Additional\n        ? _`{error: ${params.propError}, additionalProperty: ${params.additionalProperty}}`\n        : _`{error: ${params.propError}, missingProperty: ${params.missingProperty}}`\n      : typeErrorParams(cxt, \"object\")\n  },\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"properties\",\n  schemaType: \"object\",\n  error,\n  code: validateProperties,\n}\n\n// const error: KeywordErrorDefinition = {\n//   message: \"should NOT have additional properties\",\n//   params: ({params}) => _`{additionalProperty: ${params.additionalProperty}}`,\n// }\n\nexport function validateProperties(cxt: KeywordCxt): void {\n  checkMetadata(cxt)\n  const {gen, data, parentSchema, it} = cxt\n  const {additionalProperties, nullable} = parentSchema\n  if (it.jtdDiscriminator && nullable) throw new Error(\"JTD: nullable inside discriminator mapping\")\n  if (commonProperties()) {\n    throw new Error(\"JTD: properties and optionalProperties have common members\")\n  }\n  const [allProps, properties] = schemaProperties(\"properties\")\n  const [allOptProps, optProperties] = schemaProperties(\"optionalProperties\")\n  if (properties.length === 0 && optProperties.length === 0 && additionalProperties) {\n    return\n  }\n\n  const [valid, cond] =\n    it.jtdDiscriminator === undefined\n      ? checkNullableObject(cxt, data)\n      : [gen.let(\"valid\", false), true]\n  gen.if(cond, () =>\n    gen.assign(valid, true).block(() => {\n      validateProps(properties, \"properties\", true)\n      validateProps(optProperties, \"optionalProperties\")\n      if (!additionalProperties) validateAdditional()\n    })\n  )\n  cxt.pass(valid)\n\n  function commonProperties(): boolean {\n    const props = parentSchema.properties as Record<string, any> | undefined\n    const optProps = parentSchema.optionalProperties as Record<string, any> | undefined\n    if (!(props && optProps)) return false\n    for (const p in props) {\n      if (Object.prototype.hasOwnProperty.call(optProps, p)) return true\n    }\n    return false\n  }\n\n  function schemaProperties(keyword: string): [string[], string[]] {\n    const schema = parentSchema[keyword]\n    const allPs = schema ? allSchemaProperties(schema) : []\n    if (it.jtdDiscriminator && allPs.some((p) => p === it.jtdDiscriminator)) {\n      throw new Error(`JTD: discriminator tag used in ${keyword}`)\n    }\n    const ps = allPs.filter((p) => !alwaysValidSchema(it, schema[p]))\n    return [allPs, ps]\n  }\n\n  function validateProps(props: string[], keyword: string, required?: boolean): void {\n    const _valid = gen.var(\"valid\")\n    for (const prop of props) {\n      gen.if(\n        propertyInData(gen, data, prop, it.opts.ownProperties),\n        () => applyPropertySchema(prop, keyword, _valid),\n        () => missingProperty(prop)\n      )\n      cxt.ok(_valid)\n    }\n\n    function missingProperty(prop: string): void {\n      if (required) {\n        gen.assign(_valid, false)\n        cxt.error(false, {propError: PropError.Missing, missingProperty: prop}, {schemaPath: prop})\n      } else {\n        gen.assign(_valid, true)\n      }\n    }\n  }\n\n  function applyPropertySchema(prop: string, keyword: string, _valid: Name): void {\n    cxt.subschema(\n      {\n        keyword,\n        schemaProp: prop,\n        dataProp: prop,\n      },\n      _valid\n    )\n  }\n\n  function validateAdditional(): void {\n    gen.forIn(\"key\", data, (key: Name) => {\n      const addProp = isAdditional(key, allProps, \"properties\", it.jtdDiscriminator)\n      const addOptProp = isAdditional(key, allOptProps, \"optionalProperties\")\n      const extra =\n        addProp === true ? addOptProp : addOptProp === true ? addProp : and(addProp, addOptProp)\n      gen.if(extra, () => {\n        if (it.opts.removeAdditional) {\n          gen.code(_`delete ${data}[${key}]`)\n        } else {\n          cxt.error(\n            false,\n            {propError: PropError.Additional, additionalProperty: key},\n            {instancePath: key, parentSchema: true}\n          )\n          if (!it.opts.allErrors) gen.break()\n        }\n      })\n    })\n  }\n\n  function isAdditional(\n    key: Name,\n    props: string[],\n    keyword: string,\n    jtdDiscriminator?: string\n  ): Code | true {\n    let additional: Code | boolean\n    if (props.length > 8) {\n      // TODO maybe an option instead of hard-coded 8?\n      const propsSchema = schemaRefOrVal(it, parentSchema[keyword], keyword)\n      additional = not(isOwnProperty(gen, propsSchema as Code, key))\n      if (jtdDiscriminator !== undefined) {\n        additional = and(additional, _`${key} !== ${jtdDiscriminator}`)\n      }\n    } else if (props.length || jtdDiscriminator !== undefined) {\n      const ps = jtdDiscriminator === undefined ? props : [jtdDiscriminator].concat(props)\n      additional = and(...ps.map((p) => _`${key} !== ${p}`))\n    } else {\n      additional = true\n    }\n    return additional\n  }\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/ref.ts",
    "content": "import type {CodeKeywordDefinition, AnySchemaObject} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {compileSchema, SchemaEnv} from \"../../compile\"\nimport {_, not, nil, stringify} from \"../../compile/codegen\"\nimport MissingRefError from \"../../compile/ref_error\"\nimport N from \"../../compile/names\"\nimport {getValidate, callRef} from \"../core/ref\"\nimport {checkMetadata} from \"./metadata\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"ref\",\n  schemaType: \"string\",\n  code(cxt: KeywordCxt) {\n    checkMetadata(cxt)\n    const {gen, data, schema: ref, parentSchema, it} = cxt\n    const {\n      schemaEnv: {root},\n    } = it\n    const valid = gen.name(\"valid\")\n    if (parentSchema.nullable) {\n      gen.var(valid, _`${data} === null`)\n      gen.if(not(valid), validateJtdRef)\n    } else {\n      gen.var(valid, false)\n      validateJtdRef()\n    }\n    cxt.ok(valid)\n\n    function validateJtdRef(): void {\n      const refSchema = (root.schema as AnySchemaObject).definitions?.[ref]\n      if (!refSchema) {\n        throw new MissingRefError(it.opts.uriResolver, \"\", ref, `No definition ${ref}`)\n      }\n      if (hasRef(refSchema) || !it.opts.inlineRefs) callValidate(refSchema)\n      else inlineRefSchema(refSchema)\n    }\n\n    function callValidate(schema: AnySchemaObject): void {\n      const sch = compileSchema.call(\n        it.self,\n        new SchemaEnv({schema, root, schemaPath: `/definitions/${ref}`})\n      )\n      const v = getValidate(cxt, sch)\n      const errsCount = gen.const(\"_errs\", N.errors)\n      callRef(cxt, v, sch, sch.$async)\n      gen.assign(valid, _`${errsCount} === ${N.errors}`)\n    }\n\n    function inlineRefSchema(schema: AnySchemaObject): void {\n      const schName = gen.scopeValue(\n        \"schema\",\n        it.opts.code.source === true ? {ref: schema, code: stringify(schema)} : {ref: schema}\n      )\n      cxt.subschema(\n        {\n          schema,\n          dataTypes: [],\n          schemaPath: nil,\n          topSchemaRef: schName,\n          errSchemaPath: `/definitions/${ref}`,\n        },\n        valid\n      )\n    }\n  },\n}\n\nexport function hasRef(schema: AnySchemaObject): boolean {\n  for (const key in schema) {\n    let sch: AnySchemaObject\n    if (key === \"ref\" || (typeof (sch = schema[key]) == \"object\" && hasRef(sch))) return true\n  }\n  return false\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/type.ts",
    "content": "import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, nil, or, Code} from \"../../compile/codegen\"\nimport validTimestamp from \"../../runtime/timestamp\"\nimport {useFunc} from \"../../compile/util\"\nimport {checkMetadata} from \"./metadata\"\nimport {typeErrorMessage, typeErrorParams, _JTDTypeError} from \"./error\"\n\nexport type JTDTypeError = _JTDTypeError<\"type\", JTDType, JTDType>\n\nexport type IntType = \"int8\" | \"uint8\" | \"int16\" | \"uint16\" | \"int32\" | \"uint32\"\n\nexport const intRange: {[T in IntType]: [number, number, number]} = {\n  int8: [-128, 127, 3],\n  uint8: [0, 255, 3],\n  int16: [-32768, 32767, 5],\n  uint16: [0, 65535, 5],\n  int32: [-2147483648, 2147483647, 10],\n  uint32: [0, 4294967295, 10],\n}\n\nexport type JTDType = \"boolean\" | \"string\" | \"timestamp\" | \"float32\" | \"float64\" | IntType\n\nconst error: KeywordErrorDefinition = {\n  message: (cxt) => typeErrorMessage(cxt, cxt.schema),\n  params: (cxt) => typeErrorParams(cxt, cxt.schema),\n}\n\nfunction timestampCode(cxt: KeywordCxt): Code {\n  const {gen, data, it} = cxt\n  const {timestamp, allowDate} = it.opts\n  if (timestamp === \"date\") return _`${data} instanceof Date `\n  const vts = useFunc(gen, validTimestamp)\n  const allowDateArg = allowDate ? _`, true` : nil\n  const validString = _`typeof ${data} == \"string\" && ${vts}(${data}${allowDateArg})`\n  return timestamp === \"string\" ? validString : or(_`${data} instanceof Date`, validString)\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"type\",\n  schemaType: \"string\",\n  error,\n  code(cxt: KeywordCxt) {\n    checkMetadata(cxt)\n    const {data, schema, parentSchema, it} = cxt\n    let cond: Code\n    switch (schema) {\n      case \"boolean\":\n      case \"string\":\n        cond = _`typeof ${data} == ${schema}`\n        break\n      case \"timestamp\": {\n        cond = timestampCode(cxt)\n        break\n      }\n      case \"float32\":\n      case \"float64\":\n        cond = _`typeof ${data} == \"number\"`\n        break\n      default: {\n        const sch = schema as IntType\n        cond = _`typeof ${data} == \"number\" && isFinite(${data}) && !(${data} % 1)`\n        if (!it.opts.int32range && (sch === \"int32\" || sch === \"uint32\")) {\n          if (sch === \"uint32\") cond = _`${cond} && ${data} >= 0`\n        } else {\n          const [min, max] = intRange[sch]\n          cond = _`${cond} && ${data} >= ${min} && ${data} <= ${max}`\n        }\n      }\n    }\n    cxt.pass(parentSchema.nullable ? or(_`${data} === null`, cond) : cond)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/union.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport {validateUnion} from \"../code\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"union\",\n  schemaType: \"array\",\n  trackErrors: true,\n  code: validateUnion,\n  error: {message: \"must match a schema in union\"},\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/jtd/values.ts",
    "content": "import type {CodeKeywordDefinition, SchemaObject} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {alwaysValidSchema, Type} from \"../../compile/util\"\nimport {not, or, Name} from \"../../compile/codegen\"\nimport {checkMetadata} from \"./metadata\"\nimport {checkNullableObject} from \"./nullable\"\nimport {typeError, _JTDTypeError} from \"./error\"\n\nexport type JTDValuesError = _JTDTypeError<\"values\", \"object\", SchemaObject>\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"values\",\n  schemaType: \"object\",\n  error: typeError(\"object\"),\n  code(cxt: KeywordCxt) {\n    checkMetadata(cxt)\n    const {gen, data, schema, it} = cxt\n    const [valid, cond] = checkNullableObject(cxt, data)\n    if (alwaysValidSchema(it, schema)) {\n      gen.if(not(or(cond, valid)), () => cxt.error())\n    } else {\n      gen.if(cond)\n      gen.assign(valid, validateMap())\n      gen.elseIf(not(valid))\n      cxt.error()\n      gen.endIf()\n    }\n    cxt.ok(valid)\n\n    function validateMap(): Name | boolean {\n      const _valid = gen.name(\"valid\")\n      if (it.allErrors) {\n        const validMap = gen.let(\"valid\", true)\n        validateValues(() => gen.assign(validMap, false))\n        return validMap\n      }\n      gen.var(_valid, true)\n      validateValues(() => gen.break())\n      return _valid\n\n      function validateValues(notValid: () => void): void {\n        gen.forIn(\"key\", data, (key) => {\n          cxt.subschema(\n            {\n              keyword: \"values\",\n              dataProp: key,\n              dataPropType: Type.Str,\n            },\n            _valid\n          )\n          gen.if(not(_valid), notValid)\n        })\n      }\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/metadata.ts",
    "content": "import type {Vocabulary} from \"../types\"\n\nexport const metadataVocabulary: Vocabulary = [\n  \"title\",\n  \"description\",\n  \"default\",\n  \"deprecated\",\n  \"readOnly\",\n  \"writeOnly\",\n  \"examples\",\n]\n\nexport const contentVocabulary: Vocabulary = [\n  \"contentMediaType\",\n  \"contentEncoding\",\n  \"contentSchema\",\n]\n"
  },
  {
    "path": "lib/vocabularies/next.ts",
    "content": "import type {Vocabulary} from \"../types\"\nimport dependentRequired from \"./validation/dependentRequired\"\nimport dependentSchemas from \"./applicator/dependentSchemas\"\nimport limitContains from \"./validation/limitContains\"\n\nconst next: Vocabulary = [dependentRequired, dependentSchemas, limitContains]\n\nexport default next\n"
  },
  {
    "path": "lib/vocabularies/unevaluated/index.ts",
    "content": "import type {Vocabulary} from \"../../types\"\nimport unevaluatedProperties from \"./unevaluatedProperties\"\nimport unevaluatedItems from \"./unevaluatedItems\"\n\nconst unevaluated: Vocabulary = [unevaluatedProperties, unevaluatedItems]\n\nexport default unevaluated\n"
  },
  {
    "path": "lib/vocabularies/unevaluated/unevaluatedItems.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  ErrorObject,\n  KeywordErrorDefinition,\n  AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, not, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, Type} from \"../../compile/util\"\n\nexport type UnevaluatedItemsError = ErrorObject<\"unevaluatedItems\", {limit: number}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params: {len}}) => str`must NOT have more than ${len} items`,\n  params: ({params: {len}}) => _`{limit: ${len}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"unevaluatedItems\",\n  type: \"array\",\n  schemaType: [\"boolean\", \"object\"],\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, schema, data, it} = cxt\n    const items = it.items || 0\n    if (items === true) return\n    const len = gen.const(\"len\", _`${data}.length`)\n    if (schema === false) {\n      cxt.setParams({len: items})\n      cxt.fail(_`${len} > ${items}`)\n    } else if (typeof schema == \"object\" && !alwaysValidSchema(it, schema)) {\n      const valid = gen.var(\"valid\", _`${len} <= ${items}`)\n      gen.if(not(valid), () => validateItems(valid, items))\n      cxt.ok(valid)\n    }\n    it.items = true\n\n    function validateItems(valid: Name, from: Name | number): void {\n      gen.forRange(\"i\", from, len, (i) => {\n        cxt.subschema({keyword: \"unevaluatedItems\", dataProp: i, dataPropType: Type.Num}, valid)\n        if (!it.allErrors) gen.if(not(valid), () => gen.break())\n      })\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/unevaluated/unevaluatedProperties.ts",
    "content": "import type {\n  CodeKeywordDefinition,\n  KeywordErrorDefinition,\n  ErrorObject,\n  AnySchema,\n} from \"../../types\"\nimport {_, not, and, Name, Code} from \"../../compile/codegen\"\nimport {alwaysValidSchema, Type} from \"../../compile/util\"\nimport N from \"../../compile/names\"\n\nexport type UnevaluatedPropertiesError = ErrorObject<\n  \"unevaluatedProperties\",\n  {unevaluatedProperty: string},\n  AnySchema\n>\n\nconst error: KeywordErrorDefinition = {\n  message: \"must NOT have unevaluated properties\",\n  params: ({params}) => _`{unevaluatedProperty: ${params.unevaluatedProperty}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"unevaluatedProperties\",\n  type: \"object\",\n  schemaType: [\"boolean\", \"object\"],\n  trackErrors: true,\n  error,\n  code(cxt) {\n    const {gen, schema, data, errsCount, it} = cxt\n    /* istanbul ignore if */\n    if (!errsCount) throw new Error(\"ajv implementation error\")\n    const {allErrors, props} = it\n    if (props instanceof Name) {\n      gen.if(_`${props} !== true`, () =>\n        gen.forIn(\"key\", data, (key: Name) =>\n          gen.if(unevaluatedDynamic(props, key), () => unevaluatedPropCode(key))\n        )\n      )\n    } else if (props !== true) {\n      gen.forIn(\"key\", data, (key: Name) =>\n        props === undefined\n          ? unevaluatedPropCode(key)\n          : gen.if(unevaluatedStatic(props, key), () => unevaluatedPropCode(key))\n      )\n    }\n    it.props = true\n    cxt.ok(_`${errsCount} === ${N.errors}`)\n\n    function unevaluatedPropCode(key: Name): void {\n      if (schema === false) {\n        cxt.setParams({unevaluatedProperty: key})\n        cxt.error()\n        if (!allErrors) gen.break()\n        return\n      }\n\n      if (!alwaysValidSchema(it, schema)) {\n        const valid = gen.name(\"valid\")\n        cxt.subschema(\n          {\n            keyword: \"unevaluatedProperties\",\n            dataProp: key,\n            dataPropType: Type.Str,\n          },\n          valid\n        )\n        if (!allErrors) gen.if(not(valid), () => gen.break())\n      }\n    }\n\n    function unevaluatedDynamic(evaluatedProps: Name, key: Name): Code {\n      return _`!${evaluatedProps} || !${evaluatedProps}[${key}]`\n    }\n\n    function unevaluatedStatic(evaluatedProps: {[K in string]?: true}, key: Name): Code {\n      const ps: Code[] = []\n      for (const p in evaluatedProps) {\n        if (evaluatedProps[p] === true) ps.push(_`${key} !== ${p}`)\n      }\n      return and(...ps)\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/const.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport equal from \"../../runtime/equal\"\n\nexport type ConstError = ErrorObject<\"const\", {allowedValue: any}>\n\nconst error: KeywordErrorDefinition = {\n  message: \"must be equal to constant\",\n  params: ({schemaCode}) => _`{allowedValue: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"const\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, data, $data, schemaCode, schema} = cxt\n    if ($data || (schema && typeof schema == \"object\")) {\n      cxt.fail$data(_`!${useFunc(gen, equal)}(${data}, ${schemaCode})`)\n    } else {\n      cxt.fail(_`${schema} !== ${data}`)\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/dependentRequired.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject} from \"../../types\"\nimport {\n  validatePropertyDeps,\n  error,\n  DependenciesErrorParams,\n  PropertyDependencies,\n} from \"../applicator/dependencies\"\n\nexport type DependentRequiredError = ErrorObject<\n  \"dependentRequired\",\n  DependenciesErrorParams,\n  PropertyDependencies\n>\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"dependentRequired\",\n  type: \"object\",\n  schemaType: \"object\",\n  error,\n  code: (cxt) => validatePropertyDeps(cxt),\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/enum.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, or, Name, Code} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport equal from \"../../runtime/equal\"\n\nexport type EnumError = ErrorObject<\"enum\", {allowedValues: any[]}, any[] | {$data: string}>\n\nconst error: KeywordErrorDefinition = {\n  message: \"must be equal to one of the allowed values\",\n  params: ({schemaCode}) => _`{allowedValues: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"enum\",\n  schemaType: \"array\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, data, $data, schema, schemaCode, it} = cxt\n    if (!$data && schema.length === 0) throw new Error(\"enum must have non-empty array\")\n    const useLoop = schema.length >= it.opts.loopEnum\n    let eql: Name | undefined\n    const getEql = (): Name => (eql ??= useFunc(gen, equal))\n\n    let valid: Code\n    if (useLoop || $data) {\n      valid = gen.let(\"valid\")\n      cxt.block$data(valid, loopEnum)\n    } else {\n      /* istanbul ignore if */\n      if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n      const vSchema = gen.const(\"vSchema\", schemaCode)\n      valid = or(...schema.map((_x: unknown, i: number) => equalCode(vSchema, i)))\n    }\n    cxt.pass(valid)\n\n    function loopEnum(): void {\n      gen.assign(valid, false)\n      gen.forOf(\"v\", schemaCode as Code, (v) =>\n        gen.if(_`${getEql()}(${data}, ${v})`, () => gen.assign(valid, true).break())\n      )\n    }\n\n    function equalCode(vSchema: Name, i: number): Code {\n      const sch = schema[i]\n      return typeof sch === \"object\" && sch !== null\n        ? _`${getEql()}(${data}, ${vSchema}[${i}])`\n        : _`${data} === ${sch}`\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/index.ts",
    "content": "import type {ErrorObject, Vocabulary} from \"../../types\"\nimport limitNumber, {LimitNumberError} from \"./limitNumber\"\nimport multipleOf, {MultipleOfError} from \"./multipleOf\"\nimport limitLength from \"./limitLength\"\nimport pattern, {PatternError} from \"./pattern\"\nimport limitProperties from \"./limitProperties\"\nimport required, {RequiredError} from \"./required\"\nimport limitItems from \"./limitItems\"\nimport uniqueItems, {UniqueItemsError} from \"./uniqueItems\"\nimport constKeyword, {ConstError} from \"./const\"\nimport enumKeyword, {EnumError} from \"./enum\"\n\nconst validation: Vocabulary = [\n  // number\n  limitNumber,\n  multipleOf,\n  // string\n  limitLength,\n  pattern,\n  // object\n  limitProperties,\n  required,\n  // array\n  limitItems,\n  uniqueItems,\n  // any\n  {keyword: \"type\", schemaType: [\"string\", \"array\"]},\n  {keyword: \"nullable\", schemaType: \"boolean\"},\n  constKeyword,\n  enumKeyword,\n]\n\nexport default validation\n\ntype LimitError = ErrorObject<\n  \"maxItems\" | \"minItems\" | \"minProperties\" | \"maxProperties\" | \"minLength\" | \"maxLength\",\n  {limit: number},\n  number | {$data: string}\n>\n\nexport type ValidationKeywordError =\n  | LimitError\n  | LimitNumberError\n  | MultipleOfError\n  | PatternError\n  | RequiredError\n  | UniqueItemsError\n  | ConstError\n  | EnumError\n"
  },
  {
    "path": "lib/vocabularies/validation/limitContains.ts",
    "content": "import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {checkStrictMode} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n  keyword: [\"maxContains\", \"minContains\"],\n  type: \"array\",\n  schemaType: \"number\",\n  code({keyword, parentSchema, it}: KeywordCxt) {\n    if (parentSchema.contains === undefined) {\n      checkStrictMode(it, `\"${keyword}\" without \"contains\" is ignored`)\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/limitItems.ts",
    "content": "import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators} from \"../../compile/codegen\"\n\nconst error: KeywordErrorDefinition = {\n  message({keyword, schemaCode}) {\n    const comp = keyword === \"maxItems\" ? \"more\" : \"fewer\"\n    return str`must NOT have ${comp} than ${schemaCode} items`\n  },\n  params: ({schemaCode}) => _`{limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: [\"maxItems\", \"minItems\"],\n  type: \"array\",\n  schemaType: \"number\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {keyword, data, schemaCode} = cxt\n    const op = keyword === \"maxItems\" ? operators.GT : operators.LT\n    cxt.fail$data(_`${data}.length ${op} ${schemaCode}`)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/limitLength.ts",
    "content": "import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport ucs2length from \"../../runtime/ucs2length\"\n\nconst error: KeywordErrorDefinition = {\n  message({keyword, schemaCode}) {\n    const comp = keyword === \"maxLength\" ? \"more\" : \"fewer\"\n    return str`must NOT have ${comp} than ${schemaCode} characters`\n  },\n  params: ({schemaCode}) => _`{limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: [\"maxLength\", \"minLength\"],\n  type: \"string\",\n  schemaType: \"number\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {keyword, data, schemaCode, it} = cxt\n    const op = keyword === \"maxLength\" ? operators.GT : operators.LT\n    const len =\n      it.opts.unicode === false ? _`${data}.length` : _`${useFunc(cxt.gen, ucs2length)}(${data})`\n    cxt.fail$data(_`${len} ${op} ${schemaCode}`)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/limitNumber.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators, Code} from \"../../compile/codegen\"\n\nconst ops = operators\n\ntype Kwd = \"maximum\" | \"minimum\" | \"exclusiveMaximum\" | \"exclusiveMinimum\"\n\ntype Comparison = \"<=\" | \">=\" | \"<\" | \">\"\n\nconst KWDs: {[K in Kwd]: {okStr: Comparison; ok: Code; fail: Code}} = {\n  maximum: {okStr: \"<=\", ok: ops.LTE, fail: ops.GT},\n  minimum: {okStr: \">=\", ok: ops.GTE, fail: ops.LT},\n  exclusiveMaximum: {okStr: \"<\", ok: ops.LT, fail: ops.GTE},\n  exclusiveMinimum: {okStr: \">\", ok: ops.GT, fail: ops.LTE},\n}\n\nexport type LimitNumberError = ErrorObject<\n  Kwd,\n  {limit: number; comparison: Comparison},\n  number | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n  message: ({keyword, schemaCode}) => str`must be ${KWDs[keyword as Kwd].okStr} ${schemaCode}`,\n  params: ({keyword, schemaCode}) =>\n    _`{comparison: ${KWDs[keyword as Kwd].okStr}, limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: Object.keys(KWDs),\n  type: \"number\",\n  schemaType: \"number\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {keyword, data, schemaCode} = cxt\n    cxt.fail$data(_`${data} ${KWDs[keyword as Kwd].fail} ${schemaCode} || isNaN(${data})`)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/limitProperties.ts",
    "content": "import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators} from \"../../compile/codegen\"\n\nconst error: KeywordErrorDefinition = {\n  message({keyword, schemaCode}) {\n    const comp = keyword === \"maxProperties\" ? \"more\" : \"fewer\"\n    return str`must NOT have ${comp} than ${schemaCode} properties`\n  },\n  params: ({schemaCode}) => _`{limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: [\"maxProperties\", \"minProperties\"],\n  type: \"object\",\n  schemaType: \"number\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {keyword, data, schemaCode} = cxt\n    const op = keyword === \"maxProperties\" ? operators.GT : operators.LT\n    cxt.fail$data(_`Object.keys(${data}).length ${op} ${schemaCode}`)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/multipleOf.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str} from \"../../compile/codegen\"\n\nexport type MultipleOfError = ErrorObject<\n  \"multipleOf\",\n  {multipleOf: number},\n  number | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n  message: ({schemaCode}) => str`must be multiple of ${schemaCode}`,\n  params: ({schemaCode}) => _`{multipleOf: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"multipleOf\",\n  type: \"number\",\n  schemaType: \"number\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, data, schemaCode, it} = cxt\n    // const bdt = bad$DataType(schemaCode, <string>def.schemaType, $data)\n    const prec = it.opts.multipleOfPrecision\n    const res = gen.let(\"res\")\n    const invalid = prec\n      ? _`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}`\n      : _`${res} !== parseInt(${res})`\n    cxt.fail$data(_`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`)\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/pattern.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {usePattern} from \"../code\"\nimport {useFunc} from \"../../compile/util\"\nimport {_, str} from \"../../compile/codegen\"\n\nexport type PatternError = ErrorObject<\"pattern\", {pattern: string}, string | {$data: string}>\n\nconst error: KeywordErrorDefinition = {\n  message: ({schemaCode}) => str`must match pattern \"${schemaCode}\"`,\n  params: ({schemaCode}) => _`{pattern: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"pattern\",\n  type: \"string\",\n  schemaType: \"string\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, data, $data, schema, schemaCode, it} = cxt\n    const u = it.opts.unicodeRegExp ? \"u\" : \"\"\n    if ($data) {\n      const {regExp} = it.opts.code\n      const regExpCode = regExp.code === \"new RegExp\" ? _`new RegExp` : useFunc(gen, regExp)\n      const valid = gen.let(\"valid\")\n      gen.try(\n        () => gen.assign(valid, _`${regExpCode}(${schemaCode}, ${u}).test(${data})`),\n        () => gen.assign(valid, false)\n      )\n      cxt.fail$data(_`!${valid}`)\n    } else {\n      const regExp = usePattern(cxt, schema)\n      cxt.fail$data(_`!${regExp}.test(${data})`)\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/required.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {\n  checkReportMissingProp,\n  checkMissingProp,\n  reportMissingProp,\n  propertyInData,\n  noPropertyInData,\n} from \"../code\"\nimport {_, str, nil, not, Name, Code} from \"../../compile/codegen\"\nimport {checkStrictMode} from \"../../compile/util\"\n\nexport type RequiredError = ErrorObject<\n  \"required\",\n  {missingProperty: string},\n  string[] | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params: {missingProperty}}) => str`must have required property '${missingProperty}'`,\n  params: ({params: {missingProperty}}) => _`{missingProperty: ${missingProperty}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"required\",\n  type: \"object\",\n  schemaType: \"array\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, schema, schemaCode, data, $data, it} = cxt\n    const {opts} = it\n    if (!$data && schema.length === 0) return\n    const useLoop = schema.length >= opts.loopRequired\n    if (it.allErrors) allErrorsMode()\n    else exitOnErrorMode()\n\n    if (opts.strictRequired) {\n      const props = cxt.parentSchema.properties\n      const {definedProperties} = cxt.it\n      for (const requiredKey of schema) {\n        if (props?.[requiredKey] === undefined && !definedProperties.has(requiredKey)) {\n          const schemaPath = it.schemaEnv.baseId + it.errSchemaPath\n          const msg = `required property \"${requiredKey}\" is not defined at \"${schemaPath}\" (strictRequired)`\n          checkStrictMode(it, msg, it.opts.strictRequired)\n        }\n      }\n    }\n\n    function allErrorsMode(): void {\n      if (useLoop || $data) {\n        cxt.block$data(nil, loopAllRequired)\n      } else {\n        for (const prop of schema) {\n          checkReportMissingProp(cxt, prop)\n        }\n      }\n    }\n\n    function exitOnErrorMode(): void {\n      const missing = gen.let(\"missing\")\n      if (useLoop || $data) {\n        const valid = gen.let(\"valid\", true)\n        cxt.block$data(valid, () => loopUntilMissing(missing, valid))\n        cxt.ok(valid)\n      } else {\n        gen.if(checkMissingProp(cxt, schema, missing))\n        reportMissingProp(cxt, missing)\n        gen.else()\n      }\n    }\n\n    function loopAllRequired(): void {\n      gen.forOf(\"prop\", schemaCode as Code, (prop) => {\n        cxt.setParams({missingProperty: prop})\n        gen.if(noPropertyInData(gen, data, prop, opts.ownProperties), () => cxt.error())\n      })\n    }\n\n    function loopUntilMissing(missing: Name, valid: Name): void {\n      cxt.setParams({missingProperty: missing})\n      gen.forOf(\n        missing,\n        schemaCode as Code,\n        () => {\n          gen.assign(valid, propertyInData(gen, data, missing, opts.ownProperties))\n          gen.if(not(valid), () => {\n            cxt.error()\n            gen.break()\n          })\n        },\n        nil\n      )\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "lib/vocabularies/validation/uniqueItems.ts",
    "content": "import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {checkDataTypes, getSchemaTypes, DataType} from \"../../compile/validate/dataType\"\nimport {_, str, Name} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport equal from \"../../runtime/equal\"\n\nexport type UniqueItemsError = ErrorObject<\n  \"uniqueItems\",\n  {i: number; j: number},\n  boolean | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n  message: ({params: {i, j}}) =>\n    str`must NOT have duplicate items (items ## ${j} and ${i} are identical)`,\n  params: ({params: {i, j}}) => _`{i: ${i}, j: ${j}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n  keyword: \"uniqueItems\",\n  type: \"array\",\n  schemaType: \"boolean\",\n  $data: true,\n  error,\n  code(cxt: KeywordCxt) {\n    const {gen, data, $data, schema, parentSchema, schemaCode, it} = cxt\n    if (!$data && !schema) return\n    const valid = gen.let(\"valid\")\n    const itemTypes = parentSchema.items ? getSchemaTypes(parentSchema.items) : []\n    cxt.block$data(valid, validateUniqueItems, _`${schemaCode} === false`)\n    cxt.ok(valid)\n\n    function validateUniqueItems(): void {\n      const i = gen.let(\"i\", _`${data}.length`)\n      const j = gen.let(\"j\")\n      cxt.setParams({i, j})\n      gen.assign(valid, true)\n      gen.if(_`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j))\n    }\n\n    function canOptimize(): boolean {\n      return itemTypes.length > 0 && !itemTypes.some((t) => t === \"object\" || t === \"array\")\n    }\n\n    function loopN(i: Name, j: Name): void {\n      const item = gen.name(\"item\")\n      const wrongType = checkDataTypes(itemTypes, item, it.opts.strictNumbers, DataType.Wrong)\n      const indices = gen.const(\"indices\", _`{}`)\n      gen.for(_`;${i}--;`, () => {\n        gen.let(item, _`${data}[${i}]`)\n        gen.if(wrongType, _`continue`)\n        if (itemTypes.length > 1) gen.if(_`typeof ${item} == \"string\"`, _`${item} += \"_\"`)\n        gen\n          .if(_`typeof ${indices}[${item}] == \"number\"`, () => {\n            gen.assign(j, _`${indices}[${item}]`)\n            cxt.error()\n            gen.assign(valid, false).break()\n          })\n          .code(_`${indices}[${item}] = ${i}`)\n      })\n    }\n\n    function loopN2(i: Name, j: Name): void {\n      const eql = useFunc(gen, equal)\n      const outer = gen.name(\"outer\")\n      gen.label(outer).for(_`;${i}--;`, () =>\n        gen.for(_`${j} = ${i}; ${j}--;`, () =>\n          gen.if(_`${eql}(${data}[${i}], ${data}[${j}])`, () => {\n            cxt.error()\n            gen.assign(valid, false).break(outer)\n          })\n        )\n      )\n    }\n  },\n}\n\nexport default def\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ajv\",\n  \"version\": \"8.18.0\",\n  \"description\": \"Another JSON Schema Validator\",\n  \"main\": \"dist/ajv.js\",\n  \"types\": \"dist/ajv.d.ts\",\n  \"files\": [\n    \"lib/\",\n    \"dist/\",\n    \".runkit_example.js\"\n  ],\n  \"sideEffects\": false,\n  \"scripts\": {\n    \"eslint\": \"eslint \\\"lib/**/*.ts\\\" \\\"spec/**/*.*s\\\" --ignore-pattern spec/JSON-Schema-Test-Suite\",\n    \"prettier:write\": \"prettier --write \\\"./**/*.{json,yaml,js,ts}\\\"\",\n    \"prettier:check\": \"prettier --list-different \\\"./**/*.{json,yaml,js,ts}\\\"\",\n    \"test-spec\": \"cross-env TS_NODE_PROJECT=spec/tsconfig.json mocha -r ts-node/register \\\"spec/**/*.spec.{ts,js}\\\" -R dot\",\n    \"test-codegen\": \"nyc cross-env TS_NODE_PROJECT=spec/tsconfig.json mocha -r ts-node/register 'spec/codegen.spec.ts' -R spec\",\n    \"test-debug\": \"npm run test-spec -- --inspect-brk\",\n    \"test-cov\": \"nyc npm run test-spec\",\n    \"rollup\": \"rm -rf bundle && rollup -c\",\n    \"bundle\": \"rm -rf bundle && node ./scripts/bundle.js ajv ajv7 ajv7 && node ./scripts/bundle.js 2019 ajv2019 ajv2019 && node ./scripts/bundle.js 2020 ajv2020 ajv2020 && node ./scripts/bundle.js jtd ajvJTD ajvJTD\",\n    \"build\": \"rm -rf dist && tsc && cp -r lib/refs dist && rm dist/refs/json-schema-2019-09/index.ts && rm dist/refs/json-schema-2020-12/index.ts && rm dist/refs/jtd-schema.ts\",\n    \"json-tests\": \"rm -rf spec/_json/*.js && node scripts/jsontests\",\n    \"test-karma\": \"karma start\",\n    \"test-browser\": \"rm -rf .browser && npm run bundle && scripts/prepare-tests && karma start\",\n    \"test-all\": \"npm run test-cov && if-node-version 12 npm run test-browser\",\n    \"test\": \"npm run json-tests && npm run prettier:check && npm run eslint && npm link && npm link --legacy-peer-deps ajv && npm run test-cov\",\n    \"test-ci\": \"AJV_FULL_TEST=true npm test\",\n    \"prepublish\": \"npm run build\",\n    \"benchmark\": \"npm i && npm run build && npm link && cd ./benchmark && npm link --legacy-peer-deps ajv && npm i && node ./jtd\",\n    \"docs:dev\": \"./scripts/prepare-site && vuepress dev docs\",\n    \"docs:build\": \"./scripts/prepare-site && vuepress build docs\"\n  },\n  \"nyc\": {\n    \"exclude\": [\n      \"**/spec/**\",\n      \"node_modules\"\n    ],\n    \"reporter\": [\n      \"lcov\",\n      \"text-summary\"\n    ]\n  },\n  \"repository\": \"ajv-validator/ajv\",\n  \"keywords\": [\n    \"JSON\",\n    \"schema\",\n    \"validator\",\n    \"validation\",\n    \"jsonschema\",\n    \"json-schema\",\n    \"json-schema-validator\",\n    \"json-schema-validation\"\n  ],\n  \"author\": \"Evgeny Poberezkin\",\n  \"license\": \"MIT\",\n  \"bugs\": \"https://github.com/ajv-validator/ajv/issues\",\n  \"homepage\": \"https://ajv.js.org\",\n  \"runkitExampleFilename\": \".runkit_example.js\",\n  \"dependencies\": {\n    \"fast-deep-equal\": \"^3.1.3\",\n    \"fast-uri\": \"^3.0.1\",\n    \"json-schema-traverse\": \"^1.0.0\",\n    \"require-from-string\": \"^2.0.2\"\n  },\n  \"devDependencies\": {\n    \"@ajv-validator/config\": \"^0.5.0\",\n    \"@rollup/plugin-commonjs\": \"^25.0.7\",\n    \"@rollup/plugin-json\": \"^6.1.0\",\n    \"@rollup/plugin-node-resolve\": \"^15.2.3\",\n    \"@rollup/plugin-typescript\": \"^11.1.6\",\n    \"@types/chai\": \"^4.3.11\",\n    \"@types/mocha\": \"^10.0.6\",\n    \"@types/node\": \"^20.11.30\",\n    \"@types/require-from-string\": \"^1.2.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^7.3.1\",\n    \"@typescript-eslint/parser\": \"^7.3.1\",\n    \"ajv-formats\": \"^3.0.1\",\n    \"browserify\": \"^17.0.0\",\n    \"chai\": \"^4.4.1\",\n    \"cross-env\": \"^7.0.3\",\n    \"dayjs\": \"^1.11.10\",\n    \"dayjs-plugin-utc\": \"^0.1.2\",\n    \"eslint\": \"^8.57.0\",\n    \"eslint-config-prettier\": \"^9.1.0\",\n    \"glob\": \"^10.3.10\",\n    \"husky\": \"^9.0.11\",\n    \"if-node-version\": \"^1.1.1\",\n    \"jimp\": \"^0.22.10\",\n    \"js-beautify\": \"^1.15.1\",\n    \"json-schema-test\": \"^2.0.0\",\n    \"karma\": \"^6.4.2\",\n    \"karma-chrome-launcher\": \"^3.2.0\",\n    \"karma-mocha\": \"^2.0.1\",\n    \"lint-staged\": \"^15.2.2\",\n    \"mocha\": \"^10.3.0\",\n    \"module-from-string\": \"^3.3.0\",\n    \"node-fetch\": \"^3.3.2\",\n    \"nyc\": \"^15.1.0\",\n    \"prettier\": \"3.0.3\",\n    \"re2\": \"^1.20.9\",\n    \"rollup\": \"^2.79.1\",\n    \"rollup-plugin-terser\": \"^7.0.2\",\n    \"ts-node\": \"^10.9.2\",\n    \"tsify\": \"^5.0.4\",\n    \"typescript\": \"5.3.3\",\n    \"uri-js\": \"^4.4.1\"\n  },\n  \"collective\": {\n    \"type\": \"opencollective\",\n    \"url\": \"https://opencollective.com/ajv\"\n  },\n  \"funding\": {\n    \"type\": \"github\",\n    \"url\": \"https://github.com/sponsors/epoberezkin\"\n  },\n  \"prettier\": \"@ajv-validator/config/prettierrc.json\",\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"lint-staged && npm test\"\n    }\n  },\n  \"lint-staged\": {\n    \"*.{json,yaml,js,ts}\": \"prettier --write\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import commonjs from \"@rollup/plugin-commonjs\"\nimport {nodeResolve} from \"@rollup/plugin-node-resolve\"\nimport json from \"@rollup/plugin-json\"\nimport typescript from \"@rollup/plugin-typescript\"\nimport {terser} from \"rollup-plugin-terser\"\n\nfunction createBundleConfig(sourceFile, outFile, globalName) {\n  return {\n    input: `./lib/${sourceFile}.ts`,\n    output: [\n      {\n        file: `./bundle/${outFile}.bundle.js`,\n        format: \"umd\",\n        name: globalName,\n      },\n      {\n        file: `./bundle/${outFile}.min.js`,\n        format: \"umd\",\n        name: globalName,\n        sourcemap: true,\n        plugins: [terser()],\n      },\n    ],\n    plugins: [commonjs(), nodeResolve(), json(), typescript()],\n  }\n}\n\nexport default [\n  createBundleConfig(\"ajv\", \"ajv7\", \"ajv7\"),\n  createBundleConfig(\"2019\", \"ajv2019\", \"ajv2019\"),\n  createBundleConfig(\"2020\", \"ajv2020\", \"ajv2020\"),\n  createBundleConfig(\"jtd\", \"ajvJTD\", \"ajvJTD\"),\n]\n"
  },
  {
    "path": "scripts/.eslintrc.yml",
    "content": "parserOptions:\n  sourceType: script\nrules:\n  no-console: 0\n  no-empty: [2, allowEmptyCatch: true]\n"
  },
  {
    "path": "scripts/bundle.js",
    "content": "\"use strict\"\n\nconst fs = require(\"fs\")\nconst path = require(\"path\")\nconst browserify = require(\"browserify\")\nconst {minify} = require(\"terser\")\n\nconst [sourceFile, outFile, globalName] = process.argv.slice(2)\n\nconst json = require(path.join(__dirname, \"..\", \"package.json\"))\nconst bundleDir = path.join(__dirname, \"..\", \"bundle\")\nif (!fs.existsSync(bundleDir)) fs.mkdirSync(bundleDir)\n\nbrowserify({standalone: globalName})\n  .require(path.join(__dirname, \"../dist\", sourceFile), {expose: sourceFile})\n  .bundle(saveAndMinify)\n\nasync function saveAndMinify(err, buf) {\n  if (err) {\n    console.error(\"browserify error:\", err)\n    process.exit(1)\n  }\n\n  const bundlePath = path.join(bundleDir, outFile)\n  const opts = {\n    ecma: 2018,\n    warnings: true,\n    compress: {\n      pure_getters: true,\n      keep_infinity: true,\n      unsafe_methods: true,\n    },\n    format: {\n      preamble: `/* ${json.name} ${json.version} (${globalName}): ${json.description} */`,\n    },\n    sourceMap: {\n      filename: outFile + \".min.js\",\n      url: outFile + \".min.js.map\",\n    },\n  }\n\n  const result = await minify(buf.toString(), opts)\n\n  fs.writeFileSync(bundlePath + \".bundle.js\", buf)\n  fs.writeFileSync(bundlePath + \".min.js\", result.code)\n  fs.writeFileSync(bundlePath + \".min.js.map\", result.map)\n  if (result.warnings) result.warnings.forEach((msg) => console.warn(\"terser.minify warning:\", msg))\n}\n"
  },
  {
    "path": "scripts/get-ajv-packages",
    "content": "#!/usr/bin/env bash\n\ndeclare -a packages=(\n  \"ajv-keywords\"\n  \"ajv-formats\"\n  \"ajv-cli\"\n  \"ajv-errors\"\n  \"ajv-i18n\"\n)\n\nfor package in \"${packages[@]}\"\ndo\n  echo \"downloading $package README...\"\n  echo \"---\" > docs/packages/$package.md\n  echo \"editLink: https://github.com/ajv-validator/$package/edit/master/README.md\" >> docs/packages/$package.md\n  echo \"---\" >> docs/packages/$package.md\n  echo \"[$package repository](https://github.com/ajv-validator/$package)\" >> docs/packages/$package.md\n  echo \"\" >> docs/packages/$package.md\n  curl -L https://raw.githubusercontent.com/ajv-validator/$package/master/README.md >> ./docs/packages/$package.md\ndone\n"
  },
  {
    "path": "scripts/get-contributors.js",
    "content": "// Credit for the script goes to svelte:\n// https://github.com/sveltejs/svelte/blob/ce3a5791258ec6ecf8c1ea022cb871afe805a45c/site/scripts/get-contributors.js\n\nconst fs = require(\"fs\")\nconst Jimp = require(\"jimp\")\n\nprocess.chdir(__dirname)\n\nconst base = `https://api.github.com/repos/ajv-validator/ajv/contributors`\nconst {GH_TOKEN_PUBLIC} = process.env\n\nconst SIZE = 64\n\nmain()\n\nasync function main() {\n  const fetch = (await import(\"node-fetch\")).default\n\n  const contributors = []\n  let page = 1\n\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    const res = await fetch(`${base}?per_page=100&page=${page++}`, {\n      headers: {Authorization: `token ${GH_TOKEN_PUBLIC}`},\n    })\n    const list = await res.json()\n    if (list.length === 0) break\n    contributors.push(...list)\n  }\n\n  const bots = [\"dependabot-preview[bot]\", \"greenkeeper[bot]\", \"greenkeeperio-bot\"]\n\n  const authors = contributors\n    .filter((a) => !bots.includes(a.login))\n    .sort((a, b) => b.contributions - a.contributions)\n\n  const sprite = new Jimp(SIZE * authors.length, SIZE)\n\n  for (let i = 0; i < authors.length; i += 1) {\n    const author = authors[i]\n    console.log(`${i + 1} / ${authors.length}: ${author.login}`)\n    const image_data = await fetch(author.avatar_url)\n    const buffer = await image_data.arrayBuffer()\n    const image = await Jimp.read(buffer)\n    image.resize(SIZE, SIZE)\n    sprite.composite(image, i * SIZE, 0)\n  }\n\n  await sprite.quality(80).write(`../docs/.vuepress/components/Contributors/contributors.jpg`)\n\n  const str = `[\\n  ${authors.map((a) => `\"${a.login}\"`).join(\",\\n  \")},\\n]\\n`\n\n  fs.writeFileSync(\n    `../docs/.vuepress/components/Contributors/_contributors.js`,\n    `module.exports = ${str}`\n  )\n}\n"
  },
  {
    "path": "scripts/jsontests.js",
    "content": "\"use strict\"\n\nconst testSuitePaths = {\n  draft6: \"spec/JSON-Schema-Test-Suite/tests/draft6/\",\n  draft7: \"spec/JSON-Schema-Test-Suite/tests/draft7/\",\n  draft2019: \"spec/JSON-Schema-Test-Suite/tests/draft2019-09/\",\n  draft2020: \"spec/JSON-Schema-Test-Suite/tests/draft2020-12/\",\n  tests: \"spec/tests/\",\n  security: \"spec/security/\",\n  extras: \"spec/extras/\",\n  async: \"spec/async/\",\n}\n\nconst glob = require(\"glob\")\nconst fs = require(\"fs\")\n\nfor (const suite in testSuitePaths) {\n  const p = testSuitePaths[suite]\n  const files = glob.sync(`${p}{**/,}*.json`)\n  if (files.length === 0) {\n    console.error(`Missing folder ${p}\\nTry: git submodule update --init\\n`)\n    process.exit(1)\n  }\n  const code = files\n    .map((f) => {\n      const name = f.replace(p, \"\").replace(/\\.json$/, \"\")\n      const testPath = f.replace(/^spec/, \"..\")\n      return `\\n  {name: \"${name}\", test: require(\"${testPath}\")},`\n    })\n    .reduce((list, f) => list + f)\n  fs.writeFileSync(`./spec/_json/${suite}.js`, `module.exports = [${code}\\n]\\n`)\n}\n"
  },
  {
    "path": "scripts/prepare-site",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nfunction copyReplace {\n  sed \"s/](.\\/docs\\//](.\\//g\" $1 > $2\n}\n\ncopyReplace CODE_OF_CONDUCT.md docs/code_of_conduct.md\ncopyReplace CONTRIBUTING.md docs/contributing.md\ncopyReplace LICENSE docs/license.md\n\necho \"preparing contributors...\"\nnode scripts/get-contributors.js\n\necho \"preparing packages...\"\n./scripts/get-ajv-packages\n"
  },
  {
    "path": "scripts/prepare-tests",
    "content": "#!/usr/bin/env sh\n\nset -e\n\nmkdir -p .browser\n\necho\necho Preparing browser tests:\n\nfind spec -type f -name '*.spec.*s' | \\\nxargs -I {} sh -c \\\n'export f=\"{}\"; echo $f; ./node_modules/.bin/browserify $f -p [ tsify -p ./spec/tsconfig.json ] -x ajv -u buffer -o $(echo $f | sed -e \"s/spec/.browser/\" | sed -e \"s/.spec.ts/.spec.js/\");'\n"
  },
  {
    "path": "scripts/publish-bundles",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nif [[ $GITHUB_REF == refs/tags/v* ]]; then\n  npm run bundle\n\n  echo \"About to publish $GITHUB_REF to ajv-dist...\"\n\n  git config --global user.name \"$GIT_USER_NAME\"\n  git config --global user.email \"$GIT_USER_EMAIL\"\n\n  git clone https://\"${GH_TOKEN_PUBLIC}\"@github.com/ajv-validator/ajv-dist.git ../ajv-dist\n\n  rm -rf ../ajv-dist/dist\n  mkdir ../ajv-dist/dist\n  cp ./bundle/*.* ../ajv-dist/dist\n  cd ../ajv-dist\n\n  VERSION=${GITHUB_REF#refs/tags/v}\n\n  sed -E \"s/\\\"version\\\": \\\"([^\\\"]*)\\\"/\\\"version\\\": \\\"$VERSION\\\"/\" package.json > new_package.json\n  mv new_package.json package.json\n\n  if [[ $(git status --porcelain) ]]; then\n    echo \"Changes detected. Updating master branch...\"\n    git add -A\n    git commit -m \"$VERSION: updated by ajv workflow https://github.com/ajv-validator/ajv/actions/runs/$GITHUB_RUN_ID\"\n    git push --quiet origin master > /dev/null 2>&1\n  fi\n\n  echo \"Publishing tag...\"\n  git tag \"v$VERSION\"\n  git push --tags > /dev/null 2>&1\n\n  echo \"Done\"\nfi\n"
  },
  {
    "path": "scripts/publish-site",
    "content": "#!/usr/bin/env bash\n\nset -ex\n\necho \"About to publish $GITHUB_REF to gh-pages...\"\nrm -rf ../gh-pages\n\nnpm install vuepress@1\nnpm install @vuepress/shared-utils@1\nnpm run docs:build\n\ngit config --global user.name \"$GIT_USER_NAME\"\ngit config --global user.email \"$GIT_USER_EMAIL\"\ngit clone -b gh-pages --single-branch https://\"${GH_TOKEN_PUBLIC}\"@github.com/ajv-validator/ajv.git ../gh-pages\n\nrsync -a ./docs/.vuepress/dist/ ../gh-pages\n\ncd ../gh-pages\n\nif [[ $(git status --porcelain) ]]; then\n  echo \"Changes detected. Updating gh-pages branch...\"\n  git add -A\n  git commit -m \"updated by ajv workflow https://github.com/ajv-validator/ajv/actions/runs/$GITHUB_RUN_ID\"\n  git push --quiet origin gh-pages > /dev/null 2>&1\nfi\n\necho \"Done\"\n"
  },
  {
    "path": "spec/.eslintrc.yml",
    "content": "env:\n  browser: true,\nrules:\n  no-console: off\n  no-invalid-this: off\nglobals:\n  describe: false\n  it: false\n  before: false\n  beforeEach: false\n  afterEach: false\noverrides:\n  - files: [\"*.ts\"]\n    parserOptions:\n      project: [\"./spec/tsconfig.json\"]\n    rules:\n      \"@typescript-eslint/explicit-function-return-type\": off\n      \"@typescript-eslint/explicit-member-accessibility\": off\n      \"@typescript-eslint/restrict-plus-operands\": off\n      \"@typescript-eslint/no-explicit-any\": off\n      \"@typescript-eslint/no-unsafe-assignment\": off\n      \"@typescript-eslint/no-unsafe-call\": off\n      \"@typescript-eslint/no-unsafe-member-access\": off\n      \"@typescript-eslint/no-unsafe-return\": off\n      \"@typescript-eslint/no-var-requires\": off\n      \"@typescript-eslint/ban-ts-comment\": off\n"
  },
  {
    "path": "spec/_json/README.md",
    "content": "# Test suites from JSON tests\n\nThese files are generated automatically during the test.\n"
  },
  {
    "path": "spec/after_test.ts",
    "content": "import type Ajv from \"..\"\nimport type {AnySchema, ErrorObject} from \"..\"\nimport chai from \"./chai\"\nconst should = chai.should()\n\ninterface TestResult {\n  validator: Ajv\n  schema: AnySchema\n  data: unknown\n  valid: boolean\n  expected: boolean\n  errors: ErrorObject[] | null\n  passed: boolean // true if valid == expected\n}\n\nexport function afterError(res: TestResult): void {\n  console.log(\"ajv options:\", res.validator.opts)\n}\n\nexport function afterEach(res: TestResult): void {\n  // console.log(res.errors);\n  res.valid.should.be.a(\"boolean\")\n  if (res.valid === true) {\n    should.equal(res.errors, null)\n  } else {\n    const errs = res.errors as ErrorObject[]\n    errs.should.be.an(\"array\")\n    for (const err of errs) {\n      err.should.be.an(\"object\")\n    }\n  }\n}\n"
  },
  {
    "path": "spec/ajv.spec.ts",
    "content": "import type Ajv from \"..\"\nimport type {KeywordCxt, SchemaObject} from \"..\"\nimport _Ajv from \"./ajv\"\nimport {_} from \"../dist/compile/codegen/code\"\nimport assert = require(\"assert\")\nimport chai from \"./chai\"\nconst should = chai.should()\n\ndescribe(\"Ajv\", () => {\n  let ajv: Ajv\n\n  beforeEach(() => {\n    ajv = new _Ajv({keywords: [\"foo\"], allowUnionTypes: true})\n  })\n\n  it(\"should create instance\", () => {\n    ajv.should.be.instanceof(_Ajv)\n  })\n\n  describe(\"compile method\", () => {\n    it(\"should compile schema and return validating function\", () => {\n      const validate = ajv.compile({type: \"integer\"})\n      validate.should.be.a(\"function\")\n      validate(1).should.equal(true)\n      validate(1.1).should.equal(false)\n      validate(\"1\").should.equal(false)\n    })\n\n    it(\"should cache compiled functions for the same schema\", () => {\n      const schema = {\n        $id: \"//e.com/int.json\",\n        type: \"integer\",\n        minimum: 1,\n      }\n      const v1 = ajv.compile(schema)\n      const v2 = ajv.compile(schema)\n      v1.should.equal(v2)\n    })\n\n    it(\"should throw if different schema has the same id\", () => {\n      ajv.compile({$id: \"//e.com/int.json\", type: \"integer\"})\n      should.throw(() => {\n        ajv.compile({$id: \"//e.com/int.json\", type: \"integer\", minimum: 1})\n      }, /already exists/)\n    })\n\n    it(\"should throw if invalid schema is compiled\", () => {\n      should.throw(() => {\n        ajv.compile({type: null})\n      }, /must be equal to one of the allowed values/)\n    })\n\n    it(\"should throw if compiled schema has an invalid JavaScript code\", () => {\n      const _ajv = new _Ajv({logger: false})\n      _ajv.addKeyword({keyword: \"even\", code: badEvenCode})\n      let schema = {even: true}\n      const validate: any = _ajv.compile(schema)\n      validate(2).should.equal(true)\n      validate(3).should.equal(false)\n\n      schema = {even: false}\n      should.throw(() => {\n        _ajv.compile(schema)\n      }, /Unexpected token/)\n\n      function badEvenCode(cxt: KeywordCxt) {\n        const op = cxt.schema ? _`===` : _`!===` // invalid on purpose\n        cxt.pass(_`${cxt.data} % 2 ${op} 0`)\n      }\n    })\n  })\n\n  describe(\"validate method\", () => {\n    it(\"should compile schema and validate data against it\", () => {\n      ajv.validate({type: \"integer\"}, 1).should.equal(true)\n      ajv.validate({type: \"integer\"}, \"1\").should.equal(false)\n      ajv.validate({type: \"string\"}, \"a\").should.equal(true)\n      ajv.validate({type: \"string\"}, 1).should.equal(false)\n    })\n\n    it(\"should validate against previously compiled schema by id (also see addSchema)\", () => {\n      ajv.validate({$id: \"//e.com/int.json\", type: \"integer\"}, 1).should.equal(true)\n      ajv.validate(\"//e.com/int.json\", 1).should.equal(true)\n      ajv.validate(\"//e.com/int.json\", \"1\").should.equal(false)\n\n      ajv.compile({$id: \"//e.com/str.json\", type: \"string\"}).should.be.a(\"function\")\n      ajv.validate(\"//e.com/str.json\", \"a\").should.equal(true)\n      ajv.validate(\"//e.com/str.json\", 1).should.equal(false)\n    })\n\n    it(\"should throw exception if no schema with ref\", () => {\n      ajv.validate({$id: \"integer\", type: \"integer\"}, 1).should.equal(true)\n      ajv.validate(\"integer\", 1).should.equal(true)\n      should.throw(() => {\n        ajv.validate(\"string\", \"foo\")\n      }, /no schema with key or ref/)\n    })\n\n    it(\"should validate schema fragment by ref\", () => {\n      ajv.addSchema({\n        $id: \"http://e.com/types.json\",\n        definitions: {\n          int: {type: \"integer\"},\n          str: {type: \"string\"},\n        },\n      })\n\n      ajv.validate(\"http://e.com/types.json#/definitions/int\", 1).should.equal(true)\n      ajv.validate(\"http://e.com/types.json#/definitions/int\", \"1\").should.equal(false)\n    })\n\n    it(\"should return schema fragment by id\", () => {\n      ajv.addSchema({\n        $id: \"http://e.com/types.json\",\n        definitions: {\n          int: {$id: \"#int\", type: \"integer\"},\n          str: {$id: \"#str\", type: \"string\"},\n        },\n      })\n\n      ajv.validate(\"http://e.com/types.json#int\", 1).should.equal(true)\n      ajv.validate(\"http://e.com/types.json#int\", \"1\").should.equal(false)\n    })\n  })\n\n  describe(\"addSchema method\", () => {\n    it(\"should add and compile schema with key\", () => {\n      ajv.addSchema({type: \"integer\"}, \"int\")\n      const validate = ajv.getSchema(\"int\")\n      assert(typeof validate == \"function\")\n\n      validate(1).should.equal(true)\n      validate(1.1).should.equal(false)\n      validate(\"1\").should.equal(false)\n      ajv.validate(\"int\", 1).should.equal(true)\n      ajv.validate(\"int\", \"1\").should.equal(false)\n    })\n\n    it(\"should add and compile schema without key\", () => {\n      ajv.addSchema({type: \"integer\"})\n      ajv.validate(\"\", 1).should.equal(true)\n      ajv.validate(\"\", \"1\").should.equal(false)\n    })\n\n    it(\"should add and compile schema with id\", () => {\n      ajv.addSchema({$id: \"//e.com/int.json\", type: \"integer\"})\n      ajv.validate(\"//e.com/int.json\", 1).should.equal(true)\n      ajv.validate(\"//e.com/int.json\", \"1\").should.equal(false)\n    })\n\n    it(\"should normalize schema keys and ids\", () => {\n      ajv.addSchema({$id: \"//e.com/int.json#\", type: \"integer\"}, \"int#\")\n      ajv.validate(\"int\", 1).should.equal(true)\n      ajv.validate(\"int\", \"1\").should.equal(false)\n      ajv.validate(\"//e.com/int.json\", 1).should.equal(true)\n      ajv.validate(\"//e.com/int.json\", \"1\").should.equal(false)\n      ajv.validate(\"int#/\", 1).should.equal(true)\n      ajv.validate(\"int#/\", \"1\").should.equal(false)\n      ajv.validate(\"//e.com/int.json#/\", 1).should.equal(true)\n      ajv.validate(\"//e.com/int.json#/\", \"1\").should.equal(false)\n    })\n\n    it(\"should add and compile array of schemas with ids\", () => {\n      ajv.addSchema([\n        {$id: \"//e.com/int.json\", type: \"integer\"},\n        {$id: \"//e.com/str.json\", type: \"string\"},\n      ])\n\n      const validate0 = ajv.getSchema(\"//e.com/int.json\")\n      const validate1 = ajv.getSchema(\"//e.com/str.json\")\n      assert(typeof validate0 == \"function\")\n      assert(typeof validate1 == \"function\")\n\n      validate0(1).should.equal(true)\n      validate0(\"1\").should.equal(false)\n      validate1(\"a\").should.equal(true)\n      validate1(1).should.equal(false)\n\n      ajv.validate(\"//e.com/int.json\", 1).should.equal(true)\n      ajv.validate(\"//e.com/int.json\", \"1\").should.equal(false)\n      ajv.validate(\"//e.com/str.json\", \"a\").should.equal(true)\n      ajv.validate(\"//e.com/str.json\", 1).should.equal(false)\n    })\n\n    it(\"should throw on duplicate key\", () => {\n      ajv.addSchema({type: \"integer\"}, \"int\")\n      should.throw(() => {\n        ajv.addSchema({type: \"integer\", minimum: 1}, \"int\")\n      }, /already exists/)\n    })\n\n    it(\"should throw on duplicate normalized key\", () => {\n      ajv.addSchema({type: \"number\"}, \"num\")\n      should.throw(() => {\n        ajv.addSchema({type: \"integer\"}, \"num#\")\n      }, /already exists/)\n      should.throw(() => {\n        ajv.addSchema({type: \"integer\"}, \"num#/\")\n      }, /already exists/)\n    })\n\n    it(\"should allow only one schema without key and id\", () => {\n      ajv.addSchema({type: \"number\"})\n      should.throw(() => {\n        ajv.addSchema({type: \"integer\"})\n      }, /already exists/)\n      should.throw(() => {\n        ajv.addSchema({type: \"integer\"}, \"\")\n      }, /already exists/)\n      should.throw(() => {\n        ajv.addSchema({type: \"integer\"}, \"#\")\n      }, /already exists/)\n    })\n\n    it(\"should throw if schema is not an object\", () => {\n      should.throw(() => {\n        // @ts-expect-error\n        ajv.addSchema(\"foo\")\n      }, /schema must be object or boolean/)\n    })\n\n    it(\"should throw if schema id is not a string\", () => {\n      try {\n        // @ts-expect-error\n        ajv.addSchema({$id: 1, type: \"integer\"})\n        throw new Error(\"should have throw exception\")\n      } catch (e) {\n        ;(e as Error).message.should.equal(\"schema $id must be string\")\n      }\n    })\n\n    it(\"should return instance of itself\", () => {\n      const res = ajv.addSchema({type: \"integer\"}, \"int\")\n      res.should.equal(ajv)\n    })\n  })\n\n  describe(\"getSchema method\", () => {\n    it(\"should return compiled schema by key\", () => {\n      ajv.addSchema({type: \"integer\"}, \"int\")\n      const validate = ajv.getSchema(\"int\")\n      assert(typeof validate == \"function\")\n      validate(1).should.equal(true)\n      validate(\"1\").should.equal(false)\n    })\n\n    it(\"should return compiled schema by id or ref\", () => {\n      ajv.addSchema({$id: \"//e.com/int.json\", type: \"integer\"})\n      const validate = ajv.getSchema(\"//e.com/int.json\")\n      assert(typeof validate == \"function\")\n      validate(1).should.equal(true)\n      validate(\"1\").should.equal(false)\n    })\n\n    it(\"should return compiled schema without key or with empty key\", () => {\n      ajv.addSchema({type: \"integer\"})\n      const validate = ajv.getSchema(\"\")\n      assert(typeof validate == \"function\")\n      validate(1).should.equal(true)\n      validate(\"1\").should.equal(false)\n    })\n\n    it(\"should return schema fragment by ref\", () => {\n      ajv.addSchema({\n        $id: \"http://e.com/types.json\",\n        definitions: {\n          int: {type: \"integer\"},\n          str: {type: \"string\"},\n        },\n      })\n\n      const vInt = ajv.getSchema(\"http://e.com/types.json#/definitions/int\")\n      assert(typeof vInt == \"function\")\n      vInt(1).should.equal(true)\n      vInt(\"1\").should.equal(false)\n    })\n\n    it(\"should return schema fragment by ref with protocol-relative URIs\", () => {\n      ajv.addSchema({\n        $id: \"//e.com/types.json\",\n        definitions: {\n          int: {type: \"integer\"},\n          str: {type: \"string\"},\n        },\n      })\n\n      const vInt = ajv.getSchema(\"//e.com/types.json#/definitions/int\")\n      assert(typeof vInt == \"function\")\n      vInt(1).should.equal(true)\n      vInt(\"1\").should.equal(false)\n    })\n\n    it(\"should return schema fragment by id\", () => {\n      ajv.addSchema({\n        $id: \"http://e.com/types.json\",\n        definitions: {\n          int: {$id: \"#int\", type: \"integer\"},\n          str: {$id: \"#str\", type: \"string\"},\n        },\n      })\n\n      const vInt = ajv.getSchema(\"http://e.com/types.json#int\")\n      assert(typeof vInt == \"function\")\n      vInt(1).should.equal(true)\n      vInt(\"1\").should.equal(false)\n    })\n  })\n\n  describe(\"removeSchema method\", () => {\n    it(\"should remove schema by key\", () => {\n      const schema = {type: \"integer\"}\n      ajv.addSchema(schema, \"int\")\n      const v = ajv.getSchema(\"int\")\n      assert(typeof v == \"function\")\n      v.should.be.a(\"function\")\n      //@ts-expect-error\n      ajv._cache.get(schema).validate.should.equal(v)\n\n      ajv.removeSchema(\"int\")\n      should.not.exist(ajv.getSchema(\"int\"))\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema))\n    })\n\n    it(\"should remove schema by id\", () => {\n      const schema = {$id: \"//e.com/int.json\", type: \"integer\"}\n      ajv.addSchema(schema)\n\n      const v = ajv.getSchema(\"//e.com/int.json\")\n      assert(typeof v == \"function\")\n      v.should.be.a(\"function\")\n      //@ts-expect-error\n      ajv._cache.get(schema).validate.should.equal(v)\n\n      ajv.removeSchema(\"//e.com/int.json\")\n      should.not.exist(ajv.getSchema(\"//e.com/int.json\"))\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema))\n    })\n\n    it(\"should remove schema by schema object\", () => {\n      const schema = {type: \"integer\"}\n      ajv.addSchema(schema)\n      //@ts-expect-error\n      ajv._cache.get(schema).should.be.an(\"object\")\n      ajv.removeSchema(schema)\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema))\n    })\n\n    it(\"should remove schema with id by schema object\", () => {\n      const schema = {$id: \"//e.com/int.json\", type: \"integer\"}\n      ajv.addSchema(schema)\n      //@ts-expect-error\n      ajv._cache.get(schema).should.be.an(\"object\")\n      ajv.removeSchema(schema)\n      should.not.exist(ajv.getSchema(\"//e.com/int.json\"))\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema))\n    })\n\n    it(\"should not throw if there is no schema with passed id\", () => {\n      should.not.exist(ajv.getSchema(\"//e.com/int.json\"))\n      should.not.throw(() => {\n        ajv.removeSchema(\"//e.com/int.json\")\n      })\n    })\n\n    it(\"should remove all schemas but meta-schemas if called without an arguments\", () => {\n      const schema1 = {$id: \"//e.com/int.json\", type: \"integer\"}\n      ajv.addSchema(schema1)\n      //@ts-expect-error\n      ajv._cache.get(schema1).should.be.an(\"object\")\n\n      const schema2 = {type: \"integer\"}\n      ajv.addSchema(schema2)\n      //@ts-expect-error\n      ajv._cache.get(schema2).should.be.an(\"object\")\n\n      ajv.removeSchema()\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema1))\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema2))\n    })\n\n    it(\"should remove all schemas but meta-schemas with key/id matching pattern\", () => {\n      const schema1 = {$id: \"//e.com/int.json\", type: \"integer\"}\n      ajv.addSchema(schema1)\n      //@ts-expect-error\n      ajv._cache.get(schema1).should.be.an(\"object\")\n\n      const schema2 = {$id: \"str.json\", type: \"string\"}\n      ajv.addSchema(schema2, \"//e.com/str.json\")\n      //@ts-expect-error\n      ajv._cache.get(schema2).should.be.an(\"object\")\n\n      const schema3 = {type: \"integer\"}\n      ajv.addSchema(schema3)\n      //@ts-expect-error\n      ajv._cache.get(schema3).should.be.an(\"object\")\n\n      ajv.removeSchema(/e\\.com/)\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema1))\n      //@ts-expect-error\n      should.not.exist(ajv._cache.get(schema2))\n      //@ts-expect-error\n      ajv._cache.get(schema3).should.be.an(\"object\")\n    })\n\n    it(\"should return instance of itself\", () => {\n      const res = ajv.addSchema({type: \"integer\"}, \"int\").removeSchema(\"int\")\n      res.should.equal(ajv)\n    })\n  })\n\n  describe(\"addFormat method\", () => {\n    it(\"should add format as regular expression\", () => {\n      ajv.addFormat(\"identifier\", /^[a-z_$][a-z0-9_$]*$/i)\n      testFormat()\n    })\n\n    it(\"should add format as string\", () => {\n      ajv.addFormat(\"identifier\", \"^[A-Za-z_$][A-Za-z0-9_$]*$\")\n      testFormat()\n    })\n\n    it(\"should add format as function\", () => {\n      ajv.addFormat(\"identifier\", (str) => /^[a-z_$][a-z0-9_$]*$/i.test(str))\n      testFormat()\n    })\n\n    it(\"should add format as object\", () => {\n      ajv.addFormat(\"identifier\", {\n        validate: (str: string) => /^[a-z_$][a-z0-9_$]*$/i.test(str),\n      })\n      testFormat()\n    })\n\n    it(\"should return instance of itself\", () => {\n      const res = ajv.addFormat(\"identifier\", /^[a-z_$][a-z0-9_$]*$/i)\n      res.should.equal(ajv)\n    })\n\n    function testFormat() {\n      const validate = ajv.compile({\n        type: [\"number\", \"string\"],\n        format: \"identifier\",\n      })\n      validate(\"Abc1\").should.equal(true)\n      validate(\"123\").should.equal(false)\n      validate(123).should.equal(true)\n    }\n\n    describe(\"formats for number\", () => {\n      it(\"should validate only numbers\", () => {\n        ajv.addFormat(\"positive\", {\n          type: \"number\",\n          validate: function (x: number) {\n            return x > 0\n          },\n        })\n\n        const validate = ajv.compile({\n          type: [\"string\", \"number\"],\n          format: \"positive\",\n        })\n        validate(-2).should.equal(false)\n        validate(0).should.equal(false)\n        validate(2).should.equal(true)\n        validate(\"abc\").should.equal(true)\n      })\n\n      it(\"should validate numbers with format via $data\", () => {\n        ajv = new _Ajv({$data: true, allowUnionTypes: true})\n        ajv.addFormat(\"positive\", {\n          type: \"number\",\n          validate: function (x: number) {\n            return x > 0\n          },\n        })\n\n        const validate = ajv.compile({\n          type: \"object\",\n          properties: {\n            data: {\n              type: [\"number\", \"string\"],\n              format: {$data: \"1/frmt\"},\n            },\n            frmt: {type: \"string\"},\n          },\n        })\n        validate({data: -2, frmt: \"positive\"}).should.equal(false)\n        validate({data: 0, frmt: \"positive\"}).should.equal(false)\n        validate({data: 2, frmt: \"positive\"}).should.equal(true)\n        validate({data: \"abc\", frmt: \"positive\"}).should.equal(true)\n      })\n    })\n  })\n\n  describe(\"validateSchema method\", () => {\n    it(\"should validate schema against meta-schema\", () => {\n      let valid = ajv.validateSchema({\n        $schema: \"http://json-schema.org/draft-07/schema#\",\n        type: \"number\",\n      })\n\n      valid.should.equal(true)\n      should.equal(ajv.errors, null)\n\n      valid = ajv.validateSchema({\n        $schema: \"http://json-schema.org/draft-07/schema#\",\n        type: \"wrong_type\",\n      })\n\n      valid.should.equal(false)\n      assert(Array.isArray(ajv.errors))\n      ajv.errors.length.should.equal(3)\n      ajv.errors[0].keyword.should.equal(\"enum\")\n      ajv.errors[1].keyword.should.equal(\"type\")\n      ajv.errors[2].keyword.should.equal(\"anyOf\")\n    })\n\n    it(\"should throw exception if meta-schema is unknown\", () => {\n      should.throw(() => {\n        ajv.validateSchema({\n          $schema: \"http://example.com/unknown/schema#\",\n          type: \"number\",\n        })\n      }, /no schema with key or ref/)\n    })\n\n    it(\"should throw exception if $schema is not a string\", () => {\n      should.throw(() => {\n        ajv.validateSchema({\n          //@ts-expect-error\n          $schema: {},\n          type: \"number\",\n        })\n      }, /\\$schema must be a string/)\n    })\n\n    describe(\"sub-schema validation outside of definitions during compilation\", () => {\n      it(\"maximum\", () => {\n        passValidationThrowCompile({\n          $ref: \"#/foo\",\n          foo: {type: \"number\", maximum: \"bar\"},\n        })\n      })\n\n      it(\"exclusiveMaximum\", () => {\n        passValidationThrowCompile({\n          $ref: \"#/foo\",\n          foo: {type: \"number\", exclusiveMaximum: \"bar\"},\n        })\n      })\n\n      it(\"maxItems\", () => {\n        passValidationThrowCompile({\n          $ref: \"#/foo\",\n          foo: {type: \"array\", maxItems: \"bar\"},\n        })\n      })\n\n      it(\"maxLength\", () => {\n        passValidationThrowCompile({\n          $ref: \"#/foo\",\n          foo: {type: \"string\", maxLength: \"bar\"},\n        })\n      })\n\n      it(\"maxProperties\", () => {\n        passValidationThrowCompile({\n          $ref: \"#/foo\",\n          foo: {type: \"object\", maxProperties: \"bar\"},\n        })\n      })\n\n      it(\"multipleOf\", () => {\n        passValidationThrowCompile({\n          $ref: \"#/foo\",\n          foo: {type: \"number\", multipleOf: \"bar\"},\n        })\n      })\n\n      function passValidationThrowCompile(schema: SchemaObject) {\n        ajv.validateSchema(schema).should.equal(true)\n        should.throw(() => {\n          ajv.compile(schema)\n        }, /value must be/)\n      }\n    })\n  })\n})\n"
  },
  {
    "path": "spec/ajv.ts",
    "content": "import type Ajv from \"../dist/core\"\nconst AjvClass: typeof Ajv = typeof window == \"object\" ? (window as any).ajv7 : require(\"\" + \"..\")\n\nexport default AjvClass\nmodule.exports = AjvClass\nmodule.exports.default = AjvClass\n"
  },
  {
    "path": "spec/ajv2019.ts",
    "content": "import type Ajv2019 from \"../dist/2019\"\nconst AjvClass: typeof Ajv2019 =\n  typeof window == \"object\" ? (window as any).ajv2019 : require(\"\" + \"../dist/2019\")\n\nexport default AjvClass\nmodule.exports = AjvClass\nmodule.exports.default = AjvClass\n"
  },
  {
    "path": "spec/ajv2020.ts",
    "content": "import type Ajv2020 from \"../dist/2019\"\nconst AjvClass: typeof Ajv2020 =\n  typeof window == \"object\" ? (window as any).ajv2020 : require(\"\" + \"../dist/2020\")\n\nexport default AjvClass\nmodule.exports = AjvClass\nmodule.exports.default = AjvClass\n"
  },
  {
    "path": "spec/ajv_all_instances.ts",
    "content": "import type AjvCore from \"../dist/core\"\nimport type {Options} from \"..\"\nimport _Ajv from \"./ajv\"\nimport _Ajv2019 from \"./ajv2019\"\nimport getAjvInstances from \"./ajv_instances\"\n\nexport default function getAjvAllInstances(options: Options, extraOpts: Options = {}): AjvCore[] {\n  return [...getAjvs(_Ajv), ...getAjvs(_Ajv2019)]\n\n  function getAjvs(Ajv: typeof AjvCore): AjvCore[] {\n    return getAjvInstances(Ajv, options, extraOpts)\n  }\n}\n"
  },
  {
    "path": "spec/ajv_async_instances.ts",
    "content": "import getAjvInstances from \"./ajv_instances\"\nimport _Ajv from \"./ajv\"\nimport type AjvCore from \"../dist/core\"\nimport type {Options} from \"..\"\n\nexport default function getAjvSyncInstances(extraOpts?: Options): AjvCore[] {\n  return getAjvInstances(\n    _Ajv,\n    {\n      strict: false,\n      allErrors: true,\n      code: {lines: true, optimize: false},\n    },\n    extraOpts\n  )\n}\n"
  },
  {
    "path": "spec/ajv_instances.ts",
    "content": "import type AjvCore from \"../dist/core\"\nimport type {Options} from \"..\"\n\nexport default function getAjvInstances(\n  _Ajv: typeof AjvCore,\n  options: Options,\n  extraOpts: Options = {}\n): AjvCore[] {\n  return _getAjvInstances(options, {...extraOpts, logger: false})\n\n  function _getAjvInstances(opts: Options, useOpts: Options): AjvCore[] {\n    const optNames = Object.keys(opts)\n    if (optNames.length) {\n      opts = Object.assign({}, opts)\n      const useOpts1 = Object.assign({}, useOpts)\n      const optName = optNames[0]\n      useOpts1[optName] = opts[optName]\n      delete opts[optName]\n      return [..._getAjvInstances(opts, useOpts), ..._getAjvInstances(opts, useOpts1)]\n    }\n    return [new _Ajv(useOpts)]\n  }\n}\n"
  },
  {
    "path": "spec/ajv_jtd.ts",
    "content": "import type AjvJTD from \"../dist/jtd\"\nconst AjvClass: typeof AjvJTD =\n  typeof window == \"object\" ? (window as any).ajvJTD : require(\"\" + \"../dist/jtd\")\n\nexport default AjvClass\nmodule.exports = AjvClass\nmodule.exports.default = AjvClass\n"
  },
  {
    "path": "spec/ajv_options.ts",
    "content": "import type {Options} from \"..\"\n\nconst isBrowser = typeof window == \"object\"\nconst fullTest = !isBrowser && process.env.AJV_FULL_TEST\n\nconst codeOptions = {es5: true, lines: true, optimize: false}\n\nconst options: Options = fullTest\n  ? {\n      allErrors: true,\n      verbose: true,\n      inlineRefs: false,\n      code: codeOptions,\n    }\n  : {allErrors: true, code: codeOptions}\n\nexport default options\n"
  },
  {
    "path": "spec/ajv_standalone.ts",
    "content": "import type AjvCore from \"../dist/core\"\nimport type {Options} from \"..\"\nimport AjvPack from \"../dist/standalone/instance\"\n\nexport function withStandalone(instances: AjvCore[]): (AjvCore | AjvPack)[] {\n  return [...(instances as (AjvCore | AjvPack)[]), ...instances.map(makeStandalone)]\n}\n\nfunction makeStandalone(ajv: AjvCore): AjvPack {\n  ajv.opts.code.source = true\n  return new AjvPack(ajv)\n}\n\nexport function getStandalone(_Ajv: typeof AjvCore, opts: Options = {}): AjvPack {\n  opts.code ||= {}\n  opts.code.source = true\n  return new AjvPack(new _Ajv(opts))\n}\n"
  },
  {
    "path": "spec/async/boolean.json",
    "content": "[\n  {\n    \"description\": \"boolean schema = true in properties\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"foo\": true\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"any data is valid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"boolean schema = false in properties\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"foo\": false\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"any property is invalid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": false\n      },\n      {\n        \"description\": \"without property is valid\",\n        \"data\": {\"bar\": 1},\n        \"valid\": true\n      },\n      {\n        \"description\": \"empty object is valid\",\n        \"data\": {},\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"boolean schema = true in $ref\",\n    \"schema\": {\n      \"$async\": true,\n      \"$ref\": \"#/definitions/true\",\n      \"definitions\": {\n        \"true\": true\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"any data is valid\",\n        \"data\": 1,\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"boolean schema = false in $ref\",\n    \"schema\": {\n      \"$async\": true,\n      \"$ref\": \"#/definitions/false\",\n      \"definitions\": {\n        \"false\": false\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"any data is invalid\",\n        \"data\": 1,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"boolean schema = true in properties with $ref\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"foo\": {\"$ref\": \"#/definitions/foo\"}\n      },\n      \"definitions\": {\n        \"foo\": true\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"any data is valid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"boolean schema = false in properties with $ref\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"foo\": {\"$ref\": \"#/definitions/foo\"}\n      },\n      \"definitions\": {\n        \"foo\": false\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"any property is invalid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": false\n      },\n      {\n        \"description\": \"without property is valid\",\n        \"data\": {\"bar\": 1},\n        \"valid\": true\n      },\n      {\n        \"description\": \"empty object is valid\",\n        \"data\": {},\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/async/compound.json",
    "content": "[\n  {\n    \"description\": \"allOf: async + sync\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"integer\",\n      \"allOf\": [\n        {\n          \"idExists\": {\"table\": \"users\"}\n        },\n        {\n          \"minimum\": 3\n        }\n      ]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid id\",\n        \"data\": 5,\n        \"valid\": true\n      },\n      {\n        \"description\": \"another valid id\",\n        \"data\": 8,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid async - not user id\",\n        \"data\": 9,\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid sync - valid id but too small\",\n        \"data\": 1,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"anyOf: async + sync\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"integer\",\n      \"anyOf\": [\n        {\n          \"idExists\": {\"table\": \"users\"}\n        },\n        {\n          \"minimum\": 3\n        }\n      ]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid id\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid - not id but big enough\",\n        \"data\": 4,\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid - id and big enough\",\n        \"data\": 5,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid both\",\n        \"data\": 2,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"oneOf: async + sync\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"integer\",\n      \"oneOf\": [\n        {\n          \"idExists\": {\"table\": \"users\"}\n        },\n        {\n          \"minimum\": 3\n        }\n      ]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid id\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid - not id but big enough\",\n        \"data\": 4,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid - id and big enough\",\n        \"data\": 5,\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid both\",\n        \"data\": 2,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"not with async\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"integer\",\n      \"not\": {\n        \"idExists\": {\"table\": \"users\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"invalid because valid id\",\n        \"data\": 1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid because not a valid id\",\n        \"data\": 4,\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/async/format.json",
    "content": "[\n  {\n    \"description\": \"async user-defined formats\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"string\",\n      \"format\": \"english_word\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"'tomorrow' is a valid english word\",\n        \"data\": \"tomorrow\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"'manana' is an invalid english word\",\n        \"data\": \"manana\",\n        \"valid\": false\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": 1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"'today' throws an exception, not in the dictionary\",\n        \"data\": \"today\",\n        \"error\": \"unknown word\"\n      }\n    ]\n  },\n  {\n    \"description\": \"async formats when $data ref resolves to async format name\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"additionalProperties\": {\n        \"type\": \"string\",\n        \"format\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"'tomorrow' is a valid english word\",\n        \"data\": {\"english_word\": \"tomorrow\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"'manana' is an invalid english word\",\n        \"data\": {\"english_word\": \"manana\"},\n        \"valid\": false\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": {\"english_word\": 1},\n        \"valid\": false\n      },\n      {\n        \"description\": \"'today' throws an exception, not in the dictionary\",\n        \"data\": {\"english_word\": \"today\"},\n        \"error\": \"unknown word\"\n      },\n      {\n        \"description\": \"valid date\",\n        \"data\": {\"date\": \"2016-01-25\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid date\",\n        \"data\": {\"date\": \"01/25/2016\"},\n        \"valid\": false\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": {\"date\": 1},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/async/items.json",
    "content": "[\n  {\n    \"description\": \"items: async + sync\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"array\",\n      \"items\": [\n        {\n          \"type\": \"integer\",\n          \"idExists\": {\"table\": \"users\"}\n        },\n        {\n          \"type\": \"integer\"\n        },\n        {\n          \"type\": \"integer\",\n          \"idExists\": {\"table\": \"users\"}\n        }\n      ],\n      \"minItems\": 3,\n      \"additionalItems\": false\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [1, 2, 5],\n        \"valid\": true\n      },\n      {\n        \"description\": \"another valid array\",\n        \"data\": [5, 2, 8],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid 1st async item\",\n        \"data\": [9, 2, 8],\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid 2nd async item\",\n        \"data\": [1, 2, 9],\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid sync item\",\n        \"data\": [1, \"abc\", 5],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/async/keyword.json",
    "content": "[\n  {\n    \"description\": \"async keywords (validated)\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"userId\": {\n          \"type\": \"integer\",\n          \"idExists\": {\"table\": \"users\"}\n        },\n        \"postId\": {\n          \"type\": \"integer\",\n          \"idExists\": {\"table\": \"posts\"}\n        },\n        \"categoryId\": {\n          \"description\": \"will throw if present, no such table\",\n          \"type\": \"integer\",\n          \"idExists\": {\"table\": \"categories\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"userId\": 1, \"postId\": 21},\n        \"valid\": true\n      },\n      {\n        \"description\": \"another valid object\",\n        \"data\": {\"userId\": 5, \"postId\": 25},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid - no such post\",\n        \"data\": {\"userId\": 5, \"postId\": 10},\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid - no such user\",\n        \"data\": {\"userId\": 9, \"postId\": 25},\n        \"valid\": false\n      },\n      {\n        \"description\": \"should throw exception during validation - no such table\",\n        \"data\": {\"postId\": 25, \"categoryId\": 1},\n        \"error\": \"no such table\"\n      }\n    ]\n  },\n  {\n    \"description\": \"async user-defined keywords (validated with errors)\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"userId\": {\n          \"type\": \"integer\",\n          \"idExistsWithError\": {\"table\": \"users\"}\n        },\n        \"postId\": {\n          \"type\": \"integer\",\n          \"idExistsWithError\": {\"table\": \"posts\"}\n        },\n        \"categoryId\": {\n          \"description\": \"will throw if present, no such table\",\n          \"type\": \"integer\",\n          \"idExistsWithError\": {\"table\": \"categories\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"userId\": 1, \"postId\": 21},\n        \"valid\": true\n      },\n      {\n        \"description\": \"another valid object\",\n        \"data\": {\"userId\": 5, \"postId\": 25},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid - no such post\",\n        \"data\": {\"userId\": 5, \"postId\": 10},\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid - no such user\",\n        \"data\": {\"userId\": 9, \"postId\": 25},\n        \"valid\": false\n      },\n      {\n        \"description\": \"should throw exception during validation - no such table\",\n        \"data\": {\"postId\": 25, \"categoryId\": 1},\n        \"error\": \"no such table\"\n      }\n    ]\n  },\n  {\n    \"description\": \"async user-defined keywords (compiled)\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"userId\": {\n          \"type\": \"integer\",\n          \"idExistsCompiled\": {\"table\": \"users\"}\n        },\n        \"postId\": {\n          \"type\": \"integer\",\n          \"idExistsCompiled\": {\"table\": \"posts\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"userId\": 1, \"postId\": 21},\n        \"valid\": true\n      },\n      {\n        \"description\": \"another valid object\",\n        \"data\": {\"userId\": 5, \"postId\": 25},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid - no such post\",\n        \"data\": {\"userId\": 5, \"postId\": 10},\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid - no such user\",\n        \"data\": {\"userId\": 9, \"postId\": 25},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"keyword in async schema\",\n    \"schema\": {\n      \"$async\": true,\n      \"const\": 5\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": 5,\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid\",\n        \"data\": 1,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/async/no_async.json",
    "content": "[\n  {\n    \"description\": \"async schema without async elements\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"string\",\n      \"maxLength\": 3\n    },\n    \"tests\": [\n      {\n        \"description\": \"string <= 3 chars is valid\",\n        \"data\": \"abc\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"string > 3 chars is invalid\",\n        \"data\": \"abcd\",\n        \"valid\": false\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": 1,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/async/properties.json",
    "content": "[\n  {\n    \"description\": \"properties: async + sync\",\n    \"schema\": {\n      \"$async\": true,\n      \"type\": \"object\",\n      \"properties\": {\n        \"foo\": {\n          \"type\": \"integer\",\n          \"idExists\": {\"table\": \"users\"}\n        },\n        \"bar\": {\n          \"type\": \"integer\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"foo\": 1, \"bar\": 2},\n        \"valid\": true\n      },\n      {\n        \"description\": \"another valid object\",\n        \"data\": {\"foo\": 5, \"bar\": 2},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid sync property\",\n        \"data\": {\"foo\": 1, \"bar\": \"abc\"},\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid async property\",\n        \"data\": {\"foo\": 9, \"bar\": 2},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/async.spec.ts",
    "content": "import _Ajv from \"./ajv\"\nimport type {SchemaObject, AnyValidateFunction} from \"../dist/types\"\nimport chai from \"./chai\"\nconst should = chai.should()\n\ndescribe(\"compileAsync method\", () => {\n  let ajv, loadCallCount\n\n  const SCHEMAS = {\n    \"http://example.com/object.json\": {\n      $id: \"http://example.com/object.json\",\n      type: \"object\",\n      properties: {\n        a: {type: \"string\"},\n        b: {$ref: \"int2plus.json\"},\n      },\n    },\n    \"http://example.com/int2plus.json\": {\n      $id: \"http://example.com/int2plus.json\",\n      type: \"integer\",\n      minimum: 2,\n    },\n    \"http://example.com/tree.json\": {\n      $id: \"http://example.com/tree.json\",\n      type: \"array\",\n      items: {$ref: \"leaf.json\"},\n    },\n    \"http://example.com/leaf.json\": {\n      $id: \"http://example.com/leaf.json\",\n      type: \"object\",\n      properties: {\n        name: {type: \"string\"},\n        subtree: {$ref: \"tree.json\"},\n      },\n    },\n    \"http://example.com/recursive.json\": {\n      $id: \"http://example.com/recursive.json\",\n      type: \"object\",\n      properties: {\n        b: {$ref: \"parent.json\"},\n      },\n      required: [\"b\"],\n    },\n    \"http://example.com/invalid.json\": {\n      $id: \"http://example.com/recursive.json\",\n      type: \"object\",\n      properties: {\n        invalid: {type: \"number\"},\n      },\n      required: \"invalid\",\n    },\n    \"http://example.com/foobar.json\": {\n      $id: \"http://example.com/foobar.json\",\n      $schema: \"http://example.com/foobar_meta.json\",\n      type: \"string\",\n      myFooBar: \"foo\",\n    },\n    \"http://example.com/foobar_meta.json\": {\n      $id: \"http://example.com/foobar_meta.json\",\n      type: \"object\",\n      properties: {\n        myFooBar: {\n          enum: [\"foo\", \"bar\"],\n        },\n      },\n    },\n    \"http://example.com/foo.json\": {\n      $id: \"http://example.com/foo.json\",\n      type: \"object\",\n      properties: {\n        bar: {$ref: \"bar.json\"},\n        other: {$ref: \"other.json\"},\n      },\n    },\n    \"http://example.com/bar.json\": {\n      $id: \"http://example.com/bar.json\",\n      type: \"object\",\n      properties: {\n        foo: {$ref: \"foo.json\"},\n      },\n    },\n    \"http://example.com/other.json\": {\n      $id: \"http://example.com/other.json\",\n    },\n  }\n\n  beforeEach(() => {\n    loadCallCount = 0\n    ajv = new _Ajv({loadSchema})\n  })\n\n  it(\"should compile schemas loading missing schemas with options.loadSchema function\", () => {\n    const schema = {\n      $id: \"http://example.com/parent.json\",\n      type: \"object\",\n      properties: {\n        a: {$ref: \"object.json\"},\n      },\n    }\n    return ajv.compileAsync(schema).then((validate) => {\n      should.equal(loadCallCount, 2)\n      validate.should.be.a(\"function\")\n      validate({a: {b: 2}}).should.equal(true)\n      validate({a: {b: 1}}).should.equal(false)\n    })\n  })\n\n  it(\"should compile schemas loading missing schemas and return promise with function\", () => {\n    const schema = {\n      $id: \"http://example.com/parent.json\",\n      type: \"object\",\n      properties: {\n        a: {$ref: \"object.json\"},\n      },\n    }\n    return ajv.compileAsync(schema).then((validate) => {\n      should.equal(loadCallCount, 2)\n      validate.should.be.a(\"function\")\n      validate({a: {b: 2}}).should.equal(true)\n      validate({a: {b: 1}}).should.equal(false)\n    })\n  })\n\n  it(\"should correctly load schemas when missing reference has JSON path\", () => {\n    const schema = {\n      $id: \"http://example.com/parent.json\",\n      type: \"object\",\n      properties: {\n        a: {$ref: \"object.json#/properties/b\"},\n      },\n    }\n    return ajv.compileAsync(schema).then((validate) => {\n      should.equal(loadCallCount, 2)\n      validate.should.be.a(\"function\")\n      validate({a: 2}).should.equal(true)\n      validate({a: 1}).should.equal(false)\n    })\n  })\n\n  it(\"should correctly compile with remote schemas that have mutual references\", () => {\n    const schema = {\n      $id: \"http://example.com/root.json\",\n      type: \"object\",\n      properties: {\n        tree: {$ref: \"tree.json\"},\n      },\n    }\n    return ajv.compileAsync(schema).then((validate) => {\n      validate.should.be.a(\"function\")\n      const validData = {\n        tree: [{name: \"a\", subtree: [{name: \"a.a\"}]}, {name: \"b\"}],\n      }\n      const invalidData = {tree: [{name: \"a\", subtree: [{name: 1}]}]}\n      validate(validData).should.equal(true)\n      validate(invalidData).should.equal(false)\n    })\n  })\n\n  it(\"should correctly compile with remote schemas that reference the compiled schema\", () => {\n    const schema = {\n      $id: \"http://example.com/parent.json\",\n      type: \"object\",\n      properties: {\n        a: {$ref: \"recursive.json\"},\n      },\n    }\n    return ajv.compileAsync(schema).then((validate) => {\n      should.equal(loadCallCount, 1)\n      validate.should.be.a(\"function\")\n      const validData = {a: {b: {a: {b: {}}}}}\n      const invalidData = {a: {b: {a: {}}}}\n      validate(validData).should.equal(true)\n      validate(invalidData).should.equal(false)\n    })\n  })\n\n  it('should resolve reference containing \"properties\" segment with the same property (issue #220)', () => {\n    const schema = {\n      $id: \"http://example.com/parent.json\",\n      type: \"object\",\n      properties: {\n        a: {\n          $ref: \"object.json#/properties/a\",\n        },\n      },\n    }\n    return ajv.compileAsync(schema).then((validate) => {\n      should.equal(loadCallCount, 2)\n      validate.should.be.a(\"function\")\n      validate({a: \"foo\"}).should.equal(true)\n      validate({a: 42}).should.equal(false)\n    })\n  })\n\n  describe(\"loading metaschemas (#334)\", () => {\n    it(\"should load metaschema if not available\", () => {\n      return test(SCHEMAS[\"http://example.com/foobar.json\"], 1)\n    })\n\n    it(\"should load metaschema of referenced schema if not available\", () => {\n      return test({$ref: \"http://example.com/foobar.json\"}, 2)\n    })\n\n    function test(schema, expectedLoadCallCount) {\n      ajv.addKeyword({\n        keyword: \"myFooBar\",\n        type: \"string\",\n        validate: function (sch, data) {\n          return sch === data\n        },\n      })\n\n      return ajv.compileAsync(schema).then((validate) => {\n        should.equal(loadCallCount, expectedLoadCallCount)\n        validate.should.be.a(\"function\")\n        validate(\"foo\").should.equal(true)\n        validate(\"bar\").should.equal(false)\n      })\n    }\n  })\n\n  it(\"should return compiled schema on the next tick if there are no references (#51)\", () => {\n    const schema = {\n      $id: \"http://example.com/int2plus.json\",\n      type: \"integer\",\n      minimum: 2,\n    }\n    let beforeCallback1: any = false\n    const p1 = ajv.compileAsync(schema).then((validate) => {\n      beforeCallback1.should.equal(true)\n      spec(validate)\n      let beforeCallback2: any = false\n      const p2 = ajv.compileAsync(schema).then((_validate) => {\n        beforeCallback2.should.equal(true)\n        spec(_validate)\n      })\n      beforeCallback2 = true\n      return p2\n    })\n    beforeCallback1 = true\n    return p1\n\n    function spec(validate) {\n      should.equal(loadCallCount, 0)\n      validate.should.be.a(\"function\")\n      const validData = 2\n      const invalidData = 1\n      validate(validData).should.equal(true)\n      validate(invalidData).should.equal(false)\n    }\n  })\n\n  it(\"should queue calls so only one compileAsync executes at a time (#52)\", () => {\n    const schema = {\n      $id: \"http://example.com/parent.json\",\n      type: \"object\",\n      properties: {\n        a: {$ref: \"object.json\"},\n      },\n    }\n\n    return Promise.all([\n      ajv.compileAsync(schema).then(spec),\n      ajv.compileAsync(schema).then(spec),\n      ajv.compileAsync(schema).then(spec),\n    ])\n\n    function spec(validate) {\n      should.equal(loadCallCount, 2)\n      validate.should.be.a(\"function\")\n      validate({a: {b: 2}}).should.equal(true)\n      validate({a: {b: 1}}).should.equal(false)\n    }\n  })\n\n  it(\"should throw exception if loadSchema is not passed\", () => {\n    const schema = {\n      $id: \"http://example.com/int2plus.json\",\n      type: \"integer\",\n      minimum: 2,\n    }\n    ajv = new _Ajv()\n    should.throw(() => {\n      ajv.compileAsync(schema)\n    }, \"options.loadSchema should be a function\")\n  })\n\n  describe(\"should return error via promise\", () => {\n    it(\"if passed schema is invalid\", () => {\n      const invalidSchema = {\n        $id: \"http://example.com/int2plus.json\",\n        type: \"integer\",\n        minimum: \"invalid\",\n      }\n      return shouldReject(ajv.compileAsync(invalidSchema), /schema is invalid/)\n    })\n\n    it(\"if loaded schema is invalid\", () => {\n      const schema = {\n        $id: \"http://example.com/parent.json\",\n        type: \"object\",\n        properties: {\n          a: {$ref: \"invalid.json\"},\n        },\n      }\n      return shouldReject(ajv.compileAsync(schema), /schema is invalid/)\n    })\n\n    it(\"if required schema is loaded but the reference cannot be resolved\", () => {\n      const schema = {\n        $id: \"http://example.com/parent.json\",\n        type: \"object\",\n        properties: {\n          a: {$ref: \"object.json#/definitions/not_found\"},\n        },\n      }\n      return shouldReject(ajv.compileAsync(schema), /is loaded but/)\n    })\n\n    it(\"if loadSchema returned error\", () => {\n      const schema = {\n        $id: \"http://example.com/parent.json\",\n        type: \"object\",\n        properties: {\n          a: {$ref: \"object.json\"},\n        },\n      }\n      ajv = new _Ajv({loadSchema: badLoadSchema})\n      return shouldReject(ajv.compileAsync(schema), /cant load/)\n\n      function badLoadSchema() {\n        return Promise.reject(new Error(\"cant load\"))\n      }\n    })\n\n    it(\"if schema compilation throws some other exception\", () => {\n      ajv.addKeyword({keyword: \"badkeyword\", compile: badCompile})\n      const schema = {badkeyword: true}\n      return shouldReject(ajv.compileAsync(schema), /cant compile keyword schema/)\n\n      function badCompile(/* schema */) {\n        throw new Error(\"cant compile keyword schema\")\n      }\n    })\n\n    function shouldReject(p: Promise<AnyValidateFunction>, rx: RegExp) {\n      return p.then(\n        (validate) => {\n          should.not.exist(validate)\n          throw new Error(\"Promise has resolved; it should have rejected\")\n        },\n        (err) => {\n          should.exist(err)\n          err.message.should.match(rx)\n        }\n      )\n    }\n  })\n\n  describe(\"schema with multiple remote properties, the first is recursive schema (#801)\", () => {\n    it(\"should validate data\", () => {\n      const schema = {\n        $id: \"http://example.com/list.json\",\n        type: \"object\",\n        properties: {\n          foo: {$ref: \"foo.json\"},\n        },\n      }\n\n      return ajv.compileAsync(schema).then((validate) => {\n        validate({foo: {}}).should.equal(true)\n      })\n    })\n  })\n\n  function loadSchema(uri: string): Promise<SchemaObject> {\n    loadCallCount++\n    return new Promise((resolve, reject) => {\n      setTimeout(() => {\n        if (SCHEMAS[uri]) resolve(SCHEMAS[uri])\n        else reject(new Error(\"404\"))\n      }, 10)\n    })\n  }\n})\n"
  },
  {
    "path": "spec/async_schemas.spec.ts",
    "content": "import getAjvAsyncInstances from \"./ajv_async_instances\"\nimport jsonSchemaTest = require(\"json-schema-test\")\nimport {afterError} from \"./after_test\"\nimport type Ajv from \"..\"\nimport _Ajv from \"./ajv\"\nimport chai from \"./chai\"\n\nconst instances = getAjvAsyncInstances({$data: true})\n\ninstances.forEach(addAsyncFormatsAndKeywords)\n\njsonSchemaTest(instances, {\n  description:\n    \"asynchronous schemas tests of \" + instances.length + \" ajv instances with different options\",\n  suites: {\"async schemas\": require(\"./_json/async\")},\n  async: true,\n  asyncValid: \"data\",\n  assert: chai.assert,\n  afterError,\n  // afterEach: after.each,\n  cwd: __dirname,\n  hideFolder: \"async/\",\n  timeout: 10000,\n})\n\nfunction addAsyncFormatsAndKeywords(ajv: Ajv) {\n  ajv.addFormat(\"date\", /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/)\n\n  ajv.addFormat(\"english_word\", {\n    async: true,\n    validate: checkWordOnServer,\n  })\n\n  ajv.addKeyword({\n    keyword: \"idExists\",\n    async: true,\n    type: \"number\",\n    validate: checkIdExists,\n    errors: false,\n  })\n\n  ajv.addKeyword({\n    keyword: \"idExistsWithError\",\n    async: true,\n    type: \"number\",\n    validate: checkIdExistsWithError,\n    errors: true,\n  })\n\n  ajv.addKeyword({\n    keyword: \"idExistsCompiled\",\n    async: true,\n    type: \"number\",\n    compile: compileCheckIdExists,\n  })\n}\n\nfunction checkWordOnServer(str: string): Promise<boolean> {\n  return str === \"tomorrow\"\n    ? Promise.resolve(true)\n    : str === \"manana\"\n    ? Promise.resolve(false)\n    : Promise.reject(new Error(\"unknown word\"))\n}\n\nfunction checkIdExists(schema: {table: string}, data: number): Promise<boolean> {\n  switch (schema.table) {\n    case \"users\":\n      return check([1, 5, 8])\n    case \"posts\":\n      return check([21, 25, 28])\n    default:\n      throw new Error(\"no such table\")\n  }\n\n  function check(IDs: number[]): Promise<boolean> {\n    return Promise.resolve(IDs.includes(data))\n  }\n}\n\nfunction checkIdExistsWithError(schema: {table: string}, data: number): Promise<boolean> {\n  const {table} = schema\n  switch (table) {\n    case \"users\":\n      return check(table, [1, 5, 8])\n    case \"posts\":\n      return check(table, [21, 25, 28])\n    default:\n      throw new Error(\"no such table\")\n  }\n\n  function check(_table: string, IDs: number[]): Promise<boolean> {\n    if (IDs.includes(data)) return Promise.resolve(true)\n\n    const error = {\n      keyword: \"idExistsWithError\",\n      message: \"id not found in table \" + _table,\n    }\n    return Promise.reject(new _Ajv.ValidationError([error]))\n  }\n}\n\nfunction compileCheckIdExists(schema: {table: string}): (data: number) => Promise<boolean> {\n  switch (schema.table) {\n    case \"users\":\n      return compileCheck([1, 5, 8])\n    case \"posts\":\n      return compileCheck([21, 25, 28])\n    default:\n      throw new Error(\"no such table\")\n  }\n\n  function compileCheck(IDs: number[]): (data: number) => Promise<boolean> {\n    return (data) => Promise.resolve(IDs.includes(data))\n  }\n}\n"
  },
  {
    "path": "spec/async_validate.spec.ts",
    "content": "import getAjvAsyncInstances from \"./ajv_async_instances\"\nimport _Ajv from \"./ajv\"\nimport chai from \"./chai\"\nconst should = chai.should()\n\ndescribe(\"async schemas, formats and keywords\", function () {\n  this.timeout(30000)\n  let ajv, instances\n\n  beforeEach(() => {\n    instances = getAjvAsyncInstances()\n    ajv = instances[0]\n  })\n\n  describe(\"async schemas without async elements\", () => {\n    it(\"should return result as promise\", () => {\n      const schema = {\n        $async: true,\n        type: \"string\",\n        maxLength: 3,\n      }\n\n      return repeat(() => {\n        return Promise.all(instances.map(test))\n      })\n\n      function test(_ajv) {\n        const validate = _ajv.compile(schema)\n\n        return Promise.all([\n          shouldBeValid(validate(\"abc\"), \"abc\"),\n          shouldBeInvalid(validate(\"abcd\")),\n          shouldBeInvalid(validate(1)),\n        ])\n      }\n    })\n\n    it(\"should fail compilation if async schema is inside sync schema\", () => {\n      const schema: any = {\n        type: \"object\",\n        properties: {\n          foo: {\n            $async: true,\n            type: \"string\",\n            maxLength: 3,\n          },\n        },\n      }\n\n      should.throw(() => {\n        ajv.compile(schema)\n      }, \"async schema in sync schema\")\n\n      ajv.compile({...schema, $async: true})\n    })\n  })\n\n  describe(\"async formats\", () => {\n    beforeEach(addFormatEnglishWord)\n\n    it(\"should fail compilation if async format is inside sync schema\", () => {\n      instances.forEach((_ajv) => {\n        let schema: any = {\n          type: \"string\",\n          format: \"english_word\",\n        }\n\n        should.throw(() => {\n          _ajv.compile(schema)\n        }, \"async format in sync schema\")\n        schema = {...schema, $async: true}\n        _ajv.compile(schema)\n      })\n    })\n  })\n\n  describe(\"async user-defined keywords\", () => {\n    beforeEach(() => {\n      instances.forEach((_ajv) => {\n        _ajv.addKeyword({\n          keyword: \"idExists\",\n          async: true,\n          type: \"number\",\n          validate: checkIdExists,\n          errors: false,\n        })\n\n        _ajv.addKeyword({\n          keyword: \"idExistsWithError\",\n          async: true,\n          type: \"number\",\n          validate: checkIdExistsWithError,\n          errors: true,\n        })\n      })\n    })\n\n    it(\"should fail compilation if async keyword is inside sync schema\", () => {\n      instances.forEach((_ajv) => {\n        let schema: any = {\n          type: \"object\",\n          properties: {\n            userId: {\n              type: \"integer\",\n              idExists: {table: \"users\"},\n            },\n          },\n        }\n\n        should.throw(() => {\n          _ajv.compile(schema)\n        }, \"async keyword in sync schema\")\n\n        schema = {...schema, $async: true}\n        _ajv.compile(schema)\n      })\n    })\n\n    it(\"should return user-defined error\", () => {\n      return Promise.all(\n        instances.map((_ajv) => {\n          const schema = {\n            $async: true,\n            type: \"object\",\n            properties: {\n              userId: {\n                type: \"integer\",\n                idExistsWithError: {table: \"users\"},\n              },\n              postId: {\n                type: \"integer\",\n                idExistsWithError: {table: \"posts\"},\n              },\n            },\n          }\n\n          const validate = _ajv.compile(schema)\n\n          return Promise.all([\n            shouldBeInvalid(validate({userId: 5, postId: 10}), [\"id not found in table posts\"]),\n            shouldBeInvalid(validate({userId: 9, postId: 25}), [\"id not found in table users\"]),\n          ])\n        })\n      )\n    })\n\n    function checkIdExists(schema, data) {\n      switch (schema.table) {\n        case \"users\":\n          return check([1, 5, 8])\n        case \"posts\":\n          return check([21, 25, 28])\n        default:\n          throw new Error(\"no such table\")\n      }\n\n      function check(IDs) {\n        return Promise.resolve(IDs.indexOf(data) >= 0)\n      }\n    }\n\n    function checkIdExistsWithError(schema, data) {\n      const {table} = schema\n      switch (table) {\n        case \"users\":\n          return check(table, [1, 5, 8])\n        case \"posts\":\n          return check(table, [21, 25, 28])\n        default:\n          throw new Error(\"no such table\")\n      }\n\n      function check(_table, IDs) {\n        if (IDs.indexOf(data) >= 0) return Promise.resolve(true)\n        const error = {\n          keyword: \"idExistsWithError\",\n          message: \"id not found in table \" + _table,\n        }\n        return Promise.reject(new _Ajv.ValidationError([error]))\n      }\n    }\n  })\n\n  describe(\"async referenced schemas\", () => {\n    beforeEach(() => {\n      instances = getAjvAsyncInstances({inlineRefs: false, ignoreKeywordsWithRef: true})\n      addFormatEnglishWord()\n    })\n\n    it(\"should validate referenced async schema\", () => {\n      const schema = {\n        $async: true,\n        definitions: {\n          english_word: {\n            $async: true,\n            type: \"string\",\n            format: \"english_word\",\n          },\n        },\n        type: \"object\",\n        properties: {\n          word: {$ref: \"#/definitions/english_word\"},\n        },\n      }\n\n      return repeat(() => {\n        return Promise.all(\n          instances.map((_ajv) => {\n            const validate = _ajv.compile(schema)\n            const validData = {word: \"tomorrow\"}\n\n            return Promise.all([\n              shouldBeValid(validate(validData), validData),\n              shouldBeInvalid(validate({word: \"manana\"})),\n              shouldBeInvalid(validate({word: 1})),\n              shouldThrow(validate({word: \"today\"}), \"unknown word\"),\n            ])\n          })\n        )\n      })\n    })\n\n    it(\"should validate recursive async schema\", () => {\n      const schema = {\n        $async: true,\n        definitions: {\n          english_word: {\n            $async: true,\n            type: \"string\",\n            format: \"english_word\",\n          },\n        },\n        type: \"object\",\n        properties: {\n          foo: {\n            anyOf: [{$ref: \"#/definitions/english_word\"}, {$ref: \"#\"}],\n          },\n        },\n      }\n\n      return recursiveTest(schema)\n    })\n\n    it(\"should validate recursive ref to async sub-schema, issue #612\", () => {\n      const schema = {\n        $async: true,\n        type: \"object\",\n        properties: {\n          foo: {\n            $async: true,\n            anyOf: [\n              {\n                type: \"string\",\n                format: \"english_word\",\n              },\n              {\n                type: \"object\",\n                properties: {\n                  foo: {$ref: \"#/properties/foo\"},\n                },\n              },\n            ],\n          },\n        },\n      }\n\n      return recursiveTest(schema)\n    })\n\n    it(\"should validate ref from referenced async schema to root schema\", () => {\n      const schema = {\n        $async: true,\n        definitions: {\n          wordOrRoot: {\n            $async: true,\n            anyOf: [\n              {\n                type: \"string\",\n                format: \"english_word\",\n              },\n              {$ref: \"#\"},\n            ],\n          },\n        },\n        type: \"object\",\n        properties: {\n          foo: {$ref: \"#/definitions/wordOrRoot\"},\n        },\n      }\n\n      return recursiveTest(schema)\n    })\n\n    it(\"should validate refs between two async schemas\", () => {\n      const schemaObj = {\n        $id: \"http://e.com/obj.json#\",\n        $async: true,\n        type: \"object\",\n        properties: {\n          foo: {$ref: \"http://e.com/word.json#\"},\n        },\n      }\n\n      const schemaWord = {\n        $id: \"http://e.com/word.json#\",\n        $async: true,\n        anyOf: [\n          {\n            type: \"string\",\n            format: \"english_word\",\n          },\n          {$ref: \"http://e.com/obj.json#\"},\n        ],\n      }\n\n      return recursiveTest(schemaObj, schemaWord)\n    })\n\n    it(\"should fail compilation if sync schema references async schema\", () => {\n      let schema: any = {\n        $id: \"http://e.com/obj.json#\",\n        type: \"object\",\n        properties: {\n          foo: {$ref: \"http://e.com/word.json#\"},\n        },\n      }\n\n      const schemaWord = {\n        $id: \"http://e.com/word.json#\",\n        $async: true,\n        anyOf: [\n          {\n            type: \"string\",\n            format: \"english_word\",\n          },\n          {$ref: \"http://e.com/obj.json#\"},\n        ],\n      }\n\n      ajv.addSchema(schemaWord)\n      ajv.addFormat(\"english_word\", {\n        async: true,\n        validate: checkWordOnServer,\n      })\n\n      should.throw(() => {\n        ajv.compile(schema)\n      }, \"async schema referenced by sync schema\")\n\n      schema = {...schema, $id: \"http://e.com/obj2.json#\", $async: true}\n\n      ajv.compile(schema)\n    })\n\n    function recursiveTest(schema, refSchema?) {\n      return repeat(() => {\n        return Promise.all(\n          instances.map((_ajv) => {\n            if (refSchema) _ajv.addSchema(refSchema)\n            const validate = _ajv.compile(schema)\n            let data\n\n            return Promise.all([\n              shouldBeValid(validate((data = {foo: \"tomorrow\"})), data),\n              shouldBeInvalid(validate({foo: \"manana\"})),\n              shouldBeInvalid(validate({foo: 1})),\n              shouldThrow(validate({foo: \"today\"}), \"unknown word\"),\n              shouldBeValid(validate((data = {foo: {foo: \"tomorrow\"}})), data),\n              shouldBeInvalid(validate({foo: {foo: \"manana\"}})),\n              shouldBeInvalid(validate({foo: {foo: 1}})),\n              shouldThrow(validate({foo: {foo: \"today\"}}), \"unknown word\"),\n              shouldBeValid(validate((data = {foo: {foo: {foo: \"tomorrow\"}}})), data),\n              shouldBeInvalid(validate({foo: {foo: {foo: \"manana\"}}})),\n              shouldBeInvalid(validate({foo: {foo: {foo: 1}}})),\n              shouldThrow(validate({foo: {foo: {foo: \"today\"}}}), \"unknown word\"),\n            ])\n          })\n        )\n      })\n    }\n  })\n\n  function addFormatEnglishWord() {\n    instances.forEach((_ajv) => {\n      _ajv.addFormat(\"english_word\", {\n        async: true,\n        validate: checkWordOnServer,\n      })\n    })\n  }\n})\n\nfunction checkWordOnServer(str) {\n  return str === \"tomorrow\"\n    ? Promise.resolve(true)\n    : str === \"manana\"\n    ? Promise.resolve(false)\n    : Promise.reject(new Error(\"unknown word\"))\n}\n\nfunction shouldBeValid(p, data) {\n  return p.then((valid) => valid.should.equal(data))\n}\n\nconst SHOULD_BE_INVALID = \"test: should be invalid\"\nfunction shouldBeInvalid(p, expectedMessages?: string[]) {\n  return checkNotValid(p).then((err) => {\n    err.should.be.instanceof(_Ajv.ValidationError)\n    err.errors.should.be.an(\"array\")\n    err.validation.should.equal(true)\n    if (expectedMessages) {\n      const messages = err.errors.map((e) => e.message)\n      messages.should.eql(expectedMessages)\n    }\n  })\n}\n\nfunction shouldThrow(p, exception) {\n  return checkNotValid(p).then((err) => err.message.should.equal(exception))\n}\n\nfunction checkNotValid(p) {\n  return p\n    .then((/* valid */) => {\n      throw new Error(SHOULD_BE_INVALID)\n    })\n    .catch((err) => {\n      err.should.be.instanceof(Error)\n      if (err.message === SHOULD_BE_INVALID) throw err\n      return err\n    })\n}\n\nfunction repeat(func) {\n  return func()\n  // var promises = [];\n  // for (var i=0; i<1000; i++) promises.push(func());\n  // return Promise.all(promises);\n}\n"
  },
  {
    "path": "spec/boolean.spec.ts",
    "content": "import _Ajv from \"./ajv\"\nimport type Ajv from \"..\"\nimport chai from \"./chai\"\nchai.should()\n\ndescribe(\"boolean schemas\", () => {\n  let ajvs: Ajv[]\n\n  before(() => {\n    ajvs = [\n      new _Ajv({strictTuples: false}),\n      new _Ajv({allErrors: true, strictTuples: false}),\n      new _Ajv({inlineRefs: false, strictTuples: false}),\n      new _Ajv({strict: false}),\n    ]\n  })\n\n  describe(\"top level schema\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should validate any data as valid\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should validate any data as invalid\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const validate = ajv.compile(boolSchema)\n        testSchema(validate, valid)\n      }\n    }\n  })\n\n  describe(\"in properties / sub-properties\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any property value\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any property value\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const schema = {\n          type: \"object\",\n          properties: {\n            foo: boolSchema,\n            bar: {\n              type: \"object\",\n              properties: {\n                baz: boolSchema,\n              },\n            },\n          },\n        }\n\n        const validate = ajv.compile(schema)\n        validate({foo: 1, bar: {baz: 1}}).should.equal(valid)\n        validate({foo: \"1\", bar: {baz: \"1\"}}).should.equal(valid)\n        validate({foo: {}, bar: {baz: {}}}).should.equal(valid)\n        validate({foo: [], bar: {baz: []}}).should.equal(valid)\n        validate({foo: true, bar: {baz: true}}).should.equal(valid)\n        validate({foo: false, bar: {baz: false}}).should.equal(valid)\n        validate({foo: null, bar: {baz: null}}).should.equal(valid)\n\n        validate({bar: {quux: 1}}).should.equal(true)\n      }\n    }\n  })\n\n  describe(\"in items / sub-items\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any item value\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any item value\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        let schema = {\n          type: \"array\",\n          items: boolSchema,\n        }\n\n        let validate = ajv.compile(schema)\n        validate([1]).should.equal(valid)\n        validate([\"1\"]).should.equal(valid)\n        validate([{}]).should.equal(valid)\n        validate([[]]).should.equal(valid)\n        validate([true]).should.equal(valid)\n        validate([false]).should.equal(valid)\n        validate([null]).should.equal(valid)\n\n        validate([]).should.equal(true)\n\n        schema = {\n          type: \"array\",\n          items: [\n            true,\n            {\n              type: \"array\",\n              items: [true, boolSchema],\n            },\n            boolSchema,\n          ],\n        }\n\n        validate = ajv.compile(schema)\n        validate([1, [1, 1], 1]).should.equal(valid)\n        validate([\"1\", [\"1\", \"1\"], \"1\"]).should.equal(valid)\n        validate([{}, [{}, {}], {}]).should.equal(valid)\n        validate([[], [[], []], []]).should.equal(valid)\n        validate([true, [true, true], true]).should.equal(valid)\n        validate([false, [false, false], false]).should.equal(valid)\n        validate([null, [null, null], null]).should.equal(valid)\n\n        validate([1, [1]]).should.equal(true)\n      }\n    }\n  })\n\n  describe(\"in dependencies and sub-dependencies\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any property value\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any property value\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const schema = {\n          type: \"object\",\n          dependencies: {\n            foo: boolSchema,\n            bar: {\n              type: \"object\",\n              dependencies: {\n                baz: boolSchema,\n              },\n            },\n          },\n        }\n\n        const validate = ajv.compile(schema)\n        validate({foo: 1, bar: 1, baz: 1}).should.equal(valid)\n        validate({foo: \"1\", bar: \"1\", baz: \"1\"}).should.equal(valid)\n        validate({foo: {}, bar: {}, baz: {}}).should.equal(valid)\n        validate({foo: [], bar: [], baz: []}).should.equal(valid)\n        validate({foo: true, bar: true, baz: true}).should.equal(valid)\n        validate({foo: false, bar: false, baz: false}).should.equal(valid)\n        validate({foo: null, bar: null, baz: null}).should.equal(valid)\n\n        validate({bar: 1, quux: 1}).should.equal(true)\n      }\n    }\n  })\n\n  describe(\"in patternProperties\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any property matching pattern\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any property matching pattern\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const schema = {\n          type: \"object\",\n          patternProperties: {\n            \"^f\": boolSchema,\n            r$: {\n              type: \"object\",\n              patternProperties: {\n                z$: boolSchema,\n              },\n            },\n          },\n        }\n\n        const validate = ajv.compile(schema)\n        validate({foo: 1, bar: {baz: 1}}).should.equal(valid)\n        validate({foo: \"1\", bar: {baz: \"1\"}}).should.equal(valid)\n        validate({foo: {}, bar: {baz: {}}}).should.equal(valid)\n        validate({foo: [], bar: {baz: []}}).should.equal(valid)\n        validate({foo: true, bar: {baz: true}}).should.equal(valid)\n        validate({foo: false, bar: {baz: false}}).should.equal(valid)\n        validate({foo: null, bar: {baz: null}}).should.equal(valid)\n\n        validate({bar: {quux: 1}}).should.equal(true)\n      }\n    }\n  })\n\n  describe(\"in propertyNames\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any property\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any property\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const schema = {\n          type: \"object\",\n          propertyNames: boolSchema,\n        }\n\n        const validate = ajv.compile(schema)\n        validate({foo: 1}).should.equal(valid)\n        validate({bar: 1}).should.equal(valid)\n\n        validate({}).should.equal(true)\n      }\n    }\n  })\n\n  describe(\"in contains\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any items\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any items\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const schema = {\n          type: \"array\",\n          contains: boolSchema,\n        }\n\n        const validate = ajv.compile(schema)\n        validate([1]).should.equal(valid)\n        validate([\"foo\"]).should.equal(valid)\n        validate([{}]).should.equal(valid)\n        validate([[]]).should.equal(valid)\n        validate([true]).should.equal(valid)\n        validate([false]).should.equal(valid)\n        validate([null]).should.equal(valid)\n\n        validate([]).should.equal(false)\n      }\n    }\n  })\n\n  describe(\"in not\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be invalid with any data\", () => {\n        ajvs.forEach(test(true, false))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be valid with any data\", () => {\n        ajvs.forEach(test(false, true))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const schema = {\n          not: boolSchema,\n        }\n\n        const validate = ajv.compile(schema)\n        testSchema(validate, valid)\n      }\n    }\n  })\n\n  describe(\"in allOf\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any data\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any data\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        let schema = {\n          allOf: [false, boolSchema],\n        }\n\n        let validate = ajv.compile(schema)\n        testSchema(validate, false)\n\n        schema = {\n          allOf: [true, boolSchema],\n        }\n\n        validate = ajv.compile(schema)\n        testSchema(validate, valid)\n      }\n    }\n  })\n\n  describe(\"in anyOf\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any data\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any data\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        let schema = {\n          anyOf: [false, boolSchema],\n        }\n\n        let validate = ajv.compile(schema)\n        testSchema(validate, valid)\n\n        schema = {\n          anyOf: [true, boolSchema],\n        }\n\n        validate = ajv.compile(schema)\n        testSchema(validate, true)\n      }\n    }\n  })\n\n  describe(\"in oneOf\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any data\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any data\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        let schema = {\n          oneOf: [false, boolSchema],\n        }\n\n        let validate = ajv.compile(schema)\n        testSchema(validate, valid)\n\n        schema = {\n          oneOf: [true, boolSchema],\n        }\n\n        validate = ajv.compile(schema)\n        testSchema(validate, !valid)\n      }\n    }\n  })\n\n  describe(\"in $ref\", () => {\n    describe(\"schema = true\", () => {\n      it(\"should be valid with any data\", () => {\n        ajvs.forEach(test(true, true))\n      })\n    })\n\n    describe(\"schema = false\", () => {\n      it(\"should be invalid with any data\", () => {\n        ajvs.forEach(test(false, false))\n      })\n    })\n\n    function test(boolSchema, valid) {\n      return function (ajv) {\n        const schema = {\n          $ref: \"#/definitions/bool\",\n          definitions: {\n            bool: boolSchema,\n          },\n        }\n\n        const validate = ajv.compile(schema)\n        testSchema(validate, valid)\n      }\n    }\n  })\n\n  function testSchema(validate, valid) {\n    validate(1).should.equal(valid)\n    validate(\"foo\").should.equal(valid)\n    validate({}).should.equal(valid)\n    validate([]).should.equal(valid)\n    validate(true).should.equal(valid)\n    validate(false).should.equal(valid)\n    validate(null).should.equal(valid)\n  }\n})\n"
  },
  {
    "path": "spec/chai.ts",
    "content": "import type {ChaiStatic} from \"./chai_type\"\n\nconst chai: ChaiStatic = typeof window == \"object\" ? (window as any).chai : require(\"\" + \"chai\")\n\nexport default chai\n"
  },
  {
    "path": "spec/chai_type.ts",
    "content": "import \"chai\"\nexport type ChaiStatic = Chai.ChaiStatic\n"
  },
  {
    "path": "spec/codegen.spec.ts",
    "content": "import {\n  CodeGen,\n  CodeGenOptions,\n  ScopeStore,\n  ValueScope,\n  _,\n  str,\n  nil,\n  not,\n  Code,\n  Name,\n} from \"../dist/compile/codegen\"\nimport assert = require(\"assert\")\n\ndescribe(\"code generation\", () => {\n  describe(\"Name\", () => {\n    it(\"throws if non-identifier is passed\", () => {\n      assert.throws(() => new Name(\"1x\"), /name must be a valid identifier/)\n      assert.throws(() => new Name(\"-x\"), /name must be a valid identifier/)\n      new Name(\"x\")\n    })\n\n    it(\"returns false from emptyStr\", () => {\n      assert.strictEqual(new Name(\"x\").emptyStr(), false)\n    })\n  })\n\n  describe(\"emptyStr\", () => {\n    it(\"checks empty string\", () => {\n      assert.strictEqual(nil.toString(), \"\")\n      assert.strictEqual(nil.emptyStr(), true)\n      assert.strictEqual(_`\"\"`.emptyStr(), true)\n      assert.strictEqual(_`\"foo\"`.emptyStr(), false)\n    })\n  })\n\n  describe(\"_ tagged template\", () => {\n    it(\"quotes strings\", () => {\n      const x = new Name(\"x\")\n      const s = \"foo\"\n      const code = _`${x} = ${s}`\n      assertEqual(code, 'x = \"foo\"')\n    })\n\n    it(\"interpolates Code, numbers, booleans and nulls without quotes\", () => {\n      const x: Name = new Name(\"x\")\n      const expr: Code = _`${true} ? ${1} : ${2}`\n      const code: Code = _`${x} = ${expr}; x = ${null}`\n      assertEqual(code, \"x = true ? 1 : 2; x = null\")\n    })\n  })\n\n  describe(\"str tagged template\", () => {\n    it(\"quotes plain strings\", () => {\n      const code: Code = str`foo`\n      assertEqual(code, '\"foo\"')\n    })\n\n    it(\"merges strings\", () => {\n      const x = \"-\"\n      assertEqual(str`${x}foo${x}bar${x}`, '\"-foo-bar-\"')\n    })\n\n    it(\"creates string expressions with Code\", () => {\n      const x = new Name(\"x\")\n      assertEqual(str`${x}foo${x}bar${x}`, 'x+\"foo\"+x+\"bar\"+x')\n      assertEqual(str`foo${x}${x}bar${x}`, '\"foo\"+x+x+\"bar\"+x')\n    })\n\n    it(\"connects string expressions removing unnecessary additions\", () => {\n      const x = _`\"foo\" + ${new Name(\"x\")} + \"bar\"`\n      assertEqual(str`start ${x} end`, '\"start foo\" + x + \"bar end\"')\n    })\n\n    it(\"connects strings with numbers, booleans and nulls removing unnecessary additions\", () => {\n      assertEqual(str`foo ${1} ${true} ${null} bar`, '\"foo 1 true null bar\"')\n    })\n\n    it(\"preserves code\", () => {\n      const data = new Name(\"data\")\n      const code = _`${data}.replace(/~/g, \"~0\")`\n      assertEqual(str`/${code}`, '\"/\"+data.replace(/~/g, \"~0\")')\n      assertEqual(str`/${code}/`, '\"/\"+data.replace(/~/g, \"~0\")+\"/\"')\n    })\n  })\n\n  describe(\"CodeGen\", () => {\n    let gen: CodeGen\n\n    beforeEach(() => {\n      gen = getGen()\n    })\n\n    describe(\"name declarations\", () => {\n      it(\"declares const\", () => {\n        const x = gen.const(\"x\", 1)\n        assert(x instanceof Name)\n        assertEqual(gen, \"const x0 = 1;\")\n      })\n\n      it(\"declares and assigns let\", () => {\n        gen.let(\"x\", 1)\n        assertEqual(gen, \"let x0 = 1;\")\n      })\n\n      it(\"declares let\", () => {\n        gen.let(\"x\")\n        assertEqual(gen, \"let x0;\")\n      })\n\n      it(\"declares and assigns var\", () => {\n        gen.var(\"x\", 1)\n        assertEqual(gen, \"var x0 = 1;\")\n      })\n\n      it(\"adds code\", () => {\n        const x = \"hello\"\n        gen.code(_`console.log(${x})`)\n        gen.code(() => gen.code(_`console.log(${2})`))\n        assertEqual(gen, 'console.log(\"hello\");console.log(2);')\n      })\n\n      it(\"returns code for object literal\", () => {\n        const bar = new Name(\"bar\")\n        const code = gen.object(\n          [new Name(\"foo\"), 1],\n          [bar, bar],\n          [new Name(\"baz\"), str`hello`],\n          [new Name(\"bool\"), true]\n        )\n        assertEqual(code, '{foo:1,bar,baz:\"hello\",bool:true}')\n      })\n    })\n\n    describe(\"`if` statement\", () => {\n      const x = new Name(\"x\")\n      const num = 0\n\n      it(\"renders if/else if/else clauses\", () => {\n        gen.if(_`${x} > ${num}`)\n        log(\"greater\")\n        gen.elseIf(_`${x} < ${num}`)\n        log(\"smaller\")\n        gen.else()\n        log(\"equal\")\n        gen.endIf()\n        gen.optimize()\n        assertEqual(\n          gen,\n          'if(x > 0){console.log(\"greater\");}else if(x < 0){console.log(\"smaller\");}else {console.log(\"equal\");}'\n        )\n      })\n\n      it(\"renders `if` statement with `then` and `else` blocks\", () => {\n        gen.if(\n          _`${x} > ${num}`,\n          () => log(\"greater\"),\n          () => log(\"smaller or equal\")\n        )\n        gen.optimize()\n        assertEqual(\n          gen,\n          'if(x > 0){console.log(\"greater\");}else {console.log(\"smaller or equal\");}'\n        )\n      })\n\n      it(\"renders `if` statement with `then` block\", () => {\n        gen.if(_`${x} > ${num}`, () => log(\"greater\"))\n        assertEqual(gen, 'if(x > 0){console.log(\"greater\");}')\n      })\n\n      it(\"throws exception if `else` block is used without `then` block\", () => {\n        assert.throws(\n          () => gen.if(_`${x} > ${num}`, undefined, () => log(\"smaller or equal\")),\n          /\"else\" body without \"then\" body/\n        )\n      })\n\n      it(\"throws exception if `else` clause is used without `if`\", () => {\n        assert.throws(() => gen.else(), /\"else\" without \"if\"/)\n      })\n\n      it(\"throws exception if `else` clause is used in another block\", () => {\n        gen.func(new Name(\"f\"))\n        assert.throws(() => gen.else(), /\"else\" without \"if\"/)\n      })\n\n      it(\"throws exception if `elseIf` clause is used without `if`\", () => {\n        assert.throws(() => gen.elseIf(_`${x} > ${num}`), /\"else\" without \"if\"/)\n      })\n\n      it(\"throws exception if `elseIf` clause is used in another block\", () => {\n        gen.func(new Name(\"f\"))\n        assert.throws(() => gen.elseIf(_`${x} > ${num}`), /\"else\" without \"if\"/)\n      })\n\n      it(\"throws exception if `endIf` clause is used without `if`\", () => {\n        assert.throws(() => gen.endIf(), /not in block \"if\\/else\"/)\n      })\n\n      it(\"throws exception if `endIf` clause is used in another block\", () => {\n        gen.func(new Name(\"f\"))\n        assert.throws(() => gen.endIf(), /not in block \"if\\/else\"/)\n      })\n\n      it(\"renders `if` with negated condition\", () => {\n        const gt = gen.const(\"gt\", _`${x} > ${num}`)\n        gen.if(not(gt), () => log(\"smaller or equal\"))\n        assertEqual(gen, 'const gt0 = x > 0;if(!gt0){console.log(\"smaller or equal\");}')\n      })\n\n      it(\"throws exception if `else if` is used after `else`\", () => {\n        gen.if(_`${x} > ${num}`)\n        log(\"greater\")\n        gen.else()\n        log(\"smaller or equal\")\n        assert.throws(() => gen.elseIf(_`${x} < ${num}`), /\"else\" without \"if\"/)\n      })\n\n      const nestedIfCode =\n        'if(x > 0){console.log(\"greater\");}else {if(x < 0){console.log(\"smaller\");}else {console.log(\"equal\");}}'\n\n      it(\"renders nested if statements\", () => {\n        gen.if(\n          _`${x} > ${num}`,\n          () => log(\"greater\"),\n          () =>\n            gen.if(\n              _`${x} < ${num}`,\n              () => log(\"smaller\"),\n              () => log(\"equal\")\n            )\n        )\n        gen.optimize()\n        assertEqual(gen, nestedIfCode)\n      })\n\n      it(\"renders nested if statement with block/endBlock\", () => {\n        gen.block()\n        gen.if(_`${x} > ${num}`)\n        log(\"greater\")\n        gen.else().if(_`${x} < ${num}`)\n        log(\"smaller\")\n        gen.else()\n        log(\"equal\")\n        gen.endBlock()\n        gen.optimize()\n        assertEqual(gen, nestedIfCode)\n      })\n\n      it(\"renders nested if statement with block callback-style\", () => {\n        gen.block(() => {\n          gen.if(_`${x} > ${num}`)\n          log(\"greater\")\n          gen.else().if(_`${x} < ${num}`)\n          log(\"smaller\")\n          gen.else()\n          log(\"equal\")\n        })\n        gen.optimize()\n        assertEqual(gen, nestedIfCode)\n      })\n\n      function log(comparison: string): void {\n        gen.code(_`console.log(${comparison})`)\n      }\n    })\n\n    describe(\"for statement\", () => {\n      const xs = new Name(\"xs\")\n\n      it(\"renders `for` for a range\", () => {\n        gen.forRange(\"i\", 0, 5, (i: Name) => gen.code(_`console.log(${xs}[${i}])`))\n        gen.optimize()\n        assertEqual(gen, \"for(let i0=0; i0<5; i0++){console.log(xs[i0]);}\")\n      })\n\n      it(\"renders `for-of` statement\", () => {\n        gen.forOf(\"x\", xs, (x: Name) => gen.code(_`console.log(${x})`))\n        gen.optimize()\n        assertEqual(gen, \"for(const x0 of xs){console.log(x0);}\")\n      })\n\n      it(\"renders `for-of` as for with `es5` option\", () => {\n        const _gen = getGen({es5: true})\n        _gen.forOf(\"x\", xs, (x: Name) => _gen.code(_`console.log(${x})`))\n        _gen.optimize()\n        assertEqual(_gen, \"for(var _i0=0; _i0<xs.length; _i0++){var x0 = xs[_i0];console.log(x0);}\")\n      })\n\n      it(\"renders `for-in` statement\", () => {\n        gen.forIn(\"x\", xs, (x: Name) => gen.code(_`console.log(${x})`))\n        gen.optimize()\n        assertEqual(gen, \"for(const x0 in xs){console.log(x0);}\")\n      })\n\n      it(\"renders `for-in` statement as `for-of` with `ownProperties` option\", () => {\n        const _gen = getGen({ownProperties: true})\n        _gen.forIn(\"x\", xs, (x: Name) => _gen.code(_`console.log(${x})`))\n        _gen.optimize()\n        assertEqual(_gen, \"for(const x0 of Object.keys(xs)){console.log(x0);}\")\n      })\n\n      it(\"renders `for-in` statement as `for` with `ownProperties` and `es5` options\", () => {\n        const _gen = getGen({ownProperties: true, es5: true})\n        _gen.forIn(\"x\", xs, (x: Name) => _gen.code(_`console.log(${x})`))\n        _gen.optimize()\n        assertEqual(\n          _gen,\n          \"var _arr0 = Object.keys(xs);for(var _i0=0; _i0<_arr0.length; _i0++){var x0 = _arr0[_i0];console.log(x0);}\"\n        )\n      })\n\n      const nestendFor =\n        \"let i0 = arr0.length;let j0;outer0:for(;i0--;){for(j0=i0;j0--;){if(arr0[i0] === arr0[j0]){break outer0;}}}\"\n\n      it(\"renders generic clause `for` with `label` and `break` in self-balancing block\", () => {\n        const outer = gen.name(\"outer\")\n        const arr = gen.name(\"arr\")\n        const i = gen.let(\"i\", _`${arr}.length`)\n        const j = gen.let(\"j\")\n        gen\n          .block()\n          .label(outer)\n          .for(_`;${i}--;`)\n          .for(_`${j}=${i};${j}--;`)\n          .if(_`${arr}[${i}] === ${arr}[${j}]`)\n          .break(outer)\n          .endBlock()\n        gen.optimize()\n        assertEqual(gen, nestendFor)\n      })\n\n      it(\"renders generic statement `for` with `label` and `break`\", () => {\n        const outer = gen.name(\"outer\")\n        const arr = gen.name(\"arr\")\n        const i = gen.let(\"i\", _`${arr}.length`)\n        const j = gen.let(\"j\")\n        gen\n          .label(outer)\n          .for(_`;${i}--;`, () =>\n            gen.for(_`${j}=${i};${j}--;`, () =>\n              gen.if(_`${arr}[${i}] === ${arr}[${j}]`, () => gen.break(outer))\n            )\n          )\n        gen.optimize()\n        assertEqual(gen, nestendFor)\n      })\n    })\n\n    describe(\"function definition\", () => {\n      it(\"renders function with `return` and `try` statements\", () => {\n        const inverse = new Name(\"inverse\")\n        const x = gen.name(\"x\")\n        gen\n          .func(inverse, x)\n          .try(\n            () => gen.return(_`1/${x}`),\n            (e) => gen.code(_`console.error(${str`dividing ${x} by 0`})`).throw(e)\n          )\n          .endFunc()\n        gen.optimize()\n        assertEqual(\n          gen,\n          'function inverse(x0){try{return 1/x0;}catch(e0){console.error(\"dividing \"+x0+\" by 0\");throw e0;}}'\n        )\n      })\n    })\n\n    describe(\"`try` statement\", () => {\n      it(\"should render `try/catch/finally`\", () => {\n        gen.try(_`log(\"try\")`, (e) => gen.code(_`log(${e})`), _`log(\"fin\")`)\n        gen.optimize()\n        assertEqual(gen, 'try{log(\"try\");}catch(e0){log(e0);}finally{log(\"fin\");}')\n      })\n\n      it(\"should render `try/finally`\", () => {\n        gen.try(_`log(\"try\")`, undefined, _`log(\"fin\")`)\n        gen.optimize()\n        assertEqual(gen, 'try{log(\"try\");}finally{log(\"fin\");}')\n      })\n    })\n\n    describe(\"code optimization\", () => {\n      const valid = new Name(\"valid\")\n\n      it(\"should remove empty `if`\", () => {\n        gen.if(valid).endIf()\n        assertEqual(gen, \"if(valid){}\")\n        gen.optimize()\n        assertEqual(gen, \"\")\n      })\n\n      it(\"should remove empty `else`\", () => {\n        gen\n          .if(valid)\n          .code(_`log(\"if\")`)\n          .else()\n          .endIf()\n        assertEqual(gen, 'if(valid){log(\"if\");}else {}')\n        gen.optimize()\n        assertEqual(gen, 'if(valid){log(\"if\");}')\n      })\n\n      it(\"should remove `else` from always valid `if` condition\", () => {\n        gen\n          .if(true)\n          .code(_`log(\"if\")`)\n          .else()\n          .code(_`log(\"else\")`)\n          .endIf()\n        assertEqual(gen, 'if(true){log(\"if\");}else {log(\"else\");}')\n        gen.optimize()\n        assertEqual(gen, 'log(\"if\");')\n      })\n\n      it(\"should remove `if` from always invalid `if` condition\", () => {\n        gen\n          .if(false)\n          .code(_`log(\"if\")`)\n          .else()\n          .code(_`log(\"else\")`)\n          .endIf()\n        assertEqual(gen, 'if(false){log(\"if\");}else {log(\"else\");}')\n        gen.optimize()\n        assertEqual(gen, 'log(\"else\");')\n      })\n\n      it(\"should remove empty `if` and keep `else`\", () => {\n        gen\n          .if(valid)\n          .else()\n          .code(_`log(\"else\")`)\n          .endIf()\n        assertEqual(gen, 'if(valid){}else {log(\"else\");}')\n        gen.optimize()\n        assertEqual(gen, 'if(!valid){log(\"else\");}')\n      })\n\n      it(\"should remove empty `for`\", () => {\n        gen.for(_`const x of xs`).endFor()\n        assertEqual(gen, \"for(const x of xs){}\")\n        gen.optimize()\n        assertEqual(gen, \"\")\n      })\n\n      it(\"should remove unused names\", () => {\n        gen.const(\"x\", 0)\n        assertEqual(gen, \"const x0 = 0;\")\n        gen.optimize()\n        assertEqual(gen, \"\")\n      })\n\n      it(\"should remove names used in removed branches\", () => {\n        const x = gen.const(\"x\", 0)\n        gen.if(_`${x} === 0`).endIf()\n        assertEqual(gen, \"const x0 = 0;if(x0 === 0){}\")\n        gen.optimize()\n        assertEqual(gen, \"\")\n      })\n\n      it('should replace names with \"constant\" expressions if used only once', () => {\n        const data = new Name(\"data\")\n        const x = gen.const(\"x\", _`${data}.prop`, true) // true means that the expression `data.prop` is \"constant\"\n        gen\n          .if(_`${x} === 0`)\n          .code(_`log()`)\n          .endIf()\n        assertEqual(gen, \"const x0 = data.prop;if(x0 === 0){log();}\")\n        gen.optimize()\n        assertEqual(gen, \"if(data.prop === 0){log();}\")\n      })\n    })\n  })\n\n  describe(\"external scope\", () => {\n    let gen: CodeGen\n    let scope: ScopeStore\n\n    beforeEach(() => {\n      scope = {}\n      gen = new CodeGen(new ValueScope({scope}))\n    })\n\n    it(\"defines and renders value references and values code\", () => {\n      gen.scopeValue(\"val\", {ref: 1, code: _`1`})\n      assert.deepEqual(gen.getScopeValue(\"val\", 1)?.value, {\n        ref: 1,\n        code: _`1`,\n      })\n      assertEqual(gen.scopeRefs(new Name(\"scope\")), \"const val0 = scope.val[0];\")\n      assertEqual(gen.scopeCode(), \"const val0 = 1;\")\n    })\n  })\n})\n\nfunction assertEqual(code: Code | CodeGen, s: string): void {\n  assert.strictEqual(code.toString(), s)\n}\n\nfunction getGen(opts?: CodeGenOptions): CodeGen {\n  return new CodeGen(new ValueScope({scope: {}}), opts)\n}\n"
  },
  {
    "path": "spec/coercion.spec.ts",
    "content": "import type Ajv from \"..\"\nimport _Ajv from \"./ajv\"\nimport chai from \"./chai\"\nchai.should()\n\nconst coercionRules = {\n  string: {\n    number: [\n      {from: 1, to: \"1\"},\n      {from: 1.5, to: \"1.5\"},\n      {from: 2e100, to: \"2e+100\"},\n    ],\n    boolean: [\n      {from: false, to: \"false\"},\n      {from: true, to: \"true\"},\n    ],\n    null: [{from: null, to: \"\"}],\n    object: [{from: {}, to: undefined}],\n    array: [\n      {from: [], to: undefined},\n      {from: [1], to: undefined},\n    ],\n  },\n  number: {\n    string: [\n      {from: \"1\", to: 1},\n      {from: \"1.5\", to: 1.5},\n      {from: \"2e10\", to: 2e10},\n      {from: \"1a\", to: undefined},\n      {from: \"abc\", to: undefined},\n      {from: \"\", to: undefined},\n    ],\n    boolean: [\n      {from: false, to: 0},\n      {from: true, to: 1},\n    ],\n    null: [{from: null, to: 0}],\n    object: [{from: {}, to: undefined}],\n    array: [\n      {from: [], to: undefined},\n      {from: [true], to: undefined},\n    ],\n  },\n  integer: {\n    string: [\n      {from: \"1\", to: 1},\n      {from: \"1.5\", to: undefined},\n      {from: \"2e10\", to: 2e10},\n      {from: \"1a\", to: undefined},\n      {from: \"abc\", to: undefined},\n      {from: \"\", to: undefined},\n    ],\n    boolean: [\n      {from: false, to: 0},\n      {from: true, to: 1},\n    ],\n    null: [{from: null, to: 0}],\n    object: [{from: {}, to: undefined}],\n    array: [\n      {from: [], to: undefined},\n      {from: [\"1\"], to: undefined},\n    ],\n  },\n  boolean: {\n    string: [\n      {from: \"false\", to: false},\n      {from: \"true\", to: true},\n      {from: \"\", to: undefined},\n      {from: \"abc\", to: undefined},\n    ],\n    number: [\n      {from: 0, to: false},\n      {from: 1, to: true},\n      {from: 2, to: undefined},\n      {from: 2.5, to: undefined},\n    ],\n    null: [{from: null, to: false}],\n    object: [{from: {}, to: undefined}],\n    array: [\n      {from: [], to: undefined},\n      {from: [0], to: undefined},\n    ],\n  },\n  null: {\n    string: [\n      {from: \"\", to: null},\n      {from: \"abc\", to: undefined},\n      {from: \"null\", to: undefined},\n    ],\n    number: [\n      {from: 0, to: null},\n      {from: 1, to: undefined},\n    ],\n    boolean: [\n      {from: false, to: null},\n      {from: true, to: undefined},\n    ],\n    object: [{from: {}, to: undefined}],\n    array: [\n      {from: [], to: undefined},\n      {from: [null], to: undefined},\n    ],\n  },\n  array: {\n    all: [\n      {type: \"string\", from: \"abc\", to: undefined},\n      {type: \"number\", from: 1, to: undefined},\n      {type: \"boolean\", from: true, to: undefined},\n      {type: \"null\", from: null, to: undefined},\n      {type: \"object\", from: {}, to: undefined},\n    ],\n  },\n  object: {\n    all: [\n      {type: \"string\", from: \"abc\", to: undefined},\n      {type: \"number\", from: 1, to: undefined},\n      {type: \"boolean\", from: true, to: undefined},\n      {type: \"null\", from: null, to: undefined},\n      {type: \"array\", from: [], to: undefined},\n    ],\n  },\n}\n\nconst coercionArrayRules = JSON.parse(JSON.stringify(coercionRules))\ncoercionArrayRules.string.array = [\n  {from: [\"abc\"], to: \"abc\"},\n  {from: [123], to: \"123\"},\n  {from: [true], to: \"true\"},\n  {from: [null], to: \"\"},\n  {from: [{}], to: undefined},\n  {from: [\"abc\", \"def\"], to: undefined},\n  {from: [], to: undefined},\n]\ncoercionArrayRules.number.array = [\n  {from: [1.5], to: 1.5},\n  {from: [\"1.5\"], to: 1.5},\n  {from: [true], to: 1},\n  {from: [null], to: 0},\n  {from: [\"abc\"], to: undefined},\n  {from: [{}], to: undefined},\n]\ncoercionArrayRules.integer.array = [\n  {from: [1], to: 1},\n  {from: [\"1\"], to: 1},\n  {from: [true], to: 1},\n  {from: [null], to: 0},\n  {from: [1.5], to: undefined},\n  {from: [\"abc\"], to: undefined},\n  {from: [{}], to: undefined},\n]\ncoercionArrayRules.boolean.array = [\n  {from: [true], to: true},\n  {from: [\"true\"], to: true},\n  {from: [1], to: true},\n  {from: [null], to: false},\n  {from: [\"abc\"], to: undefined},\n  {from: [2], to: undefined},\n  {from: [{}], to: undefined},\n]\ncoercionArrayRules.null.array = [\n  {from: [null], to: null},\n  {from: [\"\"], to: null},\n  {from: [0], to: null},\n  {from: [false], to: null},\n  {from: [\"abc\"], to: undefined},\n  {from: [1], to: undefined},\n  {from: [true], to: undefined},\n  {from: [{}], to: undefined},\n]\ncoercionArrayRules.object.array = [{from: [{}], to: undefined}]\n\ncoercionArrayRules.array = {\n  string: [{from: \"abc\", to: [\"abc\"]}],\n  number: [{from: 1, to: [1]}],\n  boolean: [{from: true, to: [true]}],\n  null: [{from: null, to: [null]}],\n  object: [{from: {}, to: undefined}],\n}\n\ndescribe(\"Type coercion\", () => {\n  let ajv: Ajv, fullAjv: Ajv, instances: Ajv[]\n\n  beforeEach(() => {\n    ajv = new _Ajv({coerceTypes: true, verbose: true, allowUnionTypes: true})\n    fullAjv = new _Ajv({coerceTypes: true, verbose: true, allErrors: true, allowUnionTypes: true})\n    instances = [ajv, fullAjv]\n  })\n\n  it(\"should coerce scalar values\", () => {\n    testRules(coercionRules, (test, schema, canCoerce /*, toType, fromType*/) => {\n      instances.forEach((_ajv) => {\n        const valid = _ajv.validate(schema, test.from)\n        //if (valid !== canCoerce) console.log('true', toType, fromType, test, ajv.errors);\n        valid.should.equal(canCoerce)\n      })\n    })\n  })\n\n  it(\"should coerce scalar values (coerceTypes = array)\", () => {\n    ajv = new _Ajv({coerceTypes: \"array\", verbose: true})\n    fullAjv = new _Ajv({coerceTypes: \"array\", verbose: true, allErrors: true})\n    instances = [ajv, fullAjv]\n\n    testRules(coercionArrayRules, (test, schema, canCoerce, toType, fromType) => {\n      instances.forEach((_ajv) => {\n        const valid = _ajv.validate(schema, test.from)\n        if (valid !== canCoerce) console.log(toType, \".\", fromType, test, schema, ajv.errors)\n        valid.should.equal(canCoerce)\n      })\n    })\n  })\n\n  it(\"should coerce values in objects/arrays and update properties/items\", () => {\n    testRules(coercionRules, (test, schema, canCoerce /*, toType, fromType*/) => {\n      const schemaObject = {\n        type: \"object\",\n        properties: {\n          foo: schema,\n        },\n      }\n\n      const schemaArray = {\n        type: \"array\",\n        items: schema,\n      }\n\n      const schemaArrObj = {\n        type: \"array\",\n        items: schemaObject,\n      }\n\n      instances.forEach((_ajv) => {\n        testCoercion(_ajv, schemaArray, [test.from], [test.to])\n        testCoercion(_ajv, schemaObject, {foo: test.from}, {foo: test.to})\n        testCoercion(_ajv, schemaArrObj, [{foo: test.from}], [{foo: test.to}])\n      })\n\n      function testCoercion(_ajv, _schema, fromData, toData) {\n        const valid = _ajv.validate(_schema, fromData)\n        //if (valid !== canCoerce) console.log(schema, fromData, toData);\n        valid.should.equal(canCoerce)\n        if (valid) fromData.should.eql(toData)\n      }\n    })\n  })\n\n  it(\"should coerce to multiple types in order with number type\", () => {\n    const schema = {\n      type: \"object\",\n      properties: {\n        foo: {\n          type: [\"number\", \"boolean\", \"null\"],\n        },\n      },\n    }\n\n    instances.forEach((_ajv) => {\n      let data\n\n      _ajv.validate(schema, (data = {foo: \"1\"})).should.equal(true)\n      data.should.eql({foo: 1})\n\n      _ajv.validate(schema, (data = {foo: \"1.5\"})).should.equal(true)\n      data.should.eql({foo: 1.5})\n\n      _ajv.validate(schema, (data = {foo: \"false\"})).should.equal(true)\n      data.should.eql({foo: false})\n\n      _ajv.validate(schema, (data = {foo: 1})).should.equal(true)\n      data.should.eql({foo: 1}) // no coercion\n\n      _ajv.validate(schema, (data = {foo: true})).should.equal(true)\n      data.should.eql({foo: true}) // no coercion\n\n      _ajv.validate(schema, (data = {foo: null})).should.equal(true)\n      data.should.eql({foo: null}) // no coercion\n\n      _ajv.validate(schema, (data = {foo: \"abc\"})).should.equal(false)\n      data.should.eql({foo: \"abc\"}) // can't coerce\n\n      _ajv.validate(schema, (data = {foo: {}})).should.equal(false)\n      data.should.eql({foo: {}}) // can't coerce\n\n      _ajv.validate(schema, (data = {foo: []})).should.equal(false)\n      data.should.eql({foo: []}) // can't coerce\n    })\n  })\n\n  it(\"should coerce to multiple types in order with integer type\", () => {\n    const schema = {\n      type: \"object\",\n      properties: {\n        foo: {\n          type: [\"integer\", \"boolean\", \"null\"],\n        },\n      },\n    }\n\n    instances.forEach((_ajv) => {\n      let data\n\n      _ajv.validate(schema, (data = {foo: \"1\"})).should.equal(true)\n      data.should.eql({foo: 1})\n\n      _ajv.validate(schema, (data = {foo: \"false\"})).should.equal(true)\n      data.should.eql({foo: false})\n\n      _ajv.validate(schema, (data = {foo: 1})).should.equal(true)\n      data.should.eql({foo: 1}) // no coercion\n\n      _ajv.validate(schema, (data = {foo: true})).should.equal(true)\n      data.should.eql({foo: true}) // no coercion\n\n      _ajv.validate(schema, (data = {foo: null})).should.equal(true)\n      data.should.eql({foo: null}) // no coercion\n\n      _ajv.validate(schema, (data = {foo: \"abc\"})).should.equal(false)\n      data.should.eql({foo: \"abc\"}) // can't coerce\n\n      _ajv.validate(schema, (data = {foo: {}})).should.equal(false)\n      data.should.eql({foo: {}}) // can't coerce\n\n      _ajv.validate(schema, (data = {foo: []})).should.equal(false)\n      data.should.eql({foo: []}) // can't coerce\n    })\n  })\n\n  it(\"should fail to coerce non-number if multiple properties/items are coerced (issue #152)\", () => {\n    const schema = {\n      type: \"object\",\n      properties: {\n        foo: {type: \"number\"},\n        bar: {type: \"number\"},\n      },\n    }\n\n    const schema2 = {\n      type: \"array\",\n      items: {type: \"number\"},\n    }\n\n    instances.forEach((_ajv) => {\n      const data: any = {foo: \"123\", bar: \"bar\"}\n      _ajv.validate(schema, data).should.equal(false)\n      data.should.eql({foo: 123, bar: \"bar\"})\n\n      const data2: any = [\"123\", \"bar\"]\n      _ajv.validate(schema2, data2).should.equal(false)\n      data2.should.eql([123, \"bar\"])\n    })\n  })\n\n  it(\"should update data if the schema is in ref that is not inlined\", () => {\n    instances.push(new _Ajv({coerceTypes: true, inlineRefs: false, allowUnionTypes: true}))\n\n    const schema = {\n      type: \"object\",\n      definitions: {\n        foo: {type: \"number\"},\n      },\n      properties: {\n        foo: {$ref: \"#/definitions/foo\"},\n      },\n    }\n\n    const schema2 = {\n      type: \"object\",\n      definitions: {\n        foo: {\n          // allOf is needed to make sure that \"foo\" is compiled to a separate function\n          // and not simply passed through (as it would be if it were only $ref)\n          allOf: [{$ref: \"#/definitions/bar\"}],\n        },\n        bar: {type: \"number\"},\n      },\n      properties: {\n        foo: {$ref: \"#/definitions/foo\"},\n      },\n    }\n\n    const schemaRecursive = {\n      type: [\"object\", \"number\"],\n      properties: {\n        foo: {$ref: \"#\"},\n      },\n    }\n\n    const schemaRecursive2 = {\n      $id: \"http://e.com/schema.json#\",\n      definitions: {\n        foo: {\n          $id: \"http://e.com/foo.json#\",\n          type: [\"object\", \"number\"],\n          properties: {\n            foo: {$ref: \"#\"},\n          },\n        },\n      },\n      type: \"object\",\n      properties: {\n        foo: {$ref: \"http://e.com/foo.json#\"},\n      },\n    }\n\n    instances.forEach((_ajv) => {\n      testCoercion(schema, {foo: \"1\"}, {foo: 1})\n      testCoercion(schema2, {foo: \"1\"}, {foo: 1})\n      testCoercion(schemaRecursive, {foo: {foo: \"1\"}}, {foo: {foo: 1}})\n      testCoercion(schemaRecursive2, {foo: {foo: {foo: \"1\"}}}, {foo: {foo: {foo: 1}}})\n\n      function testCoercion(_schema, fromData, toData) {\n        const valid = _ajv.validate(_schema, fromData)\n        // if (!valid) console.log(schema, fromData, toData);\n        valid.should.equal(true)\n        fromData.should.eql(toData)\n      }\n    })\n  })\n\n  it(\"should generate one error for type with coerceTypes option (issue #469)\", () => {\n    const schema = {\n      type: \"number\",\n      minimum: 10,\n    }\n\n    instances.forEach((_ajv) => {\n      const validate = _ajv.compile(schema)\n      validate(9).should.equal(false)\n      validate.errors?.length.should.equal(1)\n\n      validate(11).should.equal(true)\n\n      validate(\"foo\").should.equal(false)\n      validate.errors?.length.should.equal(1)\n    })\n  })\n\n  it('should check \"uniqueItems\" after coercion', () => {\n    const schema = {\n      type: \"array\",\n      items: {type: \"number\"},\n      uniqueItems: true,\n    }\n\n    instances.forEach((_ajv) => {\n      const validate = _ajv.compile(schema)\n      validate([1, \"2\", 3]).should.equal(true)\n\n      validate([1, \"2\", 2]).should.equal(false)\n      validate.errors?.length.should.equal(1)\n      validate.errors?.[0].keyword.should.equal(\"uniqueItems\")\n    })\n  })\n\n  it('should check \"contains\" after coercion', () => {\n    const schema = {\n      type: \"array\",\n      items: {type: \"number\"},\n      contains: {const: 2},\n    }\n\n    instances.forEach((_ajv) => {\n      const validate = _ajv.compile(schema)\n      validate([1, \"2\", 3]).should.equal(true)\n\n      validate([1, \"3\", 4]).should.equal(false)\n      validate.errors?.pop()?.keyword.should.equal(\"contains\")\n    })\n  })\n\n  function testRules(rules, cb) {\n    for (const toType in rules) {\n      for (const fromType in rules[toType]) {\n        const tests = rules[toType][fromType]\n        tests.forEach((test) => {\n          const canCoerce = test.to !== undefined\n          const schema = canCoerce\n            ? Array.isArray(test.to)\n              ? {type: toType, items: {type: fromType, enum: [test.to[0]]}}\n              : {type: toType, enum: [test.to]}\n            : {type: toType}\n          cb(test, schema, canCoerce, toType, fromType)\n        })\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "spec/discriminator.spec.ts",
    "content": "import type Ajv from \"..\"\nimport type AjvPack from \"../dist/standalone/instance\"\nimport type AjvCore from \"../dist/core\"\nimport type {SchemaObject} from \"..\"\nimport _Ajv from \"./ajv\"\nimport _Ajv2019 from \"./ajv2019\"\nimport getAjvInstances from \"./ajv_instances\"\nimport {withStandalone} from \"./ajv_standalone\"\nimport options from \"./ajv_options\"\nimport * as assert from \"assert\"\n\ndescribe(\"discriminator keyword\", function () {\n  let ajvs: (Ajv | AjvPack)[]\n\n  this.timeout(10000)\n\n  before(() => {\n    ajvs = [...getAjvs(_Ajv), ...getAjvs(_Ajv2019)]\n  })\n\n  function getAjvs(AjvClass: typeof AjvCore) {\n    return withStandalone(getAjvInstances(AjvClass, options, {discriminator: true}))\n  }\n\n  describe(\"validation\", () => {\n    const schema1 = {\n      type: \"object\",\n      discriminator: {propertyName: \"foo\"},\n      oneOf: [\n        {\n          properties: {\n            foo: {const: \"x\"},\n            a: {type: \"string\"},\n          },\n          required: [\"foo\", \"a\"],\n        },\n        {\n          properties: {\n            foo: {enum: [\"y\", \"z\"]},\n            b: {type: \"string\"},\n          },\n          required: [\"foo\", \"b\"],\n        },\n      ],\n    }\n\n    const schema2 = {\n      type: \"object\",\n      discriminator: {propertyName: \"foo\"},\n      required: [\"foo\"],\n      oneOf: [\n        {\n          properties: {\n            foo: {const: \"x\"},\n            a: {type: \"string\"},\n          },\n          required: [\"a\"],\n        },\n        {\n          properties: {\n            foo: {enum: [\"y\", \"z\"]},\n            b: {type: \"string\"},\n          },\n          required: [\"b\"],\n        },\n      ],\n    }\n\n    const schemas = [schema1, schema2]\n\n    it(\"should validate data\", () => {\n      assertValid(schemas, {foo: \"x\", a: \"a\"})\n      assertValid(schemas, {foo: \"y\", b: \"b\"})\n      assertValid(schemas, {foo: \"z\", b: \"b\"})\n      assertInvalid(schemas, {})\n      assertInvalid(schemas, {foo: 1})\n      assertInvalid(schemas, {foo: \"bar\"})\n      assertInvalid(schemas, {foo: \"x\", b: \"b\"})\n      assertInvalid(schemas, {foo: \"y\", a: \"a\"})\n      assertInvalid(schemas, {foo: \"z\", a: \"a\"})\n    })\n  })\n\n  describe(\"validation with referenced schemas\", () => {\n    const definitions1 = {\n      schema1: {\n        properties: {\n          foo: {const: \"x\"},\n          a: {type: \"string\"},\n        },\n        required: [\"foo\", \"a\"],\n      },\n      schema2: {\n        properties: {\n          foo: {enum: [\"y\", \"z\"]},\n          b: {type: \"string\"},\n        },\n        required: [\"foo\", \"b\"],\n      },\n    }\n    const mainSchema1 = {\n      type: \"object\",\n      discriminator: {propertyName: \"foo\"},\n      oneOf: [\n        {\n          $ref: \"#/definitions/schema1\",\n        },\n        {\n          $ref: \"#/definitions/schema2\",\n        },\n      ],\n    }\n\n    const definitions2 = {\n      schema1: {\n        properties: {\n          foo: {const: \"x\"},\n          a: {type: \"string\"},\n        },\n        required: [\"a\"],\n      },\n      schema2: {\n        properties: {\n          foo: {enum: [\"y\", \"z\"]},\n          b: {type: \"string\"},\n        },\n        required: [\"b\"],\n      },\n    }\n    const mainSchema2 = {\n      type: \"object\",\n      discriminator: {propertyName: \"foo\"},\n      required: [\"foo\"],\n      oneOf: [\n        {\n          $ref: \"#/definitions/schema1\",\n        },\n        {\n          $ref: \"#/definitions/schema2\",\n        },\n      ],\n    }\n\n    const schema = [\n      {definitions: definitions1, ...mainSchema1},\n      {definitions: definitions2, ...mainSchema2},\n    ]\n\n    it(\"should validate data\", () => {\n      assertValid(schema, {foo: \"x\", a: \"a\"})\n      assertValid(schema, {foo: \"y\", b: \"b\"})\n      assertValid(schema, {foo: \"z\", b: \"b\"})\n      assertInvalid(schema, {})\n      assertInvalid(schema, {foo: 1})\n      assertInvalid(schema, {foo: \"bar\"})\n      assertInvalid(schema, {foo: \"x\", b: \"b\"})\n      assertInvalid(schema, {foo: \"y\", a: \"a\"})\n      assertInvalid(schema, {foo: \"z\", a: \"a\"})\n    })\n  })\n\n  describe(\"schema with external $refs\", () => {\n    const schemas = {\n      main: {\n        type: \"object\",\n        discriminator: {propertyName: \"foo\"},\n        required: [\"foo\"],\n        oneOf: [\n          {\n            $ref: \"schema1\",\n          },\n          {\n            $ref: \"schema2\",\n          },\n        ],\n      },\n      schema1: {\n        type: \"object\",\n        properties: {\n          foo: {const: \"x\"},\n        },\n      },\n      schema2: {\n        type: \"object\",\n        properties: {\n          foo: {enum: [\"y\", \"z\"]},\n        },\n      },\n    }\n\n    const data = {foo: \"x\"}\n    const badData = {foo: \"w\"}\n\n    it(\"compile should resolve each $ref to a schema that was added with addSchema\", () => {\n      const opts = {\n        discriminator: true,\n      }\n      const ajv = new _Ajv(opts)\n      ajv.addSchema(schemas.main, \"https://host/main\")\n      ajv.addSchema(schemas.schema1, \"https://host/schema1\")\n      ajv.addSchema(schemas.schema2, \"https://host/schema2\")\n\n      const validate = ajv.compile({$ref: \"https://host/main\"})\n      assert.strictEqual(validate(data), true)\n      assert.strictEqual(validate(badData), false)\n    })\n    it(\"compileAsync should loadSchema each $ref\", async () => {\n      const opts = {\n        discriminator: true,\n        loadSchema(url) {\n          if (!url.startsWith(\"https://host/\")) return undefined\n          const name = url.substring(\"https://host/\".length)\n          return schemas[name]\n        },\n      }\n      const ajv = new _Ajv(opts)\n      const validate = await ajv.compileAsync({$ref: \"https://host/main\"})\n      assert.strictEqual(validate(data), true)\n      assert.strictEqual(validate(badData), false)\n    })\n  })\n\n  describe(\"validation with deeply referenced schemas\", () => {\n    const schema = [\n      {\n        type: \"object\",\n        properties: {\n          container: {\n            $ref: \"#/definitions/Container\",\n          },\n        },\n        definitions: {\n          BlockA: {\n            type: \"object\",\n            properties: {\n              _type: {\n                type: \"string\",\n                enum: [\"a\"],\n              },\n              a: {type: \"string\"},\n            },\n            additionalProperties: false,\n            required: [\"_type\"],\n            title: \"BlockA\",\n          },\n          BlockB: {\n            type: \"object\",\n            properties: {\n              _type: {\n                type: \"string\",\n                enum: [\"b\"],\n              },\n              b: {type: \"string\"},\n            },\n            additionalProperties: false,\n            required: [\"_type\"],\n            title: \"BlockB\",\n          },\n          Container: {\n            type: \"object\",\n            properties: {\n              list: {\n                type: \"array\",\n                items: {\n                  oneOf: [\n                    {\n                      $ref: \"#/definitions/BlockA\",\n                    },\n                    {\n                      $ref: \"#/definitions/BlockB\",\n                    },\n                  ],\n                  discriminator: {\n                    propertyName: \"_type\",\n                  },\n                },\n              },\n            },\n          },\n        },\n      },\n    ]\n\n    it(\"should validate data\", () => {\n      assertValid(schema, {\n        container: {\n          list: [\n            {_type: \"a\", a: \"foo\"},\n            {_type: \"b\", b: \"bar\"},\n          ],\n        },\n      })\n\n      assertInvalid(schema, {\n        container: {\n          list: [\n            {_type: \"a\", b: \"foo\"},\n            {_type: \"b\", b: \"bar\"},\n          ],\n        },\n      })\n    })\n  })\n\n  describe(\"valid schemas\", () => {\n    it(\"should have oneOf\", () => {\n      invalidSchema(\n        {type: \"object\", discriminator: {propertyName: \"foo\"}},\n        /discriminator: requires oneOf/\n      )\n    })\n\n    it(\"should have schema for tag\", () => {\n      invalidSchema(\n        {\n          type: \"object\",\n          discriminator: {propertyName: \"foo\"},\n          required: [\"foo\"],\n          oneOf: [{properties: {}}],\n        },\n        /discriminator: oneOf subschemas \\(or referenced schemas\\) must have \"properties\\/foo\"/\n      )\n    })\n\n    it(\"should have enum or const in schema for tag\", () => {\n      invalidSchema(\n        {\n          type: \"object\",\n          discriminator: {propertyName: \"foo\"},\n          required: [\"foo\"],\n          oneOf: [{properties: {foo: {}}}],\n        },\n        /discriminator: \"properties\\/foo\" must have \"const\" or \"enum\"/\n      )\n    })\n\n    it(\"tag value should be string\", () => {\n      invalidSchema(\n        {\n          type: \"object\",\n          discriminator: {propertyName: \"foo\"},\n          required: [\"foo\"],\n          oneOf: [{properties: {foo: {const: 1}}}],\n        },\n        /discriminator: \"foo\" values must be unique strings/\n      )\n    })\n\n    it(\"tag values should be unique\", () => {\n      invalidSchema(\n        {\n          type: \"object\",\n          discriminator: {propertyName: \"foo\"},\n          required: [\"foo\"],\n          oneOf: [{properties: {foo: {const: \"a\"}}}, {properties: {foo: {const: \"a\"}}}],\n        },\n        /discriminator: \"foo\" values must be unique strings/\n      )\n    })\n\n    it(\"tag should be required\", () => {\n      invalidSchema(\n        {\n          type: \"object\",\n          discriminator: {propertyName: \"foo\"},\n          oneOf: [\n            {properties: {foo: {const: \"a\"}}, required: [\"foo\"]},\n            {properties: {foo: {const: \"b\"}}},\n          ],\n        },\n        /discriminator: \"foo\" must be required/\n      )\n    })\n  })\n\n  function assertValid(schemas: SchemaObject[], data: unknown): void {\n    schemas.forEach((schema) =>\n      ajvs.forEach((ajv) => assert.strictEqual(ajv.validate(schema, data), true))\n    )\n  }\n\n  function assertInvalid(schemas: SchemaObject[], data: unknown): void {\n    schemas.forEach((schema) =>\n      ajvs.forEach((ajv) => assert.strictEqual(ajv.validate(schema, data), false))\n    )\n  }\n\n  function invalidSchema(schema: SchemaObject, error: any): void {\n    ajvs.forEach((ajv) => assert.throws(() => ajv.compile(schema), error))\n  }\n})\n"
  },
  {
    "path": "spec/dynamic-ref.spec.ts",
    "content": "import type Ajv from \"../dist/core\"\nimport type {SchemaObject} from \"..\"\nimport _Ajv from \"./ajv2019\"\nimport getAjvInstances from \"./ajv_instances\"\nimport options from \"./ajv_options\"\nimport assert = require(\"assert\")\n\ndescribe(\"recursiveRef and dynamicRef\", () => {\n  let ajvs: Ajv[]\n\n  beforeEach(() => {\n    ajvs = getAjvInstances(_Ajv, options)\n  })\n\n  describe(\"recursiveRef\", () => {\n    it(\"should allow extending recursive schema with recursiveRef (draft2019-09)\", () => {\n      const treeSchema = {\n        $id: \"https://example.com/tree\",\n        $recursiveAnchor: true,\n        type: \"object\",\n        required: [\"data\"],\n        properties: {\n          data: true,\n          children: {\n            type: \"array\",\n            items: {\n              $recursiveRef: \"#\",\n            },\n          },\n        },\n      }\n\n      const strictTreeSchema = {\n        $id: \"https://example.com/strict-tree\",\n        $recursiveAnchor: true,\n        $ref: \"tree\",\n        type: \"object\",\n        unevaluatedProperties: false,\n      }\n\n      testTree(treeSchema, strictTreeSchema)\n    })\n  })\n\n  describe(\"dynamicRef\", () => {\n    it(\"should allow extending recursive schema with dynamicRef (future draft2020)\", () => {\n      const treeSchema = {\n        $id: \"https://example.com/tree\",\n        $dynamicAnchor: \"node\",\n        type: \"object\",\n        required: [\"data\"],\n        properties: {\n          data: true,\n          children: {\n            type: \"array\",\n            items: {\n              $dynamicRef: \"#node\",\n            },\n          },\n        },\n      }\n\n      const strictTreeSchema = {\n        $id: \"https://example.com/strict-tree\",\n        $dynamicAnchor: \"node\",\n        $ref: \"tree\",\n        type: \"object\",\n        unevaluatedProperties: false,\n      }\n\n      testTree(treeSchema, strictTreeSchema)\n    })\n  })\n\n  function testTree(treeSchema: SchemaObject, strictTreeSchema: SchemaObject): void {\n    const validTree = {\n      data: 1,\n      children: [\n        {\n          data: 2,\n          children: [{data: 3}],\n        },\n      ],\n    }\n\n    const invalidTree = {\n      data: 1,\n      children: [\n        {\n          data: 2,\n          children: {},\n        },\n      ],\n    }\n\n    const treeWithExtra = {\n      data: 1,\n      children: [{data: 2, extra: 2}],\n    }\n\n    const treeWithDeepExtra = {\n      data: 1,\n      children: [\n        {\n          data: 2,\n          children: [{data: 3, extra: 3}],\n        },\n      ],\n    }\n\n    ajvs.forEach((ajv) => {\n      const validate = ajv.compile(treeSchema)\n      assert.strictEqual(validate(validTree), true)\n      assert.strictEqual(validate(invalidTree), false)\n      assert.strictEqual(validate(treeWithExtra), true) // because unevaluated props allowed\n      assert.strictEqual(validate(treeWithDeepExtra), true) // because unevaluated props allowed\n      const validateStrict = ajv.compile(strictTreeSchema)\n      assert.strictEqual(validateStrict(validTree), true)\n      assert.strictEqual(validateStrict(invalidTree), false)\n      assert.strictEqual(validateStrict(treeWithExtra), false) // because \"extra\" is \"unevaluated\"\n      assert.strictEqual(validateStrict(treeWithDeepExtra), false) // because \"extra\" is \"unevaluated\"\n    })\n  }\n})\n"
  },
  {
    "path": "spec/errors.spec.ts",
    "content": "import type Ajv from \"..\"\nimport type {ValidateFunction} from \"..\"\nimport _Ajv from \"./ajv\"\nimport chai from \"./chai\"\nconst should = chai.should()\n\ndescribe(\"Validation errors\", () => {\n  let ajv: Ajv, ajvJP: Ajv, fullAjv: Ajv\n\n  beforeEach(() => {\n    createInstances()\n  })\n\n  function createInstances() {\n    const opts = {\n      loopRequired: 21,\n      strictTypes: false,\n      strictTuples: false,\n    }\n    ajv = new _Ajv(opts)\n    ajvJP = new _Ajv(opts)\n    fullAjv = new _Ajv({\n      ...opts,\n      allErrors: true,\n      verbose: true,\n      jsPropertySyntax: true, // deprecated\n      logger: false,\n    })\n  }\n\n  it(\"error should include instancePath\", () => {\n    const schema = {\n      properties: {\n        foo: {type: \"number\"},\n      },\n    }\n\n    testSchema1(schema)\n  })\n\n  it('\"refs\" error should include instancePath', () => {\n    const schema = {\n      definitions: {\n        num: {type: \"number\"},\n      },\n      properties: {\n        foo: {$ref: \"#/definitions/num\"},\n      },\n    }\n\n    testSchema1(schema, \"#/definitions/num\")\n  })\n\n  describe('\"additionalProperties\" errors', () => {\n    it(\"should NOT include property in instancePath\", () => {\n      testAdditional()\n    })\n\n    function testAdditional() {\n      const schema = {\n        properties: {\n          foo: {},\n          bar: {},\n        },\n        additionalProperties: false,\n      }\n\n      const data = {foo: 1, bar: 2},\n        invalidData = {foo: 1, bar: 2, baz: 3, quux: 4}\n\n      const msg = \"must NOT have additional properties\"\n\n      const validate = ajv.compile(schema)\n      shouldBeValid(validate, data)\n      shouldBeInvalid(validate, invalidData)\n      shouldBeError(\n        validate.errors?.[0],\n        \"additionalProperties\",\n        \"#/additionalProperties\",\n        \"\",\n        msg,\n        {\n          additionalProperty: \"baz\",\n        }\n      )\n\n      const validateJP = ajvJP.compile(schema)\n      shouldBeValid(validateJP, data)\n      shouldBeInvalid(validateJP, invalidData)\n      shouldBeError(\n        validateJP.errors?.[0],\n        \"additionalProperties\",\n        \"#/additionalProperties\",\n        \"\",\n        msg,\n        {additionalProperty: \"baz\"}\n      )\n\n      const fullValidate = fullAjv.compile(schema)\n      shouldBeValid(fullValidate, data)\n      shouldBeInvalid(fullValidate, invalidData, 2)\n      shouldBeError(\n        fullValidate.errors?.[0],\n        \"additionalProperties\",\n        \"#/additionalProperties\",\n        \"\",\n        msg,\n        {additionalProperty: \"baz\"}\n      )\n      shouldBeError(\n        fullValidate.errors?.[1],\n        \"additionalProperties\",\n        \"#/additionalProperties\",\n        \"\",\n        msg,\n        {additionalProperty: \"quux\"}\n      )\n    }\n  })\n\n  describe('errors when \"additionalProperties\" is schema', () => {\n    it(\"should NOT include property in instancePath\", () => {\n      testAdditionalIsSchema()\n    })\n\n    function testAdditionalIsSchema() {\n      const schema = {\n        properties: {\n          foo: {type: \"integer\"},\n          bar: {type: \"integer\"},\n        },\n        additionalProperties: {\n          type: \"object\",\n          properties: {\n            quux: {type: \"string\"},\n          },\n        },\n      }\n\n      const data = {foo: 1, bar: 2, baz: {quux: \"abc\"}},\n        invalidData = {foo: 1, bar: 2, baz: {quux: 3}, boo: {quux: 4}}\n\n      const schPath = \"#/additionalProperties/properties/quux/type\"\n\n      const validate = ajv.compile(schema)\n      shouldBeValid(validate, data)\n      shouldBeInvalid(validate, invalidData)\n      shouldBeError(validate.errors?.[0], \"type\", schPath, \"/baz/quux\", \"must be string\", {\n        type: \"string\",\n      })\n\n      const validateJP = ajvJP.compile(schema)\n      shouldBeValid(validateJP, data)\n      shouldBeInvalid(validateJP, invalidData)\n      shouldBeError(validateJP.errors?.[0], \"type\", schPath, \"/baz/quux\", \"must be string\", {\n        type: \"string\",\n      })\n\n      const fullValidate = fullAjv.compile(schema)\n      shouldBeValid(fullValidate, data)\n      shouldBeInvalid(fullValidate, invalidData, 2)\n      shouldBeError(fullValidate.errors?.[0], \"type\", schPath, \"['baz'].quux\", \"must be string\", {\n        type: \"string\",\n      })\n      shouldBeError(fullValidate.errors?.[1], \"type\", schPath, \"['boo'].quux\", \"must be string\", {\n        type: \"string\",\n      })\n    }\n  })\n\n  describe('\"required\" errors', () => {\n    it(\"should NOT include missing property in instancePath\", () => {\n      testRequired()\n    })\n\n    function testRequired() {\n      const schema = {\n        required: [\"foo\", \"bar\", \"baz\"],\n      }\n\n      _testRequired(schema, \"#\")\n    }\n\n    it(\"large data/schemas\", () => {\n      testRequiredLargeSchema()\n    })\n\n    function testRequiredLargeSchema() {\n      let schema: any = {required: []}\n      const data = {},\n        invalidData1 = {},\n        invalidData2 = {}\n      for (let i = 0; i < 100; i++) {\n        schema.required.push(\"\" + i) // properties from '0' to '99' are required\n        data[i] = invalidData1[i] = invalidData2[i] = i\n      }\n\n      delete invalidData1[1] // property '1' will be missing\n      delete invalidData2[2] // properties '2' and '198' will be missing\n      delete invalidData2[98]\n\n      test()\n\n      schema = {anyOf: [schema]}\n      test(1, \"#/anyOf/0\")\n\n      function test(extraErrors = 0, schemaPathPrefix = \"#\") {\n        const schPath = schemaPathPrefix + \"/required\"\n        const validate = ajv.compile(schema)\n        shouldBeValid(validate, data)\n        shouldBeInvalid(validate, invalidData1, 1 + extraErrors)\n        shouldBeError(validate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"1\"), {\n          missingProperty: \"1\",\n        })\n        shouldBeInvalid(validate, invalidData2, 1 + extraErrors)\n        shouldBeError(validate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"2\"), {\n          missingProperty: \"2\",\n        })\n\n        const validateJP = ajvJP.compile(schema)\n        shouldBeValid(validateJP, data)\n        shouldBeInvalid(validateJP, invalidData1, 1 + extraErrors)\n        shouldBeError(validateJP.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"1\"), {\n          missingProperty: \"1\",\n        })\n        shouldBeInvalid(validateJP, invalidData2, 1 + extraErrors)\n        shouldBeError(validateJP.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"2\"), {\n          missingProperty: \"2\",\n        })\n\n        const fullValidate = fullAjv.compile(schema)\n        shouldBeValid(fullValidate, data)\n        shouldBeInvalid(fullValidate, invalidData1, 1 + extraErrors)\n        shouldBeError(fullValidate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"1\"), {\n          missingProperty: \"1\",\n        })\n        shouldBeInvalid(fullValidate, invalidData2, 2 + extraErrors)\n        shouldBeError(fullValidate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"2\"), {\n          missingProperty: \"2\",\n        })\n        shouldBeError(fullValidate.errors?.[1], \"required\", schPath, \"\", requiredMsg(\"98\"), {\n          missingProperty: \"98\",\n        })\n      }\n    }\n\n    it('with \"properties\"', () => {\n      testRequiredAndProperties()\n    })\n\n    function testRequiredAndProperties() {\n      const schema = {\n        properties: {\n          foo: {type: \"number\"},\n          bar: {type: \"number\"},\n          baz: {type: \"number\"},\n        },\n        required: [\"foo\", \"bar\", \"baz\"],\n      }\n\n      _testRequired(schema)\n    }\n\n    it('in \"anyOf\"', () => {\n      testRequiredInAnyOf()\n    })\n\n    function testRequiredInAnyOf() {\n      const schema = {\n        anyOf: [{required: [\"foo\", \"bar\", \"baz\"]}],\n      }\n\n      _testRequired(schema, \"#/anyOf/0\", 1)\n    }\n\n    it(\"should not validate required twice in large schemas with loopRequired option\", () => {\n      ajv = new _Ajv({loopRequired: 1, allErrors: true})\n\n      const schema = {\n        type: \"object\",\n        properties: {\n          foo: {type: \"integer\"},\n          bar: {type: \"integer\"},\n        },\n        required: [\"foo\", \"bar\"],\n      }\n\n      const validate = ajv.compile(schema)\n\n      validate({}).should.equal(false)\n      validate.errors?.should.have.length(2)\n    })\n\n    it(\"should not validate required twice with $data ref\", () => {\n      ajv = new _Ajv({$data: true, allErrors: true})\n\n      const schema = {\n        type: \"object\",\n        properties: {\n          foo: {type: \"integer\"},\n          bar: {type: \"integer\"},\n        },\n        required: {$data: \"0/requiredProperties\"},\n      }\n\n      const validate = ajv.compile(schema)\n\n      validate({requiredProperties: [\"foo\", \"bar\"]}).should.equal(false)\n      validate.errors?.should.have.length(2)\n    })\n\n    it(\"should show different error when required is $data of incorrect type\", () => {\n      test(new _Ajv({$data: true}))\n      test(new _Ajv({$data: true, allErrors: true}))\n\n      function test(_ajv: Ajv) {\n        const schema = {\n          type: \"object\",\n          required: {$data: \"0/req\"},\n          properties: {\n            req: {},\n            foo: {},\n            bar: {},\n          },\n        }\n\n        const validate = _ajv.compile(schema)\n\n        shouldBeValid(validate, {req: [\"foo\", \"bar\"], foo: 1, bar: 2})\n        shouldBeInvalid(validate, {req: [\"foo\", \"bar\"], foo: 1})\n        shouldBeError(\n          validate.errors?.[0],\n          \"required\",\n          \"#/required\",\n          \"\",\n          \"must have required property 'bar'\",\n          {missingProperty: \"bar\"}\n        )\n\n        shouldBeInvalid(validate, {req: \"invalid\"})\n        shouldBeError(\n          validate.errors?.[0],\n          \"required\",\n          \"#/required\",\n          \"\",\n          '\"required\" keyword must be array ($data)',\n          {}\n        )\n      }\n    })\n\n    it(\"should include missing property with ownProperties option (issue #1493)\", () => {\n      test(new _Ajv())\n      test(new _Ajv({ownProperties: true}))\n\n      function test(_ajv: Ajv): void {\n        const schema = {\n          type: \"object\",\n          required: [\"a\"],\n          properties: {\n            a: {type: \"string\"},\n          },\n        }\n\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, {a: \"abc\"})\n        shouldBeInvalid(validate, {})\n        shouldBeError(\n          validate.errors?.[0],\n          \"required\",\n          \"#/required\",\n          \"\",\n          \"must have required property 'a'\",\n          {missingProperty: \"a\"}\n        )\n      }\n    })\n  })\n\n  describe('\"dependencies\" errors', () => {\n    it(\"should NOT include missing property in instancePath\", () => {\n      testDependencies()\n    })\n\n    function testDependencies() {\n      const schema = {\n        dependencies: {\n          a: [\"foo\", \"bar\", \"baz\"],\n        },\n      }\n\n      const data = {a: 0, foo: 1, bar: 2, baz: 3},\n        invalidData1 = {a: 0, foo: 1, baz: 3},\n        invalidData2 = {a: 0, bar: 2}\n\n      const msg = \"must have properties foo, bar, baz when property a is present\"\n\n      const validate = ajv.compile(schema)\n      shouldBeValid(validate, data)\n      shouldBeInvalid(validate, invalidData1)\n      shouldBeError(validate.errors?.[0], \"dependencies\", \"#/dependencies\", \"\", msg, params(\"bar\"))\n      shouldBeInvalid(validate, invalidData2)\n      shouldBeError(validate.errors?.[0], \"dependencies\", \"#/dependencies\", \"\", msg, params(\"foo\"))\n\n      const validateJP = ajvJP.compile(schema)\n      shouldBeValid(validateJP, data)\n      shouldBeInvalid(validateJP, invalidData1)\n      shouldBeError(\n        validateJP.errors?.[0],\n        \"dependencies\",\n        \"#/dependencies\",\n        \"\",\n        msg,\n        params(\"bar\")\n      )\n      shouldBeInvalid(validateJP, invalidData2)\n      shouldBeError(\n        validateJP.errors?.[0],\n        \"dependencies\",\n        \"#/dependencies\",\n        \"\",\n        msg,\n        params(\"foo\")\n      )\n\n      const fullValidate = fullAjv.compile(schema)\n      shouldBeValid(fullValidate, data)\n      shouldBeInvalid(fullValidate, invalidData1)\n      shouldBeError(\n        fullValidate.errors?.[0],\n        \"dependencies\",\n        \"#/dependencies\",\n        \"\",\n        msg,\n        params(\"bar\")\n      )\n      shouldBeInvalid(fullValidate, invalidData2, 2)\n      shouldBeError(\n        fullValidate.errors?.[0],\n        \"dependencies\",\n        \"#/dependencies\",\n        \"\",\n        msg,\n        params(\"foo\")\n      )\n      shouldBeError(\n        fullValidate.errors?.[1],\n        \"dependencies\",\n        \"#/dependencies\",\n        \"\",\n        msg,\n        params(\"baz\")\n      )\n\n      function params(missing) {\n        const p = {\n          property: \"a\",\n          deps: \"foo, bar, baz\",\n          depsCount: 3,\n          missingProperty: missing,\n        }\n        return p\n      }\n    }\n  })\n\n  function _testRequired(schema, schemaPathPrefix = \"#\", extraErrors = 0) {\n    const schPath = schemaPathPrefix + \"/required\"\n\n    const data = {foo: 1, bar: 2, baz: 3},\n      invalidData1 = {foo: 1, baz: 3},\n      invalidData2 = {bar: 2}\n\n    const validate = ajv.compile(schema)\n    shouldBeValid(validate, data)\n    shouldBeInvalid(validate, invalidData1, 1 + extraErrors)\n    shouldBeError(validate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"bar\"), {\n      missingProperty: \"bar\",\n    })\n    shouldBeInvalid(validate, invalidData2, 1 + extraErrors)\n    shouldBeError(validate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"foo\"), {\n      missingProperty: \"foo\",\n    })\n\n    const validateJP = ajvJP.compile(schema)\n    shouldBeValid(validateJP, data)\n    shouldBeInvalid(validateJP, invalidData1, 1 + extraErrors)\n    shouldBeError(validateJP.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"bar\"), {\n      missingProperty: \"bar\",\n    })\n    shouldBeInvalid(validateJP, invalidData2, 1 + extraErrors)\n    shouldBeError(validateJP.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"foo\"), {\n      missingProperty: \"foo\",\n    })\n\n    const fullValidate = fullAjv.compile(schema)\n    shouldBeValid(fullValidate, data)\n    shouldBeInvalid(fullValidate, invalidData1, 1 + extraErrors)\n    shouldBeError(fullValidate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"bar\"), {\n      missingProperty: \"bar\",\n    })\n    shouldBeInvalid(fullValidate, invalidData2, 2 + extraErrors)\n    shouldBeError(fullValidate.errors?.[0], \"required\", schPath, \"\", requiredMsg(\"foo\"), {\n      missingProperty: \"foo\",\n    })\n    shouldBeError(fullValidate.errors?.[1], \"required\", schPath, \"\", requiredMsg(\"baz\"), {\n      missingProperty: \"baz\",\n    })\n  }\n\n  function requiredMsg(prop: string) {\n    return `must have required property '${prop}'`\n  }\n\n  it('\"items\" errors should include item index without quotes in instancePath (#48)', () => {\n    const schema1 = {\n      $id: \"schema1\",\n      type: \"array\",\n      items: {\n        type: \"integer\",\n        minimum: 10,\n      },\n    }\n\n    const data = [10, 11, 12],\n      invalidData1 = [1, 10],\n      invalidData2 = [10, 9, 11, 8, 12]\n\n    let validate = ajv.compile(schema1)\n    shouldBeValid(validate, data)\n    shouldBeInvalid(validate, invalidData1)\n    shouldBeError(validate.errors?.[0], \"minimum\", \"#/items/minimum\", \"/0\", \"must be >= 10\")\n    shouldBeInvalid(validate, invalidData2)\n    shouldBeError(validate.errors?.[0], \"minimum\", \"#/items/minimum\", \"/1\", \"must be >= 10\")\n\n    const validateJP = ajvJP.compile(schema1)\n    shouldBeValid(validateJP, data)\n    shouldBeInvalid(validateJP, invalidData1)\n    shouldBeError(validateJP.errors?.[0], \"minimum\", \"#/items/minimum\", \"/0\", \"must be >= 10\")\n    shouldBeInvalid(validateJP, invalidData2)\n    shouldBeError(validateJP.errors?.[0], \"minimum\", \"#/items/minimum\", \"/1\", \"must be >= 10\")\n\n    const fullValidate = fullAjv.compile(schema1)\n    shouldBeValid(fullValidate, data)\n    shouldBeInvalid(fullValidate, invalidData1)\n    shouldBeError(fullValidate.errors?.[0], \"minimum\", \"#/items/minimum\", \"[0]\", \"must be >= 10\")\n    shouldBeInvalid(fullValidate, invalidData2, 2)\n    shouldBeError(fullValidate.errors?.[0], \"minimum\", \"#/items/minimum\", \"[1]\", \"must be >= 10\")\n    shouldBeError(fullValidate.errors?.[1], \"minimum\", \"#/items/minimum\", \"[3]\", \"must be >= 10\")\n\n    const schema2 = {\n      $id: \"schema2\",\n      type: \"array\",\n      items: [{minimum: 10}, {minimum: 9}, {minimum: 12}],\n    }\n\n    validate = ajv.compile(schema2)\n    shouldBeValid(validate, data)\n    shouldBeInvalid(validate, invalidData1)\n    shouldBeError(validate.errors?.[0], \"minimum\", \"#/items/0/minimum\", \"/0\", \"must be >= 10\")\n    shouldBeInvalid(validate, invalidData2)\n    shouldBeError(validate.errors?.[0], \"minimum\", \"#/items/2/minimum\", \"/2\", \"must be >= 12\")\n  })\n\n  it(\"should have correct schema path for additionalItems\", () => {\n    const schema = {\n      type: \"array\",\n      items: [{type: \"integer\"}, {type: \"integer\"}],\n      minItems: 2,\n      additionalItems: false,\n    }\n\n    const data = [1, 2]\n    const invalidData = [1, 2, 3]\n\n    test(ajv)\n    test(ajvJP)\n    test(fullAjv)\n\n    function test(_ajv) {\n      const validate = _ajv.compile(schema)\n      shouldBeValid(validate, data)\n      shouldBeInvalid(validate, invalidData)\n      shouldBeError(\n        validate.errors?.[0],\n        \"additionalItems\",\n        \"#/additionalItems\",\n        \"\",\n        \"must NOT have more than 2 items\"\n      )\n    }\n  })\n\n  describe('\"propertyNames\" errors', () => {\n    it(\"should add propertyName to errors\", () => {\n      const schema = {\n        type: \"object\",\n        propertyNames: {pattern: \"bar\"},\n      }\n\n      const data = {\n        bar: {},\n        \"bar.baz@email.example.com\": {},\n      }\n\n      const invalidData = {\n        bar: {},\n        \"bar.baz@email.example.com\": {},\n        foo: {},\n        quux: {},\n      }\n\n      test(ajv, 2)\n      test(ajvJP, 2)\n      test(fullAjv, 4)\n\n      function test(_ajv: Ajv, numErrors: number) {\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, data)\n        shouldBeInvalid(validate, invalidData, numErrors)\n        shouldBeError(\n          validate.errors?.[0],\n          \"pattern\",\n          \"#/propertyNames/pattern\",\n          \"\",\n          'must match pattern \"bar\"'\n        )\n        shouldBeError(\n          validate.errors?.[1],\n          \"propertyNames\",\n          \"#/propertyNames\",\n          \"\",\n          \"property name must be valid\"\n        )\n        if (numErrors === 4) {\n          shouldBeError(\n            validate.errors?.[2],\n            \"pattern\",\n            \"#/propertyNames/pattern\",\n            \"\",\n            'must match pattern \"bar\"'\n          )\n          shouldBeError(\n            validate.errors?.[3],\n            \"propertyNames\",\n            \"#/propertyNames\",\n            \"\",\n            \"property name must be valid\"\n          )\n        }\n      }\n    })\n  })\n\n  describe(\"oneOf errors\", () => {\n    it(\"should have errors from inner schemas\", () => {\n      const schema = {\n        oneOf: [{type: \"number\"}, {type: \"integer\"}],\n      }\n\n      test(ajv)\n      test(fullAjv)\n\n      function test(_ajv) {\n        const validate = _ajv.compile(schema)\n        validate(\"foo\").should.equal(false)\n        validate.errors.length.should.equal(3)\n        validate(1).should.equal(false)\n        validate.errors.length.should.equal(1)\n        validate(1.5).should.equal(true)\n      }\n    })\n\n    it(\"should return passing schemas in error params\", () => {\n      const schema = {\n        oneOf: [{type: \"number\"}, {type: \"integer\"}, {const: 1.5}],\n      }\n\n      test(ajv)\n      test(fullAjv)\n\n      function test(_ajv) {\n        const validate = _ajv.compile(schema)\n        validate(1).should.equal(false)\n        let err = validate.errors.pop()\n        err.keyword.should.equal(\"oneOf\")\n        err.params.should.eql({passingSchemas: [0, 1]})\n\n        validate(1.5).should.equal(false)\n        err = validate.errors.pop()\n        err.keyword.should.equal(\"oneOf\")\n        err.params.should.eql({passingSchemas: [0, 2]})\n\n        validate(2.5).should.equal(true)\n\n        validate(\"foo\").should.equal(false)\n        err = validate.errors.pop()\n        err.keyword.should.equal(\"oneOf\")\n        err.params.should.eql({passingSchemas: null})\n      }\n    })\n  })\n\n  describe(\"anyOf errors\", () => {\n    it(\"should have errors from inner schemas\", () => {\n      const schema = {\n        anyOf: [{type: \"number\"}, {type: \"integer\"}],\n      }\n\n      test(ajv)\n      test(fullAjv)\n\n      function test(_ajv) {\n        const validate = _ajv.compile(schema)\n        validate(\"foo\").should.equal(false)\n        validate.errors.length.should.equal(3)\n        validate(1).should.equal(true)\n        validate(1.5).should.equal(true)\n      }\n    })\n  })\n\n  describe(\"type errors\", () => {\n    describe(\"integer\", () => {\n      it(\"should have only one error in {allErrors: false} mode\", () => {\n        test(ajv)\n      })\n\n      it(\"should return all errors in {allErrors: true} mode\", () => {\n        test(fullAjv, 2)\n      })\n\n      function test(_ajv, numErrors?: number) {\n        const schema = {\n          type: \"integer\",\n          minimum: 5,\n        }\n\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, 5)\n        shouldBeInvalid(validate, 5.5)\n        shouldBeInvalid(validate, 4)\n        shouldBeInvalid(validate, \"4\")\n        shouldBeInvalid(validate, 4.5, numErrors)\n      }\n    })\n\n    describe(\"keyword for another type\", () => {\n      it(\"should have only one error in {allErrors: false} mode\", () => {\n        test(ajv)\n      })\n\n      it(\"should return all errors in {allErrors: true} mode\", () => {\n        test(fullAjv, 2)\n      })\n\n      function test(_ajv, numErrors?: number) {\n        const schema = {\n          type: \"array\",\n          minItems: 2,\n          minimum: 5,\n        }\n\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, [1, 2])\n        shouldBeInvalid(validate, [1])\n        shouldBeInvalid(validate, 5)\n        shouldBeInvalid(validate, 4, numErrors)\n      }\n    })\n\n    describe(\"array of types\", () => {\n      it(\"should have only one error in {allErrors: false} mode\", () => {\n        test(ajv)\n      })\n\n      it(\"should return all errors in {allErrors: true} mode\", () => {\n        test(fullAjv, 2)\n      })\n\n      function test(_ajv: Ajv, numErrors?: number) {\n        const schema = {\n          type: [\"array\", \"object\"],\n          minItems: 2,\n          minProperties: 2,\n          minimum: 5, // this keyword would log/throw in strictTypes mode\n        }\n\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, [1, 2])\n        shouldBeValid(validate, {foo: 1, bar: 2})\n        shouldBeInvalid(validate, [1])\n        shouldBeInvalid(validate, {foo: 1})\n        shouldBeInvalid(validate, 5) // fails because number not allowed\n        shouldBeInvalid(validate, 4, numErrors)\n      }\n    })\n  })\n\n  describe(\"exclusiveMaximum/Minimum errors\", () => {\n    it(\"should include limits in error message\", () => {\n      const schema = {\n        type: \"integer\",\n        exclusiveMinimum: 2,\n        exclusiveMaximum: 5,\n      }\n\n      ;[ajv, fullAjv].forEach((_ajv) => {\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, 3)\n        shouldBeValid(validate, 4)\n\n        shouldBeInvalid(validate, 2)\n        testError(\"exclusiveMinimum\", \"must be > 2\", {\n          comparison: \">\",\n          limit: 2,\n        })\n\n        shouldBeInvalid(validate, 5)\n        testError(\"exclusiveMaximum\", \"must be < 5\", {\n          comparison: \"<\",\n          limit: 5,\n        })\n\n        function testError(keyword, message, params) {\n          const err = validate.errors?.[0]\n          shouldBeError(err, keyword, \"#/\" + keyword, \"\", message, params)\n        }\n      })\n    })\n\n    it(\"should include limits in error message with $data\", () => {\n      const schema = {\n        type: \"object\",\n        properties: {\n          smaller: {\n            type: \"number\",\n            exclusiveMaximum: {$data: \"1/larger\"},\n          },\n          larger: {type: \"number\"},\n        },\n      }\n\n      ajv = new _Ajv({$data: true})\n      fullAjv = new _Ajv({\n        $data: true,\n        allErrors: true,\n        verbose: true,\n        jsPropertySyntax: true, // deprecated\n        logger: false,\n      })\n      ;[ajv, fullAjv].forEach((_ajv) => {\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, {smaller: 2, larger: 4})\n        shouldBeValid(validate, {smaller: 3, larger: 4})\n\n        shouldBeInvalid(validate, {smaller: 4, larger: 4})\n        testError()\n\n        shouldBeInvalid(validate, {smaller: 5, larger: 4})\n        testError()\n\n        function testError() {\n          const err = validate.errors?.[0]\n          shouldBeError(\n            err,\n            \"exclusiveMaximum\",\n            \"#/properties/smaller/exclusiveMaximum\",\n            _ajv.opts.jsPropertySyntax ? \".smaller\" : \"/smaller\",\n            \"must be < 4\",\n            {comparison: \"<\", limit: 4}\n          )\n        }\n      })\n    })\n  })\n\n  describe(\"if/then/else errors\", () => {\n    let validate: ValidateFunction, numErrors\n\n    it(\"if/then/else should include failing keyword in message and params\", () => {\n      const schema = {\n        type: \"number\",\n        if: {maximum: 10},\n        then: {multipleOf: 2},\n        else: {multipleOf: 5},\n      }\n\n      ;[ajv, fullAjv].forEach((_ajv) => {\n        prepareTest(_ajv, schema)\n        shouldBeValid(validate, 8)\n        shouldBeValid(validate, 15)\n\n        shouldBeInvalid(validate, 7, numErrors)\n        testIfError(\"then\", 2)\n\n        shouldBeInvalid(validate, 17, numErrors)\n        testIfError(\"else\", 5)\n      })\n    })\n\n    it(\"if/then should include failing keyword in message and params\", () => {\n      const schema = {\n        type: \"number\",\n        if: {maximum: 10},\n        then: {multipleOf: 2},\n      }\n\n      ;[ajv, fullAjv].forEach((_ajv) => {\n        prepareTest(_ajv, schema)\n        shouldBeValid(validate, 8)\n        shouldBeValid(validate, 11)\n        shouldBeValid(validate, 12)\n\n        shouldBeInvalid(validate, 7, numErrors)\n        testIfError(\"then\", 2)\n      })\n    })\n\n    it(\"if/else should include failing keyword in message and params\", () => {\n      const schema = {\n        type: \"number\",\n        if: {maximum: 10},\n        else: {multipleOf: 5},\n      }\n\n      ;[ajv, fullAjv].forEach((_ajv) => {\n        prepareTest(_ajv, schema)\n        shouldBeValid(validate, 7)\n        shouldBeValid(validate, 8)\n        shouldBeValid(validate, 15)\n\n        shouldBeInvalid(validate, 17, numErrors)\n        testIfError(\"else\", 5)\n      })\n    })\n\n    function prepareTest(_ajv: Ajv, schema) {\n      validate = _ajv.compile(schema)\n      numErrors = _ajv.opts.allErrors ? 2 : 1\n    }\n\n    function testIfError(ifClause, multipleOf) {\n      let err = validate.errors?.[0]\n      shouldBeError(\n        err,\n        \"multipleOf\",\n        \"#/\" + ifClause + \"/multipleOf\",\n        \"\",\n        \"must be multiple of \" + multipleOf,\n        {multipleOf: multipleOf}\n      )\n\n      if (numErrors === 2) {\n        err = validate.errors?.[1]\n        shouldBeError(err, \"if\", \"#/if\", \"\", 'must match \"' + ifClause + '\" schema', {\n          failingKeyword: ifClause,\n        })\n      }\n    }\n  })\n\n  describe(\"uniqueItems errors\", () => {\n    it(\"should not return uniqueItems error when non-unique items are of a different type than required\", () => {\n      const schema = {\n        type: \"array\",\n        items: {type: \"number\"},\n        uniqueItems: true,\n      }\n\n      ;[ajvJP, fullAjv].forEach((_ajv) => {\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, [1, 2, 3])\n\n        shouldBeInvalid(validate, [1, 2, 2])\n        shouldBeError(\n          validate.errors?.[0],\n          \"uniqueItems\",\n          \"#/uniqueItems\",\n          \"\",\n          \"must NOT have duplicate items (items ## 2 and 1 are identical)\",\n          {i: 1, j: 2}\n        )\n\n        const expectedErrors = _ajv.opts.allErrors ? 2 : 1\n        shouldBeInvalid(validate, [1, \"2\", \"2\", 2], expectedErrors)\n        testTypeError(0, _ajv.opts.jsPropertySyntax ? \"[1]\" : \"/1\")\n        if (expectedErrors === 2) testTypeError(1, _ajv.opts.jsPropertySyntax ? \"[2]\" : \"/2\")\n\n        function testTypeError(i, instancePath) {\n          const err = validate.errors?.[i]\n          shouldBeError(err, \"type\", \"#/items/type\", instancePath, \"must be number\")\n        }\n      })\n    })\n  })\n\n  function testSchema1(schema, schemaPathPrefix = \"#/properties/foo\") {\n    _testSchema1(ajv, schema, schemaPathPrefix)\n    _testSchema1(ajvJP, schema, schemaPathPrefix)\n    _testSchema1(fullAjv, schema, schemaPathPrefix)\n  }\n\n  function _testSchema1(_ajv, schema, schemaPathPrefix) {\n    const schPath = schemaPathPrefix + \"/type\"\n\n    const data = {foo: 1},\n      invalidData = {foo: \"bar\"}\n\n    const validate = _ajv.compile(schema)\n    shouldBeValid(validate, data)\n    shouldBeInvalid(validate, invalidData)\n    shouldBeError(\n      validate.errors?.[0],\n      \"type\",\n      schPath,\n      _ajv.opts.jsPropertySyntax ? \".foo\" : \"/foo\"\n    )\n  }\n\n  function shouldBeValid(validate, data) {\n    validate(data).should.equal(true)\n    should.equal(validate.errors, null)\n  }\n\n  function shouldBeInvalid(validate, data, numErrors = 1) {\n    validate(data).should.equal(false)\n    should.equal(validate.errors.length, numErrors)\n  }\n\n  function shouldBeError(\n    error,\n    keyword,\n    schemaPath,\n    instancePath,\n    message?: string,\n    params?: Record<string, any>\n  ) {\n    error.keyword.should.equal(keyword)\n    error.schemaPath.should.equal(schemaPath)\n    error.instancePath.should.equal(instancePath)\n    error.message.should.be.a(\"string\")\n    if (message !== undefined) error.message.should.equal(message)\n    if (params !== undefined) error.params.should.eql(params)\n  }\n})\n"
  },
  {
    "path": "spec/extras/$data/absolute_ref.json",
    "content": "[\n  {\n    \"description\": \"property is equal to another property [absolute JSON pointer]\",\n    \"schema\": {\n      \"properties\": {\n        \"sameAs\": {\n          \"const\": {\n            \"$data\": \"/thisOne\"\n          }\n        },\n        \"thisOne\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"same value is valid\",\n        \"data\": {\n          \"sameAs\": 5,\n          \"thisOne\": 5\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"same object is valid\",\n        \"data\": {\n          \"sameAs\": {\n            \"foo\": 1,\n            \"bar\": 2\n          },\n          \"thisOne\": {\n            \"bar\": 2,\n            \"foo\": 1\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"another value is invalid\",\n        \"data\": {\n          \"sameAs\": {\n            \"foo\": 1\n          },\n          \"thisOne\": {\n            \"foo\": 2\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"another type is invalid\",\n        \"data\": {\n          \"sameAs\": 5,\n          \"thisOne\": \"5\"\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"items in one array are equal to items in another (limited length) [absolute JSON pointer]\",\n    \"schema\": {\n      \"properties\": {\n        \"arr\": {\n          \"items\": [{}, {}, {}],\n          \"additionalItems\": false\n        },\n        \"sameArr\": {\n          \"items\": [\n            {\n              \"const\": {\n                \"$data\": \"/arr/0\"\n              }\n            },\n            {\n              \"const\": {\n                \"$data\": \"/arr/1\"\n              }\n            },\n            {\n              \"const\": {\n                \"$data\": \"/arr/2\"\n              }\n            }\n          ],\n          \"additionalItems\": false\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"equal arrays are valid\",\n        \"data\": {\n          \"arr\": [\n            1,\n            \"abc\",\n            {\n              \"foo\": \"bar\"\n            }\n          ],\n          \"sameArr\": [\n            1,\n            \"abc\",\n            {\n              \"foo\": \"bar\"\n            }\n          ]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"different arrays are invalid\",\n        \"data\": {\n          \"arr\": [\n            1,\n            \"abc\",\n            {\n              \"foo\": \"bar\"\n            }\n          ],\n          \"sameArr\": [\n            1,\n            \"abc\",\n            {\n              \"foo\": \"foo\"\n            }\n          ]\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"property value is contained in array [absolute JSON pointer]\",\n    \"schema\": {\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"list\": {\n          \"type\": \"array\",\n          \"contains\": {\n            \"const\": {\n              \"$data\": \"/name\"\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"1 item array containing property is valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": [\"foo\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"2 item array containing property is valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": [\"foo\", \"bar\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"array not containing property is invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": [\"bar\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"empty array is invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": []\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"property is one of values in another property [absolute JSON pointer]\",\n    \"schema\": {\n      \"properties\": {\n        \"allowedValues\": {},\n        \"value\": {\n          \"enum\": {\n            \"$data\": \"/allowedValues\"\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"one of the enum is valid\",\n        \"data\": {\n          \"allowedValues\": [1, 2, 3],\n          \"value\": 1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"something else is invalid\",\n        \"data\": {\n          \"allowedValues\": [1, 2, 3],\n          \"value\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"heterogeneous enum validation\",\n        \"data\": {\n          \"allowedValues\": [\n            6,\n            \"foo\",\n            [],\n            true,\n            {\n              \"foo\": 12\n            }\n          ],\n          \"value\": {\n            \"foo\": 12\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fail if value of enum is not an array\",\n        \"data\": {\n          \"allowedValues\": \"[1, 2, 3]\",\n          \"value\": 1\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of enum is undefined\",\n        \"data\": {\n          \"value\": 1\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"enum in properties [absolute JSON pointer]\",\n    \"schema\": {\n      \"properties\": {\n        \"allowedValues\": {}\n      },\n      \"additionalProperties\": {\n        \"enum\": {\n          \"$data\": \"/allowedValues\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"properties are valid\",\n        \"data\": {\n          \"allowedValues\": [\"foo\", \"bar\"],\n          \"a\": \"foo\",\n          \"b\": \"bar\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"properties are invalid\",\n        \"data\": {\n          \"allowedValues\": [\"foo\", \"bar\"],\n          \"a\": \"foo\",\n          \"b\": \"baz\"\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"required schema in data property [absolute JSON pointer]\",\n    \"schema\": {\n      \"properties\": {\n        \"foo\": {},\n        \"bar\": {},\n        \"requiredProperties\": {}\n      },\n      \"required\": {\n        \"$data\": \"/requiredProperties\"\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"present required property is valid\",\n        \"data\": {\n          \"foo\": 1,\n          \"requiredProperties\": [\"foo\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"non-present required property is invalid\",\n        \"data\": {\n          \"bar\": 2,\n          \"requiredProperties\": [\"foo\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"non-present second required property is invalid\",\n        \"data\": {\n          \"foo\": 1,\n          \"requiredProperties\": [\"foo\", \"bar\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"two present required properties is valid\",\n        \"data\": {\n          \"foo\": 1,\n          \"bar\": 2,\n          \"requiredProperties\": [\"foo\", \"bar\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of required is not an array\",\n        \"data\": {\n          \"foo\": 1,\n          \"bar\": 2,\n          \"requiredProperties\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of required is undefined\",\n        \"data\": {\n          \"foo\": 1,\n          \"bar\": 2\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"absolute JSON pointer can access data outside of a $ref\",\n    \"schema\": {\n      \"definitions\": {\n        \"baz\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"foo\": {\n              \"const\": {\n                \"$data\": \"/bar\"\n              }\n            },\n            \"bar\": {}\n          }\n        }\n      },\n      \"properties\": {\n        \"foo\": {\n          \"const\": {\n            \"$data\": \"/bar\"\n          }\n        },\n        \"bar\": {},\n        \"baz\": {\n          \"$ref\": \"#/definitions/baz\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"$data reference with absolute JSON pointer resolves from root of data\",\n        \"data\": {\n          \"foo\": 1,\n          \"bar\": 1,\n          \"baz\": {\n            \"foo\": 1,\n            \"bar\": 2\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"$data reference with absolute JSON pointer should NOT resolve to root of $ref\",\n        \"data\": {\n          \"foo\": 2,\n          \"bar\": 2,\n          \"baz\": {\n            \"foo\": 1,\n            \"bar\": 1\n          }\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/const.json",
    "content": "[\n  {\n    \"description\": \"property is equal to another property\",\n    \"schema\": {\n      \"properties\": {\n        \"sameAs\": {\"const\": {\"$data\": \"1/thisOne\"}},\n        \"thisOne\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"same value is valid\",\n        \"data\": {\n          \"sameAs\": 5,\n          \"thisOne\": 5\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"same object is valid\",\n        \"data\": {\n          \"sameAs\": {\"foo\": 1, \"bar\": 2},\n          \"thisOne\": {\"bar\": 2, \"foo\": 1}\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"another value is invalid\",\n        \"data\": {\n          \"sameAs\": {\"foo\": 1},\n          \"thisOne\": {\"foo\": 2}\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"another type is invalid\",\n        \"data\": {\n          \"sameAs\": 5,\n          \"thisOne\": \"5\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid when another property ('const') not defined\",\n        \"data\": {\n          \"sameAs\": 5\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"property values are equal to property names\",\n    \"schema\": {\n      \"additionalProperties\": {\n        \"const\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"foo\": \"foo\", \"bar\": \"bar\", \"baz\": \"baz\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {\"foo\": \"bar\"},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"items are equal to their indeces\",\n    \"schema\": {\n      \"items\": {\n        \"const\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [0, 1, 2, 3],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array\",\n        \"data\": [0, 2],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"items in one array are equal to items in another (limited length)\",\n    \"schema\": {\n      \"properties\": {\n        \"arr\": {\n          \"items\": [{}, {}, {}],\n          \"additionalItems\": false\n        },\n        \"sameArr\": {\n          \"items\": [\n            {\"const\": {\"$data\": \"2/arr/0\"}},\n            {\"const\": {\"$data\": \"2/arr/1\"}},\n            {\"const\": {\"$data\": \"2/arr/2\"}}\n          ],\n          \"additionalItems\": false\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"equal arrays are valid\",\n        \"data\": {\n          \"arr\": [1, \"abc\", {\"foo\": \"bar\"}],\n          \"sameArr\": [1, \"abc\", {\"foo\": \"bar\"}]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"different arrays are invalid\",\n        \"data\": {\n          \"arr\": [1, \"abc\", {\"foo\": \"bar\"}],\n          \"sameArr\": [1, \"abc\", {\"foo\": \"foo\"}]\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"any data is equal to itself\",\n    \"schema\": {\n      \"const\": {\"$data\": \"0\"}\n    },\n    \"tests\": [\n      {\n        \"description\": \"number is equal to itself\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"string is equal to itself\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"object is equal to itself\",\n        \"data\": {\"foo\": \"bar\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"array is equal to itself\",\n        \"data\": [1, 2, 3],\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"property value is contained in array\",\n    \"schema\": {\n      \"properties\": {\n        \"name\": {\"type\": \"string\"},\n        \"list\": {\n          \"type\": \"array\",\n          \"contains\": {\"const\": {\"$data\": \"2/name\"}}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"1 item array containing property is valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": [\"foo\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"2 item array containing property is valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": [\"foo\", \"bar\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"array not containing property is invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": [\"bar\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"empty array is invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"list\": []\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/enum.json",
    "content": "[\n  {\n    \"description\": \"property is one of values in another property\",\n    \"schema\": {\n      \"properties\": {\n        \"allowedValues\": {},\n        \"value\": {\"enum\": {\"$data\": \"1/allowedValues\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"one of the enum is valid\",\n        \"data\": {\n          \"allowedValues\": [1, 2, 3],\n          \"value\": 1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"something else is invalid\",\n        \"data\": {\n          \"allowedValues\": [1, 2, 3],\n          \"value\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"heterogeneous enum validation\",\n        \"data\": {\n          \"allowedValues\": [6, \"foo\", [], true, {\"foo\": 12}],\n          \"value\": {\"foo\": 12}\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fail if value of enum is not an array\",\n        \"data\": {\n          \"allowedValues\": \"[1, 2, 3]\",\n          \"value\": 1\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of enum is undefined\",\n        \"data\": {\n          \"value\": 1\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"enum in properties\",\n    \"schema\": {\n      \"properties\": {\n        \"allowedValues\": {}\n      },\n      \"additionalProperties\": {\n        \"enum\": {\"$data\": \"1/allowedValues\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"properties are valid\",\n        \"data\": {\n          \"allowedValues\": [\"foo\", \"bar\"],\n          \"a\": \"foo\",\n          \"b\": \"bar\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"properties are invalid\",\n        \"data\": {\n          \"allowedValues\": [\"foo\", \"bar\"],\n          \"a\": \"foo\",\n          \"b\": \"baz\"\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/exclusiveMaximum.json",
    "content": "[\n  {\n    \"description\": \"one property is exclusiveMaximum for another\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"smaller\": {\n          \"exclusiveMaximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the exclusiveMaximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the exclusiveMaximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the exclusiveMaximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-numbers\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": \"4\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of exclusiveMaximum is not number\",\n        \"data\": {\n          \"larger\": \"3\",\n          \"smaller\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of exclusiveMaximum is undefined\",\n        \"data\": {\n          \"smaller\": 2\n        },\n        \"valid\": true\n      }\n    ]\n  },\n\n  {\n    \"description\": \"exclusiveMaximum as number and maximum as $data, exclusiveMaximum > maximum\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"smaller\": {\n          \"exclusiveMaximum\": 3.5,\n          \"maximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"above the maximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 3.2\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMaximum as number and maximum as $data, exclusiveMaximum = maximum\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"smaller\": {\n          \"exclusiveMaximum\": 3,\n          \"maximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the maximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 4\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMaximum as number and maximum as $data, exclusiveMaximum < maximum\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"smaller\": {\n          \"exclusiveMaximum\": 2.5,\n          \"maximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the exclusiveMaximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 2.5\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the exclusiveMaximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smaller\": 2.8\n        },\n        \"valid\": false\n      }\n    ]\n  },\n\n  {\n    \"description\": \"exclusiveMaximum and maximum as $data, exclusiveMaximum > maximum\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"largerExclusive\": {},\n        \"smaller\": {\n          \"exclusiveMaximum\": {\"$data\": \"1/largerExclusive\"},\n          \"maximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 3.5,\n          \"smaller\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 3.5,\n          \"smaller\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"above the maximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 3.5,\n          \"smaller\": 3.2\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMaximum as number and maximum as $data, exclusiveMaximum = maximum\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"largerExclusive\": {},\n        \"smaller\": {\n          \"exclusiveMaximum\": {\"$data\": \"1/largerExclusive\"},\n          \"maximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 3,\n          \"smaller\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 3,\n          \"smaller\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the maximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 3,\n          \"smaller\": 4\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMaximum as number and maximum as $data, exclusiveMaximum < maximum\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"largerExclusive\": {},\n        \"smaller\": {\n          \"exclusiveMaximum\": {\"$data\": \"1/largerExclusive\"},\n          \"maximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the exclusiveMaximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 2.5,\n          \"smaller\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 2.5,\n          \"smaller\": 2.5\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the exclusiveMaximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"largerExclusive\": 2.5,\n          \"smaller\": 2.8\n        },\n        \"valid\": false\n      }\n    ]\n  },\n\n  {\n    \"description\": \"items in array are < than their indeces\",\n    \"schema\": {\n      \"items\": {\n        \"exclusiveMaximum\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [\"\", 0, 1, 2, 3, 4],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array (1=1)\",\n        \"data\": [\"\", 1],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/exclusiveMinimum.json",
    "content": "[\n  {\n    \"description\": \"one property is exclusiveMinimum for another\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"larger\": {\n          \"exclusiveMinimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the exclusiveMinimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the exclusiveMinimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the exclusiveMinimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-numbers\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": \"2\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of exclusiveMinimum is not number\",\n        \"data\": {\n          \"smaller\": \"3\",\n          \"larger\": 4\n        },\n        \"valid\": false\n      }\n    ]\n  },\n\n  {\n    \"description\": \"exclusiveMinimum as number and minimum as $data, exclusiveMinimum < minimum\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"larger\": {\n          \"exclusiveMinimum\": 2.5,\n          \"minimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"below the minimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 2.8\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMinimum as number and minimum as $data, exclusiveMinimum = minimum\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"larger\": {\n          \"exclusiveMinimum\": 3,\n          \"minimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the minimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 2\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMinimum as number and minimum as $data, exclusiveMinimum > minimum\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"larger\": {\n          \"exclusiveMinimum\": 3.5,\n          \"minimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the exclusiveMinimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 3.5\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the exclusiveMinimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"larger\": 3.3\n        },\n        \"valid\": false\n      }\n    ]\n  },\n\n  {\n    \"description\": \"exclusiveMinimum and minimum as $data, exclusiveMinimum < minimum\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"smallerExclusive\": {},\n        \"larger\": {\n          \"exclusiveMinimum\": {\"$data\": \"1/smallerExclusive\"},\n          \"minimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 2.5,\n          \"larger\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 2.5,\n          \"larger\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"below the minimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 2.5,\n          \"larger\": 2.8\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMinimum as number and minimum as $data, exclusiveMinimum = minimum\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"smallerExclusive\": {},\n        \"larger\": {\n          \"exclusiveMinimum\": {\"$data\": \"1/smallerExclusive\"},\n          \"minimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 3,\n          \"larger\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 3,\n          \"larger\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the minimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 3,\n          \"larger\": 2\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMinimum as number and minimum as $data, exclusiveMinimum > minimum\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"smallerExclusive\": {},\n        \"larger\": {\n          \"exclusiveMinimum\": {\"$data\": \"1/smallerExclusive\"},\n          \"minimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the exclusiveMinimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 3.5,\n          \"larger\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 3.5,\n          \"larger\": 3.5\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the exclusiveMinimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"smallerExclusive\": 3.5,\n          \"larger\": 3.3\n        },\n        \"valid\": false\n      }\n    ]\n  },\n\n  {\n    \"description\": \"items in array are > than their indeces\",\n    \"schema\": {\n      \"items\": {\n        \"exclusiveMinimum\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [1, 2, 3, 4, 5, 6],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array (1=1)\",\n        \"data\": [2, 1],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/format.json",
    "content": "[\n  {\n    \"description\": \"one property has format set in another property\",\n    \"schema\": {\n      \"properties\": {\n        \"str\": {\n          \"format\": {\n            \"$data\": \"1/strFormat\"\n          }\n        },\n        \"strFormat\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"allowed unknown format is valid\",\n        \"data\": {\n          \"str\": \"any value\",\n          \"strFormat\": \"allowedUnknown\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"unknown format is invalid\",\n        \"data\": {\n          \"str\": \"any value\",\n          \"strFormat\": \"completelyUnknown\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if the format is undefined\",\n        \"data\": {\n          \"str\": \"any value\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of format is not a string\",\n        \"data\": {\n          \"str\": \"1963-06-19T08:30:06.283185Z\",\n          \"strFormat\": 1963\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/maxItems.json",
    "content": "[\n  {\n    \"description\": \"array length is <= than another property\",\n    \"schema\": {\n      \"properties\": {\n        \"maxArrayLength\": {},\n        \"array\": {\"maxItems\": {\"$data\": \"1/maxArrayLength\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"shorter is valid\",\n        \"data\": {\n          \"maxArrayLength\": 2,\n          \"array\": [1]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"exact length is valid\",\n        \"data\": {\n          \"maxArrayLength\": 2,\n          \"array\": [1, 2]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"too long is invalid\",\n        \"data\": {\n          \"maxArrayLength\": 2,\n          \"array\": [1, 2, 3]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-arrays\",\n        \"data\": {\n          \"maxArrayLength\": 2,\n          \"array\": \"foobar\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of maxItems is not a number\",\n        \"data\": {\n          \"maxArrayLength\": \"2\",\n          \"array\": [1, 2]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of maxItems is undefined\",\n        \"data\": {\n          \"array\": [1, 2]\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/maxLength.json",
    "content": "[\n  {\n    \"description\": \"string length is <= than another property\",\n    \"schema\": {\n      \"properties\": {\n        \"maximumLength\": {},\n        \"string\": {\"maxLength\": {\"$data\": \"1/maximumLength\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"shorter is valid\",\n        \"data\": {\n          \"maximumLength\": 2,\n          \"string\": \"f\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"exact length is valid\",\n        \"data\": {\n          \"maximumLength\": 2,\n          \"string\": \"fo\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"too long is invalid\",\n        \"data\": {\n          \"maximumLength\": 2,\n          \"string\": \"foo\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-strings\",\n        \"data\": {\n          \"maximumLength\": 2,\n          \"string\": 100\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of maxLength is not a number\",\n        \"data\": {\n          \"maximumLength\": \"2\",\n          \"string\": \"f\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of maxLength is undefined\",\n        \"data\": {\n          \"string\": \"f\"\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/maxProperties.json",
    "content": "[\n  {\n    \"description\": \"number of object properties is <= than another property\",\n    \"schema\": {\n      \"properties\": {\n        \"maxKeys\": {},\n        \"object\": {\"maxProperties\": {\"$data\": \"1/maxKeys\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"shorter is valid\",\n        \"data\": {\n          \"maxKeys\": 2,\n          \"object\": {\"foo\": 1}\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"exact length is valid\",\n        \"data\": {\n          \"maxKeys\": 2,\n          \"object\": {\"foo\": 1, \"bar\": 2}\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"too long is invalid\",\n        \"data\": {\n          \"maxKeys\": 2,\n          \"object\": {\"foo\": 1, \"bar\": 2, \"baz\": 3}\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-objects\",\n        \"data\": {\n          \"maxKeys\": 2,\n          \"object\": \"foobar\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of maxProperties is not a number\",\n        \"data\": {\n          \"maxKeys\": \"2\",\n          \"object\": {\"foo\": 1, \"bar\": 2}\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of maxProperties is undefined\",\n        \"data\": {\n          \"object\": {\"foo\": 1, \"bar\": 2}\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/maximum.json",
    "content": "[\n  {\n    \"description\": \"one property is maximum for another\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"smallerOrEqual\": {\n          \"maximum\": {\"$data\": \"1/larger\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the maximum is valid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"above the maximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-numbers\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": \"4\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of maximum is not number\",\n        \"data\": {\n          \"larger\": \"3\",\n          \"smallerOrEqual\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of maximum is undefined\",\n        \"data\": {\n          \"smallerOrEqual\": 2\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMaximum is $data\",\n    \"schema\": {\n      \"properties\": {\n        \"number\": {\n          \"maximum\": 5,\n          \"exclusiveMaximum\": {\"$data\": \"1/exclusiveMaximum\"}\n        },\n        \"exclusiveMaximum\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"exclusiveMaximum boolean no longer supported\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMaximum\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the maximum is valid when exclusiveMaximum is strictly larger\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMaximum\": 4.1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"below the maximum is NOT valid when exclusiveMaximum is equal\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMaximum\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the maximum is valid when exclusiveMaximum is undefined\",\n        \"data\": {\n          \"number\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid when exclusiveMaximum is equal\",\n        \"data\": {\n          \"number\": 3,\n          \"exclusiveMaximum\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMaximum is smaller\",\n        \"data\": {\n          \"number\": 3,\n          \"exclusiveMaximum\": 3.1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMaximum is undefined\",\n        \"data\": {\n          \"number\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"above the maximum is invalid\",\n        \"data\": {\n          \"number\": 6\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"fails if value of exclusiveMaximum is not number\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMaximum\": \"5\"\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"maximum and exclusiveMaximum are $data\",\n    \"schema\": {\n      \"properties\": {\n        \"larger\": {},\n        \"smallerOrEqual\": {\n          \"maximum\": {\"$data\": \"1/larger\"},\n          \"exclusiveMaximum\": {\"$data\": \"1/exclusiveMaximum\"}\n        },\n        \"exclusiveMaximum\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"exclusiveMaximum boolean no longer supported\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 2,\n          \"exclusiveMaximum\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the maximum is valid when exclusiveMaximum is strictly larger\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 2,\n          \"exclusiveMaximum\": 2.1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"below the maximum is NOT valid when exclusiveMaximum is equal\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 2,\n          \"exclusiveMaximum\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the maximum is valid when exclusiveMaximum is undefined\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"above the maximum is invalid\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 4,\n          \"exclusiveMaximum\": 5\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the maximum is invalid when exclusiveMaximum is undefined\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"fails if value of exclusiveMaximum is not number\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 2,\n          \"exclusiveMaximum\": \"5\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMaximum is strictly larger\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 3,\n          \"exclusiveMaximum\": 3.1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid when exclusiveMaximum is equal\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 3,\n          \"exclusiveMaximum\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMaximum is undefined\",\n        \"data\": {\n          \"larger\": 3,\n          \"smallerOrEqual\": 3\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"items in array are <= than their indeces\",\n    \"schema\": {\n      \"items\": {\n        \"maximum\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [0, 1, 1, 2, 2, 4],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array (2>1)\",\n        \"data\": [0, 2],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/minItems.json",
    "content": "[\n  {\n    \"description\": \"array length is >= than another property\",\n    \"schema\": {\n      \"properties\": {\n        \"minArrayLength\": {},\n        \"array\": {\"minItems\": {\"$data\": \"1/minArrayLength\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"longer is valid\",\n        \"data\": {\n          \"minArrayLength\": 2,\n          \"array\": [1, 2, 3]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"exact length is valid\",\n        \"data\": {\n          \"minArrayLength\": 2,\n          \"array\": [1, 2]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"too short is invalid\",\n        \"data\": {\n          \"minArrayLength\": 2,\n          \"array\": [1]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-arrays\",\n        \"data\": {\n          \"minArrayLength\": 2,\n          \"array\": \"foobar\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of minItems is not a number\",\n        \"data\": {\n          \"minArrayLength\": \"2\",\n          \"array\": [1, 2]\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/minLength.json",
    "content": "[\n  {\n    \"description\": \"string length is >= than another property\",\n    \"schema\": {\n      \"properties\": {\n        \"minimumLength\": {},\n        \"string\": {\"minLength\": {\"$data\": \"1/minimumLength\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"longer is valid\",\n        \"data\": {\n          \"minimumLength\": 2,\n          \"string\": \"foo\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"exact length is valid\",\n        \"data\": {\n          \"minimumLength\": 2,\n          \"string\": \"fo\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"too short is invalid\",\n        \"data\": {\n          \"minimumLength\": 2,\n          \"string\": \"f\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-strings\",\n        \"data\": {\n          \"minimumLength\": 2,\n          \"string\": 100\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of minLength is not a number\",\n        \"data\": {\n          \"minimumLength\": \"2\",\n          \"string\": \"foo\"\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/minProperties.json",
    "content": "[\n  {\n    \"description\": \"number of object properties is >= than another property\",\n    \"schema\": {\n      \"properties\": {\n        \"minKeys\": {},\n        \"object\": {\"minProperties\": {\"$data\": \"1/minKeys\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"longer is valid\",\n        \"data\": {\n          \"minKeys\": 2,\n          \"object\": {\"foo\": 1, \"bar\": 2, \"baz\": 3}\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"exact length is valid\",\n        \"data\": {\n          \"minKeys\": 2,\n          \"object\": {\"foo\": 1, \"bar\": 2}\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"too short is invalid\",\n        \"data\": {\n          \"minKeys\": 2,\n          \"object\": {\"foo\": 1}\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-objects\",\n        \"data\": {\n          \"minKeys\": 2,\n          \"object\": \"foobar\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of minProperties is not a number\",\n        \"data\": {\n          \"minKeys\": \"2\",\n          \"object\": {\"foo\": 1, \"bar\": 2}\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/minimum.json",
    "content": "[\n  {\n    \"description\": \"one property is minimum for another\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"largerOrEqual\": {\n          \"minimum\": {\"$data\": \"1/smaller\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"equal to the minimum is valid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"below the minimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-numbers\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": \"2\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of minimum is not number\",\n        \"data\": {\n          \"smaller\": \"3\",\n          \"largerOrEqual\": 4\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"exclusiveMinimum is $data\",\n    \"schema\": {\n      \"properties\": {\n        \"number\": {\n          \"minimum\": 3,\n          \"exclusiveMinimum\": {\"$data\": \"1/exclusiveMinimum\"}\n        },\n        \"exclusiveMinimum\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"exclusiveMinimum boolean no longer supported\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMinimum\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the minimum is valid when exclusiveMinimum is strictly smaller\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMinimum\": 3.9\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"above the minimum is NOT valid when exclusiveMinimum is equal\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMinimum\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the minimum is valid when exclusiveMinimum is undefined\",\n        \"data\": {\n          \"number\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid when exclusiveMinimum is equal\",\n        \"data\": {\n          \"number\": 3,\n          \"exclusiveMinimum\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMinimum is smaller\",\n        \"data\": {\n          \"number\": 3,\n          \"exclusiveMinimum\": 2.9\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMinimum is undefined\",\n        \"data\": {\n          \"number\": 3\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"below the minimum is invalid\",\n        \"data\": {\n          \"number\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"fails if value of exclusiveMinimum is not number\",\n        \"data\": {\n          \"number\": 4,\n          \"exclusiveMinimum\": \"3\"\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"minimum and exclusiveMinimum are $data\",\n    \"schema\": {\n      \"properties\": {\n        \"smaller\": {},\n        \"largerOrEqual\": {\n          \"minimum\": {\"$data\": \"1/smaller\"},\n          \"exclusiveMinimum\": {\"$data\": \"1/exclusiveMinimum\"}\n        },\n        \"exclusiveMinimum\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"exclusiveMinimum boolean no longer supported\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 4,\n          \"exclusiveMinimum\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the minimum is valid when exclusiveMinimum is strictly smaller\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 4,\n          \"exclusiveMinimum\": 3.9\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"above the minimum is NOT valid when exclusiveMinimum is equal\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 4,\n          \"exclusiveMinimum\": 4\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the minimum is valid when exclusiveMinimum is undefined\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"below the minimum is invalid\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 2,\n          \"exclusiveMinimum\": 1.5\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"below the minimum is invalid when exclusiveMinimum is undefined\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"fails if value of exclusiveMinimum is not number\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 4,\n          \"exclusiveMinimum\": \"3\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMinimum is strictly smaller\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 3,\n          \"exclusiveMinimum\": 2.9\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid when exclusiveMinimum is equal\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 3,\n          \"exclusiveMinimum\": 3\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"boundary point is valid when exclusiveMinimum is undefined\",\n        \"data\": {\n          \"smaller\": 3,\n          \"largerOrEqual\": 3\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"items in array are >= than their indeces\",\n    \"schema\": {\n      \"items\": {\n        \"minimum\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [1, 2, 2, 4, 5, 5],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array (0.5<1)\",\n        \"data\": [0, 0.5],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/multipleOf.json",
    "content": "[\n  {\n    \"description\": \"one property is multiple of another\",\n    \"schema\": {\n      \"properties\": {\n        \"divider\": {},\n        \"multiple\": {\"multipleOf\": {\"$data\": \"1/divider\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"int by int valid\",\n        \"data\": {\n          \"divider\": 3,\n          \"multiple\": 12\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"float by float valid\",\n        \"data\": {\n          \"divider\": 2.5,\n          \"multiple\": 7.5\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"int by int invalid\",\n        \"data\": {\n          \"divider\": 3,\n          \"multiple\": 10\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"float by float invalid\",\n        \"data\": {\n          \"divider\": 2.5,\n          \"multiple\": 8\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-numbers\",\n        \"data\": {\n          \"divider\": 2.5,\n          \"multiple\": \"not a number\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of multipleOf is not a number\",\n        \"data\": {\n          \"divider\": \"2.5\",\n          \"multiple\": 10\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of multipleOf is undefined\",\n        \"data\": {\n          \"multiple\": 10\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid if value of multipleOf is 0\",\n        \"data\": {\n          \"divider\": 0,\n          \"multiple\": 10\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"one property is multiple of another property with escaped characters\",\n    \"schema\": {\n      \"properties\": {\n        \"/divider~\": {\"type\": \"number\"},\n        \"/multiple~\": {\"multipleOf\": {\"$data\": \"1/~1divider~0\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"int by int valid\",\n        \"data\": {\n          \"/divider~\": 3,\n          \"/multiple~\": 12\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"int by int invalid\",\n        \"data\": {\n          \"/divider~\": 3,\n          \"/multiple~\": 10\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"one subproperty is multiple of another\",\n    \"schema\": {\n      \"properties\": {\n        \"divider\": {\n          \"properties\": {\n            \"value\": {\"type\": \"number\"}\n          }\n        },\n        \"multiple\": {\n          \"properties\": {\n            \"value\": {\"multipleOf\": {\"$data\": \"2/divider/value\"}}\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"int by int valid\",\n        \"data\": {\n          \"divider\": {\"value\": 3},\n          \"multiple\": {\"value\": 12}\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"int by int invalid\",\n        \"data\": {\n          \"divider\": {\"value\": 3},\n          \"multiple\": {\"value\": 10}\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"item is a multiple of its index\",\n    \"schema\": {\n      \"items\": [{}],\n      \"additionalItems\": {\n        \"multipleOf\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [\"anything\", 1, 4, 12, 8, 10],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array (3 is not a multiple of 2)\",\n        \"data\": [\"anything\", 1, 3],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"item property is a multiple of item index\",\n    \"schema\": {\n      \"items\": [{}],\n      \"additionalItems\": {\n        \"properties\": {\n          \"value\": {\n            \"multipleOf\": {\"$data\": \"1#\"}\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [\"anything\", {\"value\": 1}, {\"value\": 4}, {\"value\": 12}],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array (3 is not a multiple of 2)\",\n        \"data\": [\"anything\", {\"value\": 1}, {\"value\": 3}],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/pattern.json",
    "content": "[\n  {\n    \"description\": \"one property is pattern for another\",\n    \"schema\": {\n      \"properties\": {\n        \"shouldMatch\": {},\n        \"string\": {\"pattern\": {\"$data\": \"1/shouldMatch\"}}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"a matching pattern is valid\",\n        \"data\": {\n          \"shouldMatch\": \"^a*$\",\n          \"string\": \"aaa\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"a non-matching pattern is invalid\",\n        \"data\": {\n          \"shouldMatch\": \"^a*$\",\n          \"string\": \"abc\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"ignores non-strings\",\n        \"data\": {\n          \"shouldMatch\": \"^a*$\",\n          \"string\": 123\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of pattern is not a string\",\n        \"data\": {\n          \"shouldMatch\": 123,\n          \"string\": \"123\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of pattern is undefined\",\n        \"data\": {\n          \"string\": \"123\"\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"property values should contain their names\",\n    \"schema\": {\n      \"additionalProperties\": {\n        \"pattern\": {\"$data\": \"0#\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid property values\",\n        \"data\": {\"foo\": \"1foo\", \"bar\": \"bar2\", \"baz\": \"3baz4\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid property values\",\n        \"data\": {\"foo\": \"fo\"},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/required.json",
    "content": "[\n  {\n    \"description\": \"required schema in data property\",\n    \"schema\": {\n      \"properties\": {\n        \"foo\": {},\n        \"bar\": {},\n        \"requiredProperties\": {}\n      },\n      \"required\": {\"$data\": \"0/requiredProperties\"}\n    },\n    \"tests\": [\n      {\n        \"description\": \"present required property is valid\",\n        \"data\": {\n          \"foo\": 1,\n          \"requiredProperties\": [\"foo\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"non-present required property is invalid\",\n        \"data\": {\n          \"bar\": 2,\n          \"requiredProperties\": [\"foo\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"non-present second required property is invalid\",\n        \"data\": {\n          \"foo\": 1,\n          \"requiredProperties\": [\"foo\", \"bar\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"two present required properties is valid\",\n        \"data\": {\n          \"foo\": 1,\n          \"bar\": 2,\n          \"requiredProperties\": [\"foo\", \"bar\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if value of required is not an array\",\n        \"data\": {\n          \"foo\": 1,\n          \"bar\": 2,\n          \"requiredProperties\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid if value of required is undefined\",\n        \"data\": {\n          \"foo\": 1,\n          \"bar\": 2\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/$data/uniqueItems.json",
    "content": "[\n  {\n    \"description\": \"uniqueItems in property\",\n    \"schema\": {\n      \"properties\": {\n        \"list\": {\n          \"uniqueItems\": {\"$data\": \"1/unique\"}\n        },\n        \"unique\": {}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"unique array is valid\",\n        \"data\": {\n          \"list\": [1, 2],\n          \"unique\": true\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"non-unique array is invalid\",\n        \"data\": {\n          \"list\": [1, 1],\n          \"unique\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"non-unique array is valid if uniqueItems is false\",\n        \"data\": {\n          \"list\": [1, 1],\n          \"unique\": false\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"non-unique array is valid if uniqueItems is undefined\",\n        \"data\": {\n          \"list\": [1, 1]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"fails if uniqueItems is not boolean\",\n        \"data\": {\n          \"list\": [1, 2],\n          \"unique\": \"true\"\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/const.json",
    "content": "[\n  {\n    \"description\": \"const keyword requires the value to be equal to some constant\",\n    \"schema\": {\"const\": 2},\n    \"tests\": [\n      {\n        \"description\": \"same value is valid\",\n        \"data\": 2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"another value is invalid\",\n        \"data\": 5,\n        \"valid\": false\n      },\n      {\n        \"description\": \"another type is invalid\",\n        \"data\": \"a\",\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"const keyword requires the value to be equal to some object\",\n    \"schema\": {\"const\": {\"foo\": \"bar\", \"baz\": \"bax\"}},\n    \"tests\": [\n      {\n        \"description\": \"same object is valid\",\n        \"data\": {\"foo\": \"bar\", \"baz\": \"bax\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"same object with different property order is valid\",\n        \"data\": {\"baz\": \"bax\", \"foo\": \"bar\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"another object is invalid\",\n        \"data\": {\"foo\": \"bar\"},\n        \"valid\": false\n      },\n      {\n        \"description\": \"another type is invalid\",\n        \"data\": [1, 2],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"const keyword with null\",\n    \"schema\": {\"const\": null},\n    \"tests\": [\n      {\n        \"description\": \"null is valid\",\n        \"data\": null,\n        \"valid\": true\n      },\n      {\n        \"description\": \"not null is invalid\",\n        \"data\": 0,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/contains.json",
    "content": "[\n  {\n    \"description\": \"contains keyword requires the item matching schema to be present\",\n    \"schema\": {\n      \"contains\": {\"minimum\": 5}\n    },\n    \"tests\": [\n      {\n        \"description\": \"array with item matching schema (5) is valid\",\n        \"data\": [3, 4, 5],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array with item matching schema (6) is valid\",\n        \"data\": [3, 4, 6],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array without item matching schema is invalid\",\n        \"data\": [1, 2, 3, 4],\n        \"valid\": false\n      },\n      {\n        \"description\": \"empty array is invalid\",\n        \"data\": [],\n        \"valid\": false\n      },\n      {\n        \"description\": \"not array is valid\",\n        \"data\": {},\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"contains keyword with const keyword requires a specific item to be present\",\n    \"schema\": {\n      \"contains\": {\"const\": 5}\n    },\n    \"tests\": [\n      {\n        \"description\": \"array with item 5 is valid\",\n        \"data\": [3, 4, 5],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array without item 5 is invalid\",\n        \"data\": [1, 2, 3, 4],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/exclusiveMaximum.json",
    "content": "[\n  {\n    \"description\": \"exclusiveMaximum as number\",\n    \"schema\": {\n      \"exclusiveMaximum\": 3.0\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the exclusiveMaximum is valid\",\n        \"data\": 2.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": 3.0,\n        \"valid\": false\n      },\n      {\n        \"description\": \"above the exclusiveMaximum is invalid\",\n        \"data\": 3.2,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"both exclusiveMaximum and maximum are numbers, exclusiveMaximum > maximum\",\n    \"schema\": {\n      \"exclusiveMaximum\": 3.0,\n      \"maximum\": 2.0\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the maximum is valid\",\n        \"data\": 1.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is valid\",\n        \"data\": 2.0,\n        \"valid\": true\n      },\n      {\n        \"description\": \"above maximum is invalid\",\n        \"data\": 2.2,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"both exclusiveMaximum and maximum are numbers, exclusiveMaximum = maximum\",\n    \"schema\": {\n      \"exclusiveMaximum\": 3.0,\n      \"maximum\": 3.0\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the maximum is valid\",\n        \"data\": 2.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": 3.0,\n        \"valid\": false\n      },\n      {\n        \"description\": \"above maximum is invalid\",\n        \"data\": 3.2,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"both exclusiveMaximum and maximum are numbers, exclusiveMaximum < maximum\",\n    \"schema\": {\n      \"exclusiveMaximum\": 2.0,\n      \"maximum\": 3.0\n    },\n    \"tests\": [\n      {\n        \"description\": \"below the exclusiveMaximum is valid\",\n        \"data\": 1.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": 2.0,\n        \"valid\": false\n      },\n      {\n        \"description\": \"above exclusiveMaximum is invalid\",\n        \"data\": 2.2,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras/exclusiveMinimum.json",
    "content": "[\n  {\n    \"description\": \"exclusiveMinimum as number\",\n    \"schema\": {\n      \"exclusiveMinimum\": 1.1\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the exclusiveMinimum is still valid\",\n        \"data\": 1.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": 1.1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"below exclusiveMinimum is invalid\",\n        \"data\": 1.0,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"both exclusiveMinimum and minimum are numbers, exclusiveMinimum < minimum\",\n    \"schema\": {\n      \"exclusiveMinimum\": 2.0,\n      \"minimum\": 3.0\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the minimum is valid\",\n        \"data\": 3.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is valid\",\n        \"data\": 3.0,\n        \"valid\": true\n      },\n      {\n        \"description\": \"below minimum is invalid\",\n        \"data\": 2.2,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"both exclusiveMinimum and minimum are numbers, exclusiveMinimum = minimum\",\n    \"schema\": {\n      \"exclusiveMinimum\": 3.0,\n      \"minimum\": 3.0\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the minimum is valid\",\n        \"data\": 3.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": 3.0,\n        \"valid\": false\n      },\n      {\n        \"description\": \"below minimum is invalid\",\n        \"data\": 2.2,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"both exclusiveMinimum and minimum are numbers, exclusiveMinimum > minimum\",\n    \"schema\": {\n      \"exclusiveMinimum\": 3.0,\n      \"minimum\": 2.0\n    },\n    \"tests\": [\n      {\n        \"description\": \"above the exclusiveMinimum is valid\",\n        \"data\": 3.2,\n        \"valid\": true\n      },\n      {\n        \"description\": \"boundary point is invalid\",\n        \"data\": 3.0,\n        \"valid\": false\n      },\n      {\n        \"description\": \"below exclusiveMinimum is invalid\",\n        \"data\": 2.2,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/extras.spec.ts",
    "content": "import getAjvAllInstances from \"./ajv_all_instances\"\nimport {withStandalone} from \"./ajv_standalone\"\nimport {_} from \"../dist/compile/codegen/code\"\nimport jsonSchemaTest = require(\"json-schema-test\")\nimport options from \"./ajv_options\"\nimport {afterError, afterEach} from \"./after_test\"\nimport chai from \"./chai\"\n\nconst instances = getAjvAllInstances(options, {\n  $data: true,\n  formats: {allowedUnknown: true},\n  strictTypes: false,\n  strictTuples: false,\n})\n\ninstances.forEach((ajv) => {\n  ajv.opts.code.source = true\n  ajv.opts.code.formats = _`{allowedUnknown: true}`\n})\n\njsonSchemaTest(withStandalone(instances), {\n  description:\n    \"Extra keywords schemas tests of \" + instances.length + \" ajv instances with different options\",\n  suites: {extras: require(\"./_json/extras\")},\n  assert: chai.assert,\n  afterError,\n  afterEach,\n  cwd: __dirname,\n  hideFolder: \"extras/\",\n  timeout: 90000,\n})\n"
  },
  {
    "path": "spec/issues/1001_addKeyword_and_schema_without_id.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #1001: addKeyword breaks schema without ID\", () => {\n  it(\"should allow using schemas without ID with addKeyword\", () => {\n    const schema = {\n      definitions: {\n        foo: {},\n      },\n    }\n\n    const ajv: any = new _Ajv()\n    ajv.addSchema(schema)\n    ajv.addKeyword(\"myKeyword\")\n    ajv.getSchema(\"#/definitions/foo\").should.be.a(\"function\")\n  })\n})\n"
  },
  {
    "path": "spec/issues/1344_non_root_recursive_ref_standalone.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport standaloneCode from \"../../dist/standalone\"\nimport requireFromString = require(\"require-from-string\")\nimport assert = require(\"assert\")\n\nconst schema = {\n  $schema: \"http://json-schema.org/draft-07/schema#\",\n  $id: \"schema\",\n  $ref: \"#/$defs/foo\",\n  $defs: {\n    foo: {\n      type: \"object\",\n      properties: {\n        bar: {$ref: \"#/$defs/bar\"},\n      },\n    },\n    bar: {\n      oneOf: [{$ref: \"#/$defs/foo\"}],\n    },\n  },\n}\n\ndescribe(\"issue #1344: non-root recursive ref with standalone code\", () => {\n  it(\"should compile to standalone code\", () => {\n    const ajv = new _Ajv({code: {source: true}})\n    ajv.addSchema(schema)\n    const validate = ajv.getSchema(\"schema#/$defs/foo\")\n    assert(typeof validate == \"function\")\n    assert.strictEqual(validate({}), true)\n\n    const moduleCode = standaloneCode(ajv, validate)\n    const standaloneValidate = requireFromString(moduleCode)\n    assert(typeof standaloneValidate == \"function\")\n    assert.strictEqual(standaloneValidate({}), true)\n  })\n})\n"
  },
  {
    "path": "spec/issues/1414_base_uri_change.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport assert = require(\"assert\")\n\nconst schema1 = {\n  $id: \"one\",\n  type: \"object\",\n  properties: {\n    foo: {$ref: \"#/definitions/foo\"},\n  },\n  definitions: {\n    foo: {$ref: \"two\"},\n  },\n}\n\nconst schema2 = {\n  $id: \"two\",\n  type: \"object\",\n  properties: {\n    bar: {$ref: \"#/definitions/bar\"},\n  },\n  definitions: {\n    bar: {type: \"string\"},\n  },\n}\n\ndescribe(\"issue 1414: base URI change\", () => {\n  it(\"should compile schema\", () => {\n    const ajv = new _Ajv()\n    ajv.addSchema(schema2)\n    const validate = ajv.compile(schema1)\n    assert.strictEqual(typeof validate, \"function\")\n    assert.strictEqual(validate({foo: {bar: 1}}), false)\n    assert.strictEqual(validate({foo: {bar: \"1\"}}), true)\n  })\n})\n"
  },
  {
    "path": "spec/issues/1501_jtd_many_properties.spec.ts",
    "content": "import type Ajv from \"../..\"\nimport _Ajv from \"../ajv_jtd\"\nimport * as assert from \"assert\"\n\nconst PROP_COUNT = 10\n\ndescribe(\"schema with many properties\", () => {\n  let ajv: Ajv\n  const schema = {properties: {}}\n  const data = {}\n  const invalidData = {}\n\n  before(() => {\n    ajv = new _Ajv()\n    for (let i = 0; i < PROP_COUNT; i++) {\n      const prop = `prop${i}`\n      schema.properties[prop] = {type: \"uint16\"}\n      data[prop] = i\n      invalidData[prop] = -i\n    }\n  })\n\n  it(\"should correctly compile reference to schema\", () => {\n    assert.strictEqual(ajv.validate(schema, data), true)\n    assert.strictEqual(ajv.validate(schema, invalidData), false)\n  })\n})\n"
  },
  {
    "path": "spec/issues/1515_evaluated_properties_nested_anyof.spec.ts",
    "content": "import _Ajv from \"../ajv2019\"\nimport * as assert from \"assert\"\n\ndescribe(\"tracking evaluated properties with nested anyOf\", () => {\n  it(\"should initialize evaluated properties\", () => {\n    const ajv = new _Ajv()\n\n    const schema = {\n      type: \"object\",\n      anyOf: [\n        {\n          required: [\"foo\"],\n          properties: {foo: {}},\n        },\n        {\n          anyOf: [\n            {\n              properties: {bar: {}},\n            },\n          ],\n        },\n      ],\n    }\n\n    const validate = ajv.compile(schema)\n    assert.strictEqual(validate({bar: 1}), true)\n  })\n})\n"
  },
  {
    "path": "spec/issues/1539_add_keyword_name_to_validation_error.spec.ts",
    "content": "import _Ajv from \"../ajv2019\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"keyword usage validation error\", () => {\n  it(\"should include the keyword name and schema path in the message\", () => {\n    const ajv = new _Ajv({\n      keywords: [\n        {\n          keyword: \"customKeyword\",\n          metaSchema: {\n            type: \"string\",\n          },\n          macro() {\n            return {}\n          },\n        },\n      ],\n    })\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        foo: {\n          type: \"object\",\n          customKeyword: {\n            bar: true,\n          },\n        },\n      },\n    }\n\n    should.throw(\n      () => ajv.compile(schema),\n      'keyword \"customKeyword\" value is invalid at path \"#/properties/foo\": data must be string'\n    )\n  })\n})\n"
  },
  {
    "path": "spec/issues/1625_evaluated_truthy_pattern_properties.spec.ts",
    "content": "import _Ajv from \"../ajv2020\"\nimport * as assert from \"assert\"\n\ndescribe(\"tracking evaluated properties with pattern properties of schema = true\", () => {\n  it(\"should initialize evaluated properties\", () => {\n    const ajv = new _Ajv()\n\n    const schema = {\n      type: \"object\",\n      patternProperties: {\n        \"^x-\": true,\n      },\n      unevaluatedProperties: false,\n    }\n\n    const validate = ajv.compile(schema)\n    assert.strictEqual(validate({bar: 1}), false)\n    assert.strictEqual(validate({\"x-bar\": false}), true)\n  })\n})\n"
  },
  {
    "path": "spec/issues/1683_re2_engine.spec.ts",
    "content": "import getAjvAllInstances from \"../ajv_all_instances\"\nimport {withStandalone} from \"../ajv_standalone\"\nimport {_} from \"../../dist/compile/codegen/code\"\nimport jsonSchemaTest = require(\"json-schema-test\")\nimport options from \"../ajv_options\"\nimport {afterError, afterEach} from \"../after_test\"\nimport chai from \"../chai\"\nimport re2 from \"../../dist/runtime/re2\"\nimport re2tests from \"./re2\"\n\nconst instances = getAjvAllInstances(options, {\n  $data: true,\n  formats: {allowedUnknown: true},\n  strictTypes: false,\n  strictTuples: false,\n})\n\ninstances.forEach((ajv) => {\n  ajv.opts.code.source = true\n  ajv.opts.code.formats = _`{allowedUnknown: true}`\n  ajv.opts.code.regExp = re2\n})\n\njsonSchemaTest(withStandalone(instances), {\n  description: \"Test with re2 RegExp engine with \" + instances.length + \" ajv instances\",\n  suites: {\"regular expressions\": re2tests},\n  assert: chai.assert,\n  afterError,\n  afterEach,\n  cwd: __dirname,\n  hideFolder: \"extras/\",\n  timeout: 90000,\n})\n"
  },
  {
    "path": "spec/issues/1819_mincontains.spec.ts",
    "content": "import _Ajv from \"../ajv2020\"\nimport * as assert from \"assert\"\n\ndescribe(\"`minContains: 0` without valid items (issue #1819)\", () => {\n  const ajv = new _Ajv()\n\n  const schema = {\n    type: \"array\",\n    minContains: 0,\n    maxContains: 1,\n    contains: {type: \"number\"},\n  }\n\n  const validate = ajv.compile(schema)\n\n  it(\"no items valid\", () => assert.strictEqual(validate([\"foo\"]), true))\n  it(\"1 item valid\", () => assert.strictEqual(validate([\"foo\", 1]), true))\n  it(\"2 items invalid\", () => assert.strictEqual(validate([\"foo\", 1, 2]), false))\n})\n"
  },
  {
    "path": "spec/issues/181_allErrors_custom_keyword_skipped.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport {KeywordDefinition, SchemaValidateFunction} from \"../../dist/types\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #181, user-defined keyword is not validated in allErrors mode if there were previous error\", () => {\n  it(\"should validate user-defined keyword that doesn't create errors\", () => {\n    testKeywordErrors({\n      keyword: \"alwaysFails\",\n      type: \"object\",\n      errors: true,\n      validate: function v(/* value */) {\n        return false\n      },\n    })\n  })\n\n  it(\"should validate keyword that creates errors\", () => {\n    const validate: SchemaValidateFunction = (/* value */) => {\n      validate.errors = validate.errors || []\n      validate.errors.push({\n        keyword: \"alwaysFails\",\n        message: \"alwaysFails error\",\n        params: {\n          keyword: \"alwaysFails\",\n        },\n      })\n      return false\n    }\n\n    testKeywordErrors({\n      keyword: \"alwaysFails\",\n      type: \"object\",\n      errors: true,\n      validate,\n    })\n  })\n\n  function testKeywordErrors(def: KeywordDefinition): void {\n    const ajv = new _Ajv({allErrors: true})\n\n    ajv.addKeyword(def)\n\n    const schema = {\n      type: \"object\",\n      required: [\"foo\"],\n      alwaysFails: true,\n    }\n\n    const validate: any = ajv.compile(schema)\n\n    validate({foo: 1}).should.equal(false)\n    validate.errors.should.have.length(1)\n    validate.errors[0].keyword.should.equal(\"alwaysFails\")\n\n    validate({}).should.equal(false)\n    validate.errors.should.have.length(2)\n    validate.errors[0].keyword.should.equal(\"required\")\n    validate.errors[1].keyword.should.equal(\"alwaysFails\")\n  }\n})\n"
  },
  {
    "path": "spec/issues/182_nan_validation.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #182, NaN validation\", () => {\n  const ajv = new _Ajv({strictTypes: false})\n\n  it(\"should pass minimum/maximum validation without type\", () => {\n    testNaN(ajv, {minimum: 1}, true)\n    testNaN(ajv, {maximum: 1}, true)\n  })\n\n  it(\"should NOT pass minimum/maximum validation without type when strict: false\", () => {\n    const _ajv = new _Ajv({strict: false})\n    testNaN(_ajv, {minimum: 1}, false)\n    testNaN(_ajv, {maximum: 1}, false)\n  })\n\n  it(\"should not pass minimum/maximum validation with type\", () => {\n    testNaN(ajv, {type: \"number\", minimum: 1}, false)\n    testNaN(ajv, {type: \"number\", maximum: 1}, false)\n  })\n\n  it(\"should pass type: number validation when strict: false\", () => {\n    const _ajv = new _Ajv({strict: false})\n    testNaN(_ajv, {type: \"number\"}, true)\n  })\n\n  it(\"should not pass type: number validation (changed in v7 - strict by default)\", () => {\n    testNaN(ajv, {type: \"number\"}, false)\n  })\n\n  it(\"should not pass type: integer validation\", () => {\n    testNaN(ajv, {type: \"integer\"}, false)\n  })\n\n  function testNaN(_ajv, schema, NaNisValid) {\n    const validate = _ajv.compile(schema)\n    validate(NaN).should.equal(NaNisValid)\n  }\n})\n"
  },
  {
    "path": "spec/issues/1935_integer_narrowing_subschema.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport Ajv from \"ajv\"\nimport * as assert from \"assert\"\n\ndescribe(\"integer valid type in number sub-schema (issue #1935)\", () => {\n  let ajv: Ajv\n  before(() => {\n    ajv = new _Ajv({strict: true})\n  })\n\n  it(\"should allow integer in `if`\", () =>\n    assert.doesNotThrow(() =>\n      ajv.compile({\n        type: \"number\",\n        if: {\n          type: \"integer\",\n          maximum: 5,\n        },\n        else: {\n          minimum: 10,\n        },\n      })\n    ))\n\n  it(\"should allow integer in `then`\", () =>\n    assert.doesNotThrow(() =>\n      ajv.compile({\n        type: \"number\",\n        if: {\n          multipleOf: 2,\n        },\n        then: {\n          type: \"integer\",\n          minimum: 10,\n        },\n      })\n    ))\n\n  it(\"should allow integer in `else`\", () =>\n    assert.doesNotThrow(() =>\n      ajv.compile({\n        type: \"number\",\n        if: {\n          maximum: 5,\n        },\n        else: {\n          type: \"integer\",\n          minimum: 10,\n        },\n      })\n    ))\n\n  it(\"should allow integer in `allOf`\", () =>\n    assert.doesNotThrow(() =>\n      ajv.compile({\n        type: \"number\",\n        allOf: [\n          {\n            type: \"integer\",\n            minimum: 10,\n          },\n          {\n            multipleOf: 2,\n          },\n        ],\n      })\n    ))\n\n  it(\"should allow integer in `oneOf`\", () =>\n    assert.doesNotThrow(() =>\n      ajv.compile({\n        type: \"number\",\n        oneOf: [\n          {\n            type: \"integer\",\n            minimum: 10,\n          },\n          {\n            multipleOf: 2,\n          },\n        ],\n      })\n    ))\n\n  it(\"should allow integer in `anyOf`\", () =>\n    assert.doesNotThrow(() =>\n      ajv.compile({\n        type: \"number\",\n        oneOf: [\n          {\n            type: \"integer\",\n            minimum: 10,\n          },\n          {\n            multipleOf: 2,\n          },\n        ],\n      })\n    ))\n\n  it(\"should allow integer in `not`\", () =>\n    assert.doesNotThrow(() =>\n      ajv.compile({\n        type: \"number\",\n        not: {\n          type: \"integer\",\n          minimum: 10,\n        },\n      })\n    ))\n})\n"
  },
  {
    "path": "spec/issues/1949_jtd_empty_values.spec.ts",
    "content": "import _Ajv from \"../ajv_jtd\"\nimport * as assert from \"assert\"\n\ndescribe(\"JTD values with empty schema (issue #1949)\", () => {\n  const ajv = new _Ajv()\n\n  it(\"should correctly validate empty values form\", () => {\n    const schema = {values: {}}\n    const validate = ajv.compile(schema)\n    assert.strictEqual(validate({prop1: 1, prop2: 2}), true)\n    assert.strictEqual(validate({}), true)\n    assert.strictEqual(validate(null), false)\n    assert.strictEqual(validate(1), false)\n    assert.strictEqual(validate(\"foo\"), false)\n    assert.strictEqual(validate(undefined), false)\n  })\n\n  it(\"should correctly validate nullable empty values form\", () => {\n    const schema = {values: {}, nullable: true}\n    const validate = ajv.compile(schema)\n    assert.strictEqual(validate({prop1: 1, prop2: 2}), true)\n    assert.strictEqual(validate({}), true)\n    assert.strictEqual(validate(null), true)\n    assert.strictEqual(validate(1), false)\n    assert.strictEqual(validate(\"foo\"), false)\n    assert.strictEqual(validate(undefined), false)\n  })\n})\n"
  },
  {
    "path": "spec/issues/1971_jtd_discriminator.spec.ts",
    "content": "import _Ajv from \"../ajv_jtd\"\nimport * as assert from \"assert\"\n\ndescribe(\"JTD discriminator with more than 8 (hardcoded in properties.ts) properties (issue #1971)\", () => {\n  const ajv = new _Ajv()\n\n  it(\"should correctly validate empty values form\", () => {\n    const schema = {\n      discriminator: \"tag\",\n      mapping: {\n        manual: {\n          properties: {\n            first: {type: \"uint16\"},\n            second: {type: \"uint16\"},\n            third: {type: \"uint16\"},\n            fourth: {type: \"uint16\"},\n            fifth: {type: \"uint16\"},\n            sixth: {type: \"uint16\"},\n            additionalOne: {type: \"uint16\"},\n            additionalTwo: {type: \"uint16\"},\n          },\n        },\n        auto: {\n          properties: {\n            first: {type: \"uint16\"},\n            second: {type: \"uint16\"},\n            third: {type: \"uint16\"},\n            fourth: {type: \"uint16\"},\n            fifth: {type: \"uint16\"},\n            sixth: {type: \"uint16\"},\n            additionalThree: {type: \"uint16\"},\n          },\n        },\n      },\n    }\n    const data1 = {\n      tag: \"manual\",\n      first: 1,\n      second: 1,\n      third: 1,\n      fourth: 1,\n      fifth: 1,\n      sixth: 1,\n      additionalOne: 1,\n      additionalTwo: 1,\n    }\n    const data2 = {\n      tag: \"auto\",\n      first: 1,\n      second: 1,\n      third: 1,\n      fourth: 1,\n      fifth: 1,\n      sixth: 1,\n      additionalThree: 1,\n    }\n    const validate = ajv.compile(schema)\n    assert.strictEqual(validate(data1), true)\n    assert.strictEqual(validate(data2), true)\n  })\n})\n"
  },
  {
    "path": "spec/issues/2001_jtd_only_optional_properties.spec.ts",
    "content": "import _Ajv from \"../ajv_jtd\"\nimport * as assert from \"assert\"\n\ndescribe(\"JTD schema with optional/additional properties only (issue #2001)\", () => {\n  const ajv = new _Ajv()\n\n  it(\"should correctly serialize optional properties\", () => {\n    const schema = {\n      optionalProperties: {\n        prop0: {type: \"uint16\"},\n        prop1: {type: \"uint16\"},\n        prop2: {type: \"uint16\"},\n      },\n      additionalProperties: true,\n    }\n    const serialize = ajv.compileSerializer(schema)\n    const test = (data, json) => assert.strictEqual(serialize(data), json)\n    test({prop0: 0, prop1: 1, prop2: 2}, '{\"prop0\":0,\"prop1\":1,\"prop2\":2}')\n    test({prop1: 1, prop2: 2}, '{\"prop1\":1,\"prop2\":2}')\n    test({prop0: 0, prop1: 1, prop2: 2, foo: \"bar\"}, '{\"prop0\":0,\"prop1\":1,\"prop2\":2,\"foo\":\"bar\"}')\n    test({prop1: 1, prop2: 2, foo: \"bar\"}, '{\"prop1\":1,\"prop2\":2,\"foo\":\"bar\"}')\n    test({foo: \"bar\"}, '{\"foo\":\"bar\"}')\n  })\n})\n"
  },
  {
    "path": "spec/issues/204_options_schemas_data_together.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #204, options schemas and $data used together\", () => {\n  it(\"should use v5 metaschemas by default\", () => {\n    const ajv = new _Ajv({\n      schemas: [{$id: \"str\", type: \"string\"}],\n      $data: true,\n    })\n\n    const schema = {const: 42}\n    const validate = ajv.compile(schema)\n\n    validate(42).should.equal(true)\n    validate(43).should.equal(false)\n\n    ajv.validate(\"str\", \"foo\").should.equal(true)\n    ajv.validate(\"str\", 42).should.equal(false)\n  })\n})\n"
  },
  {
    "path": "spec/issues/210_mutual_recur_frags.spec.ts",
    "content": "import type AjvCore from \"../../dist/core\"\nimport type AjvPack from \"../../dist/standalone/instance\"\nimport {getStandalone} from \"../ajv_standalone\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #210, mutual recursive $refs that are schema fragments\", () => {\n  describe(\"one ref is fragment\", () => {\n    it(\"should compile and validate schema\", spec(new _Ajv()))\n    it(\"should compile and validate schema: standalone\", spec(getStandalone(_Ajv)))\n\n    function spec(ajv: AjvCore | AjvPack): () => void {\n      return () => {\n        ajv.addSchema({\n          $id: \"foo\",\n          definitions: {\n            bar: {\n              type: \"object\",\n              properties: {\n                baz: {\n                  anyOf: [{enum: [42]}, {$ref: \"boo\"}],\n                },\n              },\n            },\n          },\n        })\n\n        ajv.addSchema({\n          $id: \"boo\",\n          type: \"object\",\n          required: [\"quux\"],\n          properties: {\n            quux: {$ref: \"foo#/definitions/bar\"},\n          },\n        })\n\n        const validate = ajv.compile({$ref: \"foo#/definitions/bar\"})\n        validate({baz: {quux: {baz: 42}}}).should.equal(true)\n        validate({baz: {quux: {baz: \"foo\"}}}).should.equal(false)\n      }\n    }\n  })\n\n  describe(\"both refs are fragments\", () => {\n    it(\"should compile and validate schema\", spec(new _Ajv()))\n    it(\"should compile and validate schema: standalone\", spec(getStandalone(_Ajv)))\n\n    function spec(ajv: AjvCore | AjvPack): () => void {\n      return () => {\n        ajv.addSchema({\n          $id: \"foo\",\n          definitions: {\n            bar: {\n              type: \"object\",\n              properties: {\n                baz: {\n                  anyOf: [{enum: [42]}, {$ref: \"boo#/definitions/buu\"}],\n                },\n              },\n            },\n          },\n        })\n\n        ajv.addSchema({\n          $id: \"boo\",\n          definitions: {\n            buu: {\n              type: \"object\",\n              required: [\"quux\"],\n              properties: {\n                quux: {$ref: \"foo#/definitions/bar\"},\n              },\n            },\n          },\n        })\n\n        const validate = ajv.compile({$ref: \"foo#/definitions/bar\"})\n\n        validate({baz: {quux: {baz: 42}}}).should.equal(true)\n        validate({baz: {quux: {baz: \"foo\"}}}).should.equal(false)\n      }\n    }\n  })\n})\n"
  },
  {
    "path": "spec/issues/240_mutual_recur_frags_common_ref.spec.ts",
    "content": "import type AjvCore from \"../../dist/core\"\nimport type AjvPack from \"../../dist/standalone/instance\"\nimport {getStandalone} from \"../ajv_standalone\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #240, mutually recursive fragment refs reference a common schema\", () => {\n  const apiSchema = {\n    $schema: \"http://json-schema.org/draft-07/schema#\",\n    $id: \"schema://api.schema#\",\n    $defs: {\n      resource: {\n        $id: \"#resource\",\n        type: \"object\",\n        properties: {\n          id: {type: \"string\"},\n        },\n      },\n      resourceIdentifier: {\n        $id: \"#resource_identifier\",\n        type: \"object\",\n        properties: {\n          id: {type: \"string\"},\n          type: {type: \"string\"},\n        },\n      },\n    },\n  }\n\n  const domainSchema = {\n    $schema: \"http://json-schema.org/draft-07/schema#\",\n    $id: \"schema://domain.schema#\",\n    type: \"object\",\n    properties: {\n      data: {\n        oneOf: [\n          {$ref: \"schema://library.schema#resource_identifier\"},\n          {$ref: \"schema://catalog_item.schema#resource_identifier\"},\n        ],\n      },\n    },\n  }\n\n  describe(\"one ref is fragment\", () => {\n    it(\"should compile and validate schema\", spec(new _Ajv()))\n    it(\"should compile and validate schema: standalone\", spec(getStandalone(_Ajv)))\n\n    function spec(ajv: AjvCore | AjvPack): () => void {\n      return () => {\n        const librarySchema = {\n          $schema: \"http://json-schema.org/draft-07/schema#\",\n          $id: \"schema://library.schema#\",\n          type: \"object\",\n          properties: {\n            name: {type: \"string\"},\n            links: {\n              type: \"object\",\n              properties: {\n                catalogItems: {\n                  type: \"array\",\n                  items: {\n                    $ref: \"schema://catalog_item_resource_identifier.schema#\",\n                  },\n                },\n              },\n            },\n          },\n          definitions: {\n            resource_identifier: {\n              $id: \"#resource_identifier\",\n              allOf: [\n                {\n                  type: \"object\",\n                  properties: {\n                    type: {\n                      type: \"string\",\n                      enum: [\"Library\"],\n                    },\n                  },\n                },\n                {$ref: \"schema://api.schema#resource_identifier\"},\n              ],\n            },\n          },\n        }\n\n        const catalogItemSchema = {\n          $schema: \"http://json-schema.org/draft-07/schema#\",\n          $id: \"schema://catalog_item.schema#\",\n          type: \"object\",\n          properties: {\n            name: {type: \"string\"},\n            links: {\n              type: \"object\",\n              properties: {\n                library: {$ref: \"schema://library.schema#resource_identifier\"},\n              },\n            },\n          },\n          definitions: {\n            resource_identifier: {\n              $id: \"#resource_identifier\",\n              allOf: [\n                {\n                  type: \"object\",\n                  properties: {\n                    type: {\n                      type: \"string\",\n                      enum: [\"CatalogItem\"],\n                    },\n                  },\n                },\n                {$ref: \"schema://api.schema#resource_identifier\"},\n              ],\n            },\n          },\n        }\n\n        const catalogItemResourceIdentifierSchema = {\n          $schema: \"http://json-schema.org/draft-07/schema#\",\n          $id: \"schema://catalog_item_resource_identifier.schema#\",\n          allOf: [\n            {\n              type: \"object\",\n              properties: {\n                type: {\n                  type: \"string\",\n                  enum: [\"CatalogItem\"],\n                },\n              },\n            },\n            {\n              $ref: \"schema://api.schema#resource_identifier\",\n            },\n          ],\n        }\n\n        ajv.addSchema(librarySchema)\n        ajv.addSchema(catalogItemSchema)\n        ajv.addSchema(catalogItemResourceIdentifierSchema)\n        ajv.addSchema(apiSchema)\n\n        const validate = ajv.compile(domainSchema)\n        testSchema(validate)\n      }\n    }\n  })\n\n  describe(\"both refs are fragments\", () => {\n    it(\"should compile and validate schema\", spec(new _Ajv()))\n    it(\"should compile and validate schema: standalone\", spec(getStandalone(_Ajv)))\n\n    function spec(ajv: AjvCore | AjvPack): () => void {\n      return () => {\n        const librarySchema = {\n          $schema: \"http://json-schema.org/draft-07/schema#\",\n          $id: \"schema://library.schema#\",\n          type: \"object\",\n          properties: {\n            name: {type: \"string\"},\n            links: {\n              type: \"object\",\n              properties: {\n                catalogItems: {\n                  type: \"array\",\n                  items: {$ref: \"schema://catalog_item.schema#resource_identifier\"},\n                },\n              },\n            },\n          },\n          definitions: {\n            resource_identifier: {\n              $id: \"#resource_identifier\",\n              allOf: [\n                {\n                  type: \"object\",\n                  properties: {\n                    type: {\n                      type: \"string\",\n                      enum: [\"Library\"],\n                    },\n                  },\n                },\n                {$ref: \"schema://api.schema#resource_identifier\"},\n              ],\n            },\n          },\n        }\n\n        const catalogItemSchema = {\n          $schema: \"http://json-schema.org/draft-07/schema#\",\n          $id: \"schema://catalog_item.schema#\",\n          type: \"object\",\n          properties: {\n            name: {type: \"string\"},\n            links: {\n              type: \"object\",\n              properties: {\n                library: {$ref: \"schema://library.schema#resource_identifier\"},\n              },\n            },\n          },\n          definitions: {\n            resource_identifier: {\n              $id: \"#resource_identifier\",\n              allOf: [\n                {\n                  type: \"object\",\n                  properties: {\n                    type: {\n                      type: \"string\",\n                      enum: [\"CatalogItem\"],\n                    },\n                  },\n                },\n                {$ref: \"schema://api.schema#resource_identifier\"},\n              ],\n            },\n          },\n        }\n\n        ajv.addSchema(librarySchema)\n        ajv.addSchema(catalogItemSchema)\n        ajv.addSchema(apiSchema)\n\n        const validate = ajv.compile(domainSchema)\n        testSchema(validate)\n      }\n    }\n  })\n\n  function testSchema(validate) {\n    validate({data: {type: \"Library\", id: \"123\"}}).should.equal(true)\n    validate({data: {type: \"Library\", id: 123}}).should.equal(false)\n    validate({data: {type: \"CatalogItem\", id: \"123\"}}).should.equal(true)\n    validate({data: {type: \"CatalogItem\", id: 123}}).should.equal(false)\n    validate({data: {type: \"Foo\", id: \"123\"}}).should.equal(false)\n  }\n})\n"
  },
  {
    "path": "spec/issues/259_validate_meta_against_itself.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #259, support validating [meta-]schemas against themselves\", () => {\n  it('should add schema before validation if \"id\" is the same as \"$schema\"', () => {\n    const ajv = new _Ajv({strict: false})\n    const hyperSchema = require(\"../remotes/hyper-schema.json\")\n    ajv.addMetaSchema(hyperSchema)\n  })\n})\n"
  },
  {
    "path": "spec/issues/273_error_schemaPath_refd_schema.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe.skip(\"issue #273, schemaPath in error in referenced schema\", () => {\n  it(\"should have canonic reference with hash after file name\", () => {\n    test(new _Ajv())\n    test(new _Ajv({inlineRefs: false}))\n\n    function test(ajv) {\n      const schema = {\n        properties: {\n          a: {$ref: \"int\"},\n        },\n      }\n\n      const referencedSchema = {\n        id: \"int\",\n        type: \"integer\",\n      }\n\n      ajv.addSchema(referencedSchema)\n      const validate = ajv.compile(schema)\n\n      validate({a: \"foo\"}).should.equal(false)\n      validate.errors[0].schemaPath.should.equal(\"int#/type\")\n    }\n  })\n})\n"
  },
  {
    "path": "spec/issues/342_uniqueItems_non-json_objects.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #342, support uniqueItems with some non-JSON objects\", () => {\n  let validate\n\n  before(() => {\n    const ajv = new _Ajv()\n    validate = ajv.compile({type: \"array\", uniqueItems: true})\n  })\n\n  it(\"should allow different RegExps\", () => {\n    validate([/foo/, /bar/]).should.equal(true)\n    validate([/foo/gi, /foo/gi]).should.equal(false)\n    validate([/foo/, {}]).should.equal(true)\n  })\n\n  it(\"should allow different Dates\", () => {\n    validate([new Date(\"2016-11-11\"), new Date(\"2016-11-12\")]).should.equal(true)\n    validate([new Date(\"2016-11-11\"), new Date(\"2016-11-11\")]).should.equal(false)\n    validate([new Date(\"2016-11-11\"), {}]).should.equal(true)\n  })\n\n  it(\"should allow undefined properties\", () => {\n    validate([{}, {foo: undefined}]).should.equal(true)\n    validate([{foo: undefined}, {}]).should.equal(true)\n    validate([{foo: undefined}, {bar: undefined}]).should.equal(true)\n    validate([{foo: undefined}, {foo: undefined}]).should.equal(false)\n  })\n})\n"
  },
  {
    "path": "spec/issues/485_type_validation_priority.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #485, order of type validation\", () => {\n  it(\"should validate types before keywords\", () => {\n    const ajv = new _Ajv({allErrors: true, strictTypes: false})\n    const validate: any = ajv.compile({\n      type: [\"integer\", \"string\"],\n      required: [\"foo\"],\n      minimum: 2,\n    })\n\n    validate(2).should.equal(true)\n    validate(\"foo\").should.equal(true)\n\n    validate(1.5).should.equal(false)\n    checkErrors([\"type\", \"minimum\"])\n\n    validate({}).should.equal(false)\n    checkErrors([\"type\", \"required\"])\n\n    function checkErrors(expectedErrs) {\n      validate.errors.should.have.length(expectedErrs.length)\n      expectedErrs.forEach((keyword, i) => validate.errors[i].keyword.should.equal(keyword))\n    }\n  })\n})\n"
  },
  {
    "path": "spec/issues/50_refs_with_definitions.spec.ts",
    "content": "import type AjvCore from \"../../dist/core\"\nimport type AjvPack from \"../../dist/standalone/instance\"\nimport {getStandalone} from \"../ajv_standalone\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe('issue #50: references with \"definitions\"', () => {\n  const schema1 = {\n    $id: \"http://example.com/test/person.json#\",\n    definitions: {\n      name: {type: \"string\"},\n    },\n    type: \"object\",\n    properties: {\n      name: {$ref: \"#/definitions/name\"},\n    },\n  }\n\n  const schema2 = {\n    $id: \"http://example.com/test/employee.json#\",\n    type: \"object\",\n    properties: {\n      person: {$ref: \"/test/person.json#\"},\n      role: {type: \"string\"},\n    },\n  }\n\n  it(\"should be supported by addSchema\", () => {\n    const ajv = new _Ajv()\n    ajv.addSchema(schema1)\n    ajv.addSchema(schema2)\n    spec(ajv)\n  })\n\n  it(\"should be supported by compile\", () => {\n    const ajv = new _Ajv()\n    ajv.compile(schema1)\n    ajv.compile(schema2)\n    spec(ajv)\n  })\n\n  it(\"should be supported by addSchema: standalone\", () => {\n    const ajv = getStandalone(_Ajv)\n    ajv.addSchema(schema1)\n    ajv.addSchema(schema2)\n    spec(ajv)\n  })\n\n  it(\"should be supported by compile: standalone\", () => {\n    const ajv = getStandalone(_Ajv)\n    ajv.compile(schema1)\n    ajv.compile(schema2)\n    spec(ajv)\n  })\n\n  function spec(ajv: AjvCore | AjvPack): void {\n    const result = ajv.validate(\"http://example.com/test/employee.json#\", {\n      person: {\n        name: \"Alice\",\n      },\n      role: \"Programmer\",\n    })\n\n    result.should.equal(true)\n    should.equal(ajv.errors, null)\n  }\n})\n"
  },
  {
    "path": "spec/issues/521_wrong_warning_id_property.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe('issue #521, incorrect warning with \"id\" property', () => {\n  it(\"should not log warning\", () => {\n    const ajv = new _Ajv()\n    const consoleWarn = console.warn\n    console.warn = () => {\n      throw new Error(\"should not log warning\")\n    }\n\n    try {\n      ajv.compile({\n        $id: \"http://example.com/schema.json\",\n        type: \"object\",\n        properties: {\n          id: {type: \"string\"},\n        },\n        required: [\"id\"],\n      })\n    } finally {\n      console.warn = consoleWarn\n    }\n  })\n})\n"
  },
  {
    "path": "spec/issues/743_removeAdditional_to_remove_proto.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #743, property __proto__ should be removed with removeAdditional option\", () => {\n  it(\"should remove additional properties\", () => {\n    const ajv = new _Ajv({removeAdditional: true})\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        obj: {\n          type: \"object\",\n          additionalProperties: false,\n          properties: {\n            a: {type: \"string\"},\n            b: {type: \"string\"},\n            c: {type: \"string\"},\n            d: {type: \"string\"},\n            e: {type: \"string\"},\n            f: {type: \"string\"},\n            g: {type: \"string\"},\n            h: {type: \"string\"},\n            i: {type: \"string\"},\n          },\n        },\n      },\n    }\n\n    const obj = Object.create(null)\n    obj.__proto__ = null // should be removed\n    obj.additional = \"will be removed\"\n    obj.a = \"valid\"\n    obj.b = \"valid\"\n\n    const data = {obj: obj}\n\n    ajv.validate(schema, data).should.equal(true)\n    Object.keys(data.obj).should.eql([\"a\", \"b\"])\n  })\n})\n"
  },
  {
    "path": "spec/issues/768_passContext_recursive_ref.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #768, fix passContext in recursive $ref\", () => {\n  let ajv, contexts: any[]\n\n  beforeEach(() => {\n    contexts = []\n  })\n\n  describe(\"passContext = true\", () => {\n    it(\"should pass this value as context to user-defined keyword validation function\", () => {\n      const validate = getValidate(true)\n      const self = {}\n      validate.call(self, {bar: \"a\", baz: {bar: \"b\"}})\n      contexts.should.have.length(2)\n      contexts.forEach((ctx) => ctx.should.equal(self))\n    })\n  })\n\n  describe(\"passContext = false\", () => {\n    it(\"should pass ajv instance as context to user-defined keyword validation function\", () => {\n      const validate = getValidate(false)\n      validate({bar: \"a\", baz: {bar: \"b\"}})\n      contexts.should.have.length(2)\n      contexts.forEach((ctx) => ctx.should.equal(ajv))\n    })\n  })\n\n  describe(\"ref is fragment and passContext = true\", () => {\n    it(\"should pass this value as context to user-defined keyword validation function\", () => {\n      const validate = getValidateFragments(true)\n      const self = {}\n      validate.call(self, {baz: {corge: \"a\", quux: {baz: {corge: \"b\"}}}})\n      contexts.should.have.length(2)\n      contexts.forEach((ctx) => ctx.should.equal(self))\n    })\n  })\n\n  describe(\"ref is fragment and passContext = false\", () => {\n    it(\"should pass ajv instance as context to user-defined keyword validation function\", () => {\n      const validate = getValidateFragments(false)\n      validate({baz: {corge: \"a\", quux: {baz: {corge: \"b\"}}}})\n      contexts.should.have.length(2)\n      contexts.forEach((ctx) => ctx.should.equal(ajv))\n    })\n  })\n\n  function getValidate(passContext) {\n    ajv = new _Ajv({passContext})\n    ajv.addKeyword({keyword: \"testValidate\", validate: storeContext})\n\n    const schema = {\n      $id: \"foo\",\n      type: \"object\",\n      required: [\"bar\"],\n      properties: {\n        bar: {testValidate: true},\n        baz: {\n          $ref: \"foo\",\n        },\n      },\n    }\n\n    return ajv.compile(schema)\n  }\n\n  function getValidateFragments(passContext) {\n    ajv = new _Ajv({passContext})\n    ajv.addKeyword({keyword: \"testValidate\", validate: storeContext})\n\n    ajv.addSchema({\n      $id: \"foo\",\n      definitions: {\n        bar: {\n          type: \"object\",\n          properties: {\n            baz: {\n              $ref: \"boo\",\n            },\n          },\n        },\n      },\n    })\n\n    ajv.addSchema({\n      $id: \"boo\",\n      type: \"object\",\n      required: [\"corge\"],\n      properties: {\n        quux: {$ref: \"foo#/definitions/bar\"},\n        corge: {testValidate: true},\n      },\n    })\n\n    return ajv.compile({$ref: \"foo#/definitions/bar\"})\n  }\n\n  function storeContext(this: any) {\n    contexts.push(this)\n    return true\n  }\n})\n"
  },
  {
    "path": "spec/issues/815_id_updates_ref_base.spec.ts",
    "content": "import type {ValidateFunction} from \"../..\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #815, id and $id fields should reset base\", () => {\n  let validate: ValidateFunction\n\n  const schema = {\n    type: \"object\",\n    properties: {\n      newRoot: {\n        $id: \"http://example.com/newRoot\",\n        type: \"object\",\n        properties: {\n          recurse: {\n            $ref: \"#\",\n          },\n          name: {\n            type: \"string\",\n          },\n        },\n        required: [\"name\"],\n        additionalProperties: false,\n      },\n    },\n    required: [\"newRoot\"],\n    additionalProperties: false,\n  }\n\n  before(() => {\n    validate = new _Ajv().compile(schema)\n  })\n\n  it(\"should set # to reference the closest ancestor with $id\", () => {\n    validate({\n      newRoot: {\n        name: \"test\",\n      },\n    }).should.equal(true)\n\n    validate({\n      newRoot: {\n        name: \"test\",\n        recurse: {\n          name: \"test2\",\n        },\n      },\n    }).should.equal(true)\n  })\n\n  it(\"should NOT set # to reference the absolute document root\", () => {\n    validate({\n      newRoot: {\n        name: \"test\",\n        recurse: {\n          newRoot: {\n            name: \"test2\",\n          },\n        },\n      },\n    }).should.equal(false)\n  })\n})\n"
  },
  {
    "path": "spec/issues/8_shared_refs.spec.ts",
    "content": "import type AjvCore from \"../../dist/core\"\nimport type AjvPack from \"../../dist/standalone/instance\"\nimport _Ajv from \"../ajv\"\nimport {getStandalone} from \"../ajv_standalone\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #8: schema with shared references\", () => {\n  const propertySchema = {\n    type: \"string\",\n    maxLength: 4,\n  }\n\n  const schema = {\n    $id: \"obj.json#\",\n    type: \"object\",\n    properties: {\n      foo: propertySchema,\n      bar: propertySchema,\n    },\n  }\n\n  it(\"should be supported by addSchema\", () => {\n    spec(new _Ajv().addSchema(schema))\n  })\n\n  it(\"should be supported by compile\", () => {\n    const ajv = new _Ajv()\n    ajv.compile(schema)\n    spec(ajv)\n  })\n\n  it(\"should be supported by addSchema: standalone\", () => {\n    spec(getStandalone(_Ajv).addSchema(schema))\n  })\n\n  it(\"should be supported by compile: standalone\", () => {\n    const ajv = getStandalone(_Ajv)\n    ajv.compile(schema)\n    spec(ajv)\n  })\n\n  function spec(ajv: AjvCore | AjvPack): void {\n    let result = ajv.validate(\"obj.json#\", {foo: \"abc\", bar: \"def\"})\n    result.should.equal(true)\n\n    result = ajv.validate(\"obj.json#\", {foo: \"abcde\", bar: \"fghg\"})\n    result.should.equal(false)\n    ajv.errors?.should.have.length(1)\n  }\n})\n"
  },
  {
    "path": "spec/issues/955_removeAdditional_custom_keywords.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"issue #955: option removeAdditional breaks user-defined keywords\", () => {\n  it(\"should support user-defined keywords with option removeAdditional\", () => {\n    const ajv = new _Ajv({removeAdditional: \"all\"})\n\n    ajv.addKeyword({\n      keyword: \"minTrimmedLength\",\n      type: \"string\",\n      compile: function (schema: number) {\n        return function (str: string): boolean {\n          return str.trim().length >= schema\n        }\n      },\n      metaSchema: {type: \"integer\"},\n    })\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        foo: {\n          type: \"string\",\n          minTrimmedLength: 3,\n        },\n      },\n      required: [\"foo\"],\n    }\n\n    const validate = ajv.compile(schema)\n\n    let data = {\n      foo: \"   bar   \",\n      baz: \"\",\n    }\n    validate(data).should.equal(true)\n    data.should.not.have.property(\"baz\")\n\n    data = {\n      foo: \"   ba   \",\n      baz: \"\",\n    }\n    validate(data).should.equal(false)\n    data.should.not.have.property(\"baz\")\n  })\n})\n"
  },
  {
    "path": "spec/issues/cve_2025_69873_redos_attack.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport re2 from \"../../dist/runtime/re2\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"CVE-2025-69873: ReDoS Attack Scenario\", () => {\n  it(\"should prevent ReDoS with RE2 engine for $data pattern injection\", () => {\n    const ajv = new _Ajv({$data: true, code: {regExp: re2}})\n\n    // Schema that accepts pattern from data\n    const schema = {\n      type: \"object\",\n      properties: {\n        pattern: {type: \"string\"},\n        value: {type: \"string\", pattern: {$data: \"1/pattern\"}},\n      },\n    }\n\n    const validate = ajv.compile(schema)\n\n    // CVE-2025-69873 Attack Payload:\n    // Pattern: ^(a|a)*$ - catastrophic backtracking regex\n    // Value: 30 a's + X - forces full exploration of exponential paths\n    const maliciousPayload = {\n      pattern: \"^(a|a)*$\",\n      value: \"a\".repeat(30) + \"X\",\n    }\n\n    const start = Date.now()\n    const result = validate(maliciousPayload)\n    const elapsed = Date.now() - start\n\n    // Should fail validation (pattern doesn't match)\n    result.should.equal(false)\n\n    // Should complete quickly with RE2 (< 500ms)\n    // Without RE2, this would hang for 44+ seconds\n    elapsed.should.be.below(500)\n  })\n\n  it(\"should handle pattern injection gracefully with default engine\", () => {\n    const ajv = new _Ajv({$data: true})\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        pattern: {type: \"string\"},\n        value: {type: \"string\", pattern: {$data: \"1/pattern\"}},\n      },\n    }\n\n    const validate = ajv.compile(schema)\n\n    // Attack payload\n    const maliciousPayload = {\n      pattern: \"^(a|a)*$\",\n      value: \"a\".repeat(20) + \"X\", // Reduced size to avoid hanging\n    }\n\n    // Should complete without crashing (might be slow but won't hang forever)\n    // With try/catch, invalid pattern results in validation failure\n    const result = validate(maliciousPayload)\n    result.should.be.a(\"boolean\")\n  })\n\n  it(\"should handle multiple ReDoS patterns gracefully\", () => {\n    const ajv = new _Ajv({$data: true, code: {regExp: re2}})\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        pattern: {type: \"string\"},\n        value: {type: \"string\", pattern: {$data: \"1/pattern\"}},\n      },\n    }\n\n    const validate = ajv.compile(schema)\n\n    // Various ReDoS-vulnerable patterns\n    const redosPatterns = [\"^(a+)+$\", \"^(a|a)*$\", \"^(a|ab)*$\", \"(x+x+)+y\", \"(a*)*b\"]\n\n    for (const pattern of redosPatterns) {\n      const start = Date.now()\n      const result = validate({\n        pattern,\n        value: \"a\".repeat(25) + \"X\",\n      })\n      const elapsed = Date.now() - start\n\n      // All should complete quickly with RE2\n      elapsed.should.be.below(500, `Pattern ${pattern} took too long: ${elapsed}ms`)\n      result.should.equal(false)\n    }\n  })\n\n  it(\"should still validate valid patterns correctly\", () => {\n    const ajv = new _Ajv({$data: true, code: {regExp: re2}})\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        pattern: {type: \"string\"},\n        value: {type: \"string\", pattern: {$data: \"1/pattern\"}},\n      },\n    }\n\n    const validate = ajv.compile(schema)\n\n    // Valid pattern matching tests\n    validate({pattern: \"^[a-z]+$\", value: \"abc\"}).should.equal(true)\n    validate({pattern: \"^[a-z]+$\", value: \"ABC\"}).should.equal(false)\n    validate({pattern: \"^\\\\d{3}-\\\\d{4}$\", value: \"123-4567\"}).should.equal(true)\n    validate({pattern: \"^\\\\d{3}-\\\\d{4}$\", value: \"12-345\"}).should.equal(false)\n  })\n\n  it(\"should fail gracefully on invalid regex syntax in pattern\", () => {\n    const ajv = new _Ajv({$data: true, code: {regExp: re2}})\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        pattern: {type: \"string\"},\n        value: {type: \"string\", pattern: {$data: \"1/pattern\"}},\n      },\n    }\n\n    const validate = ajv.compile(schema)\n\n    // Invalid regex patterns that RE2 rejects\n    const invalidPatterns = [\n      \"[invalid\", // Unclosed bracket\n      \"(?P<name>...)\", // Perl-style named groups not supported\n    ]\n\n    for (const pattern of invalidPatterns) {\n      // RE2 rejects these patterns, resulting in validation failure\n      const result = validate({\n        pattern,\n        value: \"test\",\n      })\n      // Invalid patterns should fail validation\n      if (!result) {\n        result.should.equal(false)\n      }\n    }\n  })\n\n  it(\"should process attack payload with safe timing benchmark\", () => {\n    const ajv = new _Ajv({$data: true, code: {regExp: re2}})\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        pattern: {type: \"string\"},\n        value: {type: \"string\", pattern: {$data: \"1/pattern\"}},\n      },\n    }\n\n    const validate = ajv.compile(schema)\n\n    // Process the exact CVE attack payload\n    const payload = {\n      pattern: \"^(a|a)*$\",\n      value: \"a\".repeat(30) + \"X\",\n    }\n\n    // With RE2: should complete in < 100ms\n    // Without RE2: would hang for 44+ seconds\n    const start = Date.now()\n    const result = validate(payload)\n    const elapsed = Date.now() - start\n\n    result.should.equal(false)\n    elapsed.should.be.below(500)\n  })\n})\n"
  },
  {
    "path": "spec/issues/re2.ts",
    "content": "export default [\n  {name: \"$data/format\", test: require(\"../extras/$data/format.json\")},\n  {name: \"$data/pattern\", test: require(\"../extras/$data/pattern.json\")},\n]\n"
  },
  {
    "path": "spec/javacript.spec.js",
    "content": "const Ajv = require(\"./ajv\")\nconst Ajv2019 = require(\"./ajv2019\")\nconst assert = require(\"assert\")\n\ndescribe(\"using Ajv with javascript\", () => {\n  describe(\"draft-07\", () => it(\"should validate\", () => test(Ajv)))\n  describe(\"draft-2019-09\", () => it(\"should validate\", () => test(Ajv2019)))\n\n  function test(_Ajv) {\n    const ajv = new _Ajv()\n    const validate = ajv.compile({type: \"number\"})\n    assert.strictEqual(validate(1), true)\n    assert.strictEqual(validate(\"1\"), false)\n  }\n})\n"
  },
  {
    "path": "spec/json-schema.spec.ts",
    "content": "import type Ajv from \"../dist/core\"\nimport _Ajv from \"./ajv\"\nimport _Ajv2019 from \"./ajv2019\"\nimport _Ajv2020 from \"./ajv2020\"\nimport getAjvInstances from \"./ajv_instances\"\nimport {withStandalone} from \"./ajv_standalone\"\nimport jsonSchemaTest = require(\"json-schema-test\")\nimport options from \"./ajv_options\"\nimport {afterError, afterEach} from \"./after_test\"\nimport ajvFormats from \"ajv-formats\"\nimport draft6MetaSchema = require(\"../dist/refs/json-schema-draft-06.json\")\nimport {toHash} from \"../dist/compile/util\"\nimport chai from \"./chai\"\n\nconst remoteRefs = {\n  \"http://localhost:1234/integer.json\": require(\"./JSON-Schema-Test-Suite/remotes/integer.json\"),\n  \"http://localhost:1234/subSchemas.json\": require(\"./JSON-Schema-Test-Suite/remotes/subSchemas.json\"),\n  \"http://localhost:1234/subSchemas-defs.json\": require(\"./JSON-Schema-Test-Suite/remotes/subSchemas-defs.json\"),\n  \"http://localhost:1234/baseUriChange/folderInteger.json\": require(\"./JSON-Schema-Test-Suite/remotes/baseUriChange/folderInteger.json\"),\n  \"http://localhost:1234/baseUriChangeFolder/folderInteger.json\": require(\"./JSON-Schema-Test-Suite/remotes/baseUriChangeFolder/folderInteger.json\"),\n  \"http://localhost:1234/baseUriChangeFolderInSubschema/folderInteger.json\": require(\"./JSON-Schema-Test-Suite/remotes/baseUriChangeFolderInSubschema/folderInteger.json\"),\n  \"http://localhost:1234/name.json\": require(\"./JSON-Schema-Test-Suite/remotes/name.json\"),\n  \"http://localhost:1234/name-defs.json\": require(\"./JSON-Schema-Test-Suite/remotes/name-defs.json\"),\n}\n\nconst SKIP_FORMATS = [\"idn-email\", \"idn-hostname\", \"iri\", \"iri-reference\"]\nconst SKIP_FORMAT_TESTS = SKIP_FORMATS.map((f) => `optional/format/${f}`)\nconst SKIP_DRAFT7 = [\n  \"optional/content\",\n  \"optional/float-overflow\",\n  \"unknownKeyword\",\n  ...SKIP_FORMAT_TESTS,\n]\n\nrunTest({\n  instances: getAjvInstances(_Ajv, options, {\n    meta: false,\n    strict: false,\n    ignoreKeywordsWithRef: true,\n  }),\n  draft: 6,\n  tests: skipTestCases(require(\"./_json/draft6\"), {\n    ref: {\n      \"$ref prevents a sibling $id from changing the base uri\": [\n        \"$ref resolves to /definitions/base_foo, data does not validate\",\n        \"$ref resolves to /definitions/base_foo, data validates\",\n      ],\n    },\n  }),\n  remotes: {\n    \"http://localhost:1234/ref-and-definitions.json\": require(\"./JSON-Schema-Test-Suite/remotes/ref-and-definitions.json\"),\n  },\n  skip: [\"optional/float-overflow\", \"unknownKeyword\"],\n})\n\nrunTest({\n  instances: getAjvInstances(_Ajv, options, {\n    strict: false,\n    ignoreKeywordsWithRef: true,\n    formats: toHash(SKIP_FORMATS),\n  }),\n  draft: 7,\n  tests: skipTestCases(require(\"./_json/draft7\"), {\n    ref: {\n      \"$ref prevents a sibling $id from changing the base uri\": [\n        \"$ref resolves to /definitions/base_foo, data does not validate\",\n        \"$ref resolves to /definitions/base_foo, data validates\",\n      ],\n    },\n  }),\n  remotes: {\n    \"http://localhost:1234/ref-and-definitions.json\": require(\"./JSON-Schema-Test-Suite/remotes/ref-and-definitions.json\"),\n  },\n  skip: SKIP_DRAFT7,\n})\n\nrunTest({\n  instances: getAjvInstances(_Ajv2019, options, {\n    strict: false,\n    formats: toHash(SKIP_FORMATS),\n  }),\n  draft: 2019,\n  tests: skipTestCases(require(\"./_json/draft2019\"), {\n    recursiveRef: {\n      \"$recursiveRef with no $recursiveAnchor in the initial target schema resource\": [\n        \"leaf node matches: recursion uses the inner schema\",\n        \"leaf node does not match: recursion uses the inner schema\",\n      ],\n    },\n    ref: {\n      \"refs with relative uris and defs\": [\n        \"invalid on inner field\",\n        \"invalid on outer field\",\n        \"valid on both fields\",\n      ],\n      \"relative refs with absolute uris and defs\": [\n        \"invalid on inner field\",\n        \"invalid on outer field\",\n        \"valid on both fields\",\n      ],\n    },\n    unevaluatedProperties: {\n      \"unevaluatedProperties with if/then/else, then not defined\": [\n        \"when if is false and has unevaluated properties\",\n      ],\n    },\n  }),\n  remotes: {\n    \"http://localhost:1234/ref-and-defs.json\": require(\"./JSON-Schema-Test-Suite/remotes/ref-and-defs.json\"),\n    \"http://localhost:1234/draft2019-09/metaschema-no-validation.json\": require(\"./JSON-Schema-Test-Suite/remotes/draft2019-09/metaschema-no-validation.json\"),\n  },\n  skip: SKIP_DRAFT7,\n})\n\nrunTest({\n  instances: getAjvInstances(_Ajv2020, options, {\n    strict: false,\n    formats: toHash(SKIP_FORMATS),\n  }),\n  draft: 2020,\n  tests: skipTestCases(require(\"./_json/draft2020\"), {\n    dynamicRef: {\n      \"A $dynamicRef to a $dynamicAnchor in the same schema resource should behave like a normal $ref to an $anchor\":\n        [\"An array of strings is valid\"],\n      \"A $dynamicRef to an $anchor in the same schema resource should behave like a normal $ref to an $anchor\":\n        [\"An array of strings is valid\"],\n      \"A $dynamicRef should resolve to the first $dynamicAnchor still in scope that is encountered when the schema is evaluated\":\n        [\"An array of strings is valid\"],\n      \"A $dynamicRef with intermediate scopes that don't include a matching $dynamicAnchor should not affect dynamic scope resolution\":\n        [\"An array of strings is valid\"],\n      \"An $anchor with the same name as a $dynamicAnchor should not be used for dynamic scope resolution\":\n        [\"Any array is valid\"],\n      \"A $dynamicRef without a matching $dynamicAnchor in the same schema resource should behave like a normal $ref to $anchor\":\n        [\"Any array is valid\"],\n      \"A $dynamicRef with a non-matching $dynamicAnchor in the same schema resource should behave like a normal $ref to $anchor\":\n        [\"Any array is valid\"],\n      \"A $dynamicRef that initially resolves to a schema with a matching $dynamicAnchor should resolve to the first $dynamicAnchor in the dynamic scope\":\n        [\n          \"The recursive part is valid against the root\",\n          \"The recursive part is not valid against the root\",\n        ],\n      \"A $dynamicRef that initially resolves to a schema without a matching $dynamicAnchor should behave like a normal $ref to $anchor\":\n        [\"The recursive part doesn't need to validate against the root\"],\n      \"after leaving a dynamic scope, it should not be used by a $dynamicRef\": [\n        \"string matches /$defs/thingy, but the $dynamicRef does not stop here\",\n        \"first_scope is not in dynamic scope for the $dynamicRef\",\n        \"/then/$defs/thingy is the final stop for the $dynamicRef\",\n      ],\n      \"strict-tree schema, guards against misspelled properties\": [\n        \"instance with misspelled field\",\n        \"instance with correct field\",\n      ],\n      \"tests for implementation dynamic anchor and reference link\": [\n        \"incorrect parent schema\",\n        \"incorrect extended schema\",\n        \"correct extended schema\",\n      ],\n      // duplicate\n      \"Tests for implementation dynamic anchor and reference link. Reference should be independent of any possible ordering.\":\n        [\"incorrect parent schema\", \"incorrect extended schema\", \"correct extended schema\"],\n    },\n    ref: {\n      \"refs with relative uris and defs\": [\n        \"invalid on inner field\",\n        \"invalid on outer field\",\n        \"valid on both fields\",\n      ],\n      \"relative refs with absolute uris and defs\": [\n        \"invalid on inner field\",\n        \"invalid on outer field\",\n        \"valid on both fields\",\n      ],\n    },\n    unevaluatedItems: {\n      \"unevaluatedItems depends on adjacent contains\": [\n        \"contains passes, second item is not evaluated\",\n      ],\n      \"unevaluatedItems depends on multiple nested contains\": [\n        \"7 not evaluated, fails unevaluatedItems\",\n      ],\n      \"unevaluatedItems and contains interact to control item dependency relationship\": [\n        \"only b's are invalid\",\n        \"only c's are invalid\",\n        \"only b's and c's are invalid\",\n        \"only a's and c's are invalid\",\n      ],\n    },\n    unevaluatedProperties: {\n      \"unevaluatedProperties with if/then/else, then not defined\": [\n        \"when if is false and has unevaluated properties\",\n      ],\n    },\n  }),\n  remotes: {\n    \"http://localhost:1234/ref-and-defs.json\": require(\"./JSON-Schema-Test-Suite/remotes/ref-and-defs.json\"),\n    \"http://localhost:1234/draft2020-12/format-assertion-false.json\": require(\"./JSON-Schema-Test-Suite/remotes/draft2020-12/format-assertion-false.json\"),\n    \"http://localhost:1234/draft2020-12/format-assertion-true.json\": require(\"./JSON-Schema-Test-Suite/remotes/draft2020-12/format-assertion-true.json\"),\n    \"http://localhost:1234/draft2020-12/metaschema-no-validation.json\": require(\"./JSON-Schema-Test-Suite/remotes/draft2020-12/metaschema-no-validation.json\"),\n  },\n  skip: [...SKIP_DRAFT7, \"optional/format-assertion\"],\n})\n\ninterface TestSuite {\n  name: string\n  test: any[]\n}\n\ninterface SchemaTest {\n  instances: Ajv[]\n  draft: number\n  tests: TestSuite[]\n  skip?: string[]\n  remotes?: Record<string, any>\n}\n\nfunction runTest({instances, draft, tests, skip = [], remotes = {}}: SchemaTest) {\n  for (const ajv of instances) {\n    ajv.opts.code.source = true\n    if (draft === 6) {\n      ajv.addMetaSchema(draft6MetaSchema)\n      ajv.opts.defaultMeta = \"http://json-schema.org/draft-06/schema#\"\n    }\n    for (const id in remoteRefs) ajv.addSchema(remoteRefs[id], id)\n    for (const id in remotes) ajv.addSchema(remotes[id], id)\n    ajvFormats(ajv)\n  }\n\n  jsonSchemaTest(withStandalone(instances), {\n    description: `JSON-Schema Test Suite draft-${draft}: ${instances.length} ajv instances with different options`,\n    suites: {tests},\n    only: [],\n    skip,\n    assert: chai.assert,\n    afterError,\n    afterEach,\n    cwd: __dirname,\n    hideFolder: `draft${draft}/`,\n    timeout: 30000,\n  })\n}\n\ninterface SkippedTestCases {\n  [suite: string]: {\n    [test: string]: string[] | true\n  }\n}\n\nfunction skipTestCases(suites: TestSuite[], skipCases: SkippedTestCases): TestSuite[] {\n  for (const suiteName in skipCases) {\n    const suite = suites.find(({name}) => name === suiteName)\n    if (!suite) throw new Error(`test suite ${suiteName} not found`)\n    for (const testName in skipCases[suiteName]) {\n      const test = suite.test.find(({description}) => description === testName)\n      if (!test) {\n        throw new Error(`test ${testName} not found in suite ${suiteName}`)\n      }\n      const skippedCases = skipCases[suiteName][testName]\n      suite.test.forEach((t) => {\n        if (t.description === testName) {\n          if (skippedCases === true) {\n            t.skip = true\n          } else {\n            t.tests.forEach((testCase: any) => {\n              if (skippedCases.includes(testCase.description)) {\n                testCase.skip = true\n              }\n            })\n          }\n        }\n      })\n    }\n  }\n  return suites\n}\n"
  },
  {
    "path": "spec/json_parse_tests.json",
    "content": "[\n  {\n    \"suite\": \"number\",\n    \"tests\": [\n      {\n        \"name\": \"number \",\n        \"valid\": true,\n        \"json\": \"[123e65]\",\n        \"data\": [1.23e67]\n      },\n      {\n        \"name\": \"number ++\",\n        \"valid\": false,\n        \"json\": \"[++1234]\"\n      },\n      {\n        \"name\": \"number +1\",\n        \"valid\": false,\n        \"json\": \"[+1]\"\n      },\n      {\n        \"name\": \"number +Inf\",\n        \"valid\": false,\n        \"json\": \"[+Inf]\"\n      },\n      {\n        \"name\": \"number -01\",\n        \"valid\": false,\n        \"json\": \"[-01]\"\n      },\n      {\n        \"name\": \"number -1.0.\",\n        \"valid\": false,\n        \"json\": \"[-1.0.]\"\n      },\n      {\n        \"name\": \"number -2.\",\n        \"valid\": false,\n        \"json\": \"[-2.]\"\n      },\n      {\n        \"name\": \"number -NaN\",\n        \"valid\": false,\n        \"json\": \"[-NaN]\"\n      },\n      {\n        \"name\": \"number .-1\",\n        \"valid\": false,\n        \"json\": \"[.-1]\"\n      },\n      {\n        \"name\": \"number .2e-3\",\n        \"valid\": false,\n        \"json\": \"[.2e-3]\"\n      },\n      {\n        \"name\": \"number 0 capital E\",\n        \"valid\": false,\n        \"json\": \"[0E]\"\n      },\n      {\n        \"name\": \"number 0 capital E+\",\n        \"valid\": false,\n        \"json\": \"[0E+]\"\n      },\n      {\n        \"name\": \"number 0.1.2\",\n        \"valid\": false,\n        \"json\": \"[0.1.2]\"\n      },\n      {\n        \"name\": \"number 0.3e\",\n        \"valid\": false,\n        \"json\": \"[0.3e]\"\n      },\n      {\n        \"name\": \"number 0.3e+\",\n        \"valid\": false,\n        \"json\": \"[0.3e+]\"\n      },\n      {\n        \"name\": \"number 0.e1\",\n        \"valid\": false,\n        \"json\": \"[0.e1]\"\n      },\n      {\n        \"name\": \"number 0e\",\n        \"valid\": false,\n        \"json\": \"[0e]\"\n      },\n      {\n        \"name\": \"number 0e+\",\n        \"valid\": false,\n        \"json\": \"[0e+]\"\n      },\n      {\n        \"name\": \"number 0e+1\",\n        \"valid\": true,\n        \"json\": \"[0e+1]\",\n        \"data\": [0]\n      },\n      {\n        \"name\": \"number 0e1\",\n        \"valid\": true,\n        \"json\": \"[0e1]\",\n        \"data\": [0]\n      },\n      {\n        \"name\": \"number 1 000\",\n        \"valid\": false,\n        \"json\": \"[1 000.0]\"\n      },\n      {\n        \"name\": \"number 1.0e\",\n        \"valid\": false,\n        \"json\": \"[1.0e]\"\n      },\n      {\n        \"name\": \"number 1.0e+\",\n        \"valid\": false,\n        \"json\": \"[1.0e+]\"\n      },\n      {\n        \"name\": \"number 1.0e-\",\n        \"valid\": false,\n        \"json\": \"[1.0e-]\"\n      },\n      {\n        \"name\": \"number 1eE2\",\n        \"valid\": false,\n        \"json\": \"[1eE2]\"\n      },\n      {\n        \"name\": \"number 2.e+3\",\n        \"valid\": false,\n        \"json\": \"[2.e+3]\"\n      },\n      {\n        \"name\": \"number 2.e-3\",\n        \"valid\": false,\n        \"json\": \"[2.e-3]\"\n      },\n      {\n        \"name\": \"number 2.e3\",\n        \"valid\": false,\n        \"json\": \"[2.e3]\"\n      },\n      {\n        \"name\": \"number 9.e+\",\n        \"valid\": false,\n        \"json\": \"[9.e+]\"\n      },\n      {\n        \"name\": \"number Inf\",\n        \"valid\": false,\n        \"json\": \"[Inf]\"\n      },\n      {\n        \"name\": \"number NaN\",\n        \"valid\": false,\n        \"json\": \"[NaN]\"\n      },\n      {\n        \"name\": \"number U+FF11 fullwidth digit one\",\n        \"valid\": false,\n        \"json\": \"[１]\"\n      },\n      {\n        \"name\": \"number after space\",\n        \"valid\": true,\n        \"json\": \"[ 4]\",\n        \"data\": [4]\n      },\n      {\n        \"name\": \"number double close to zero\",\n        \"valid\": true,\n        \"json\": \"[-0.000000000000000000000000000000000000000000000000000000000000000000000000000001]\\n\",\n        \"data\": [-1e-78]\n      },\n      {\n        \"name\": \"number double huge neg exp\",\n        \"valid\": null,\n        \"json\": \"[123.456e-789]\"\n      },\n      {\n        \"name\": \"number expression\",\n        \"valid\": false,\n        \"json\": \"[1+2]\"\n      },\n      {\n        \"name\": \"number hex 1 digit\",\n        \"valid\": false,\n        \"json\": \"[0x1]\"\n      },\n      {\n        \"name\": \"number hex 2 digits\",\n        \"valid\": false,\n        \"json\": \"[0x42]\"\n      },\n      {\n        \"name\": \"number huge exp\",\n        \"valid\": null,\n        \"json\": \"[0.4e00669999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999969999999006]\"\n      },\n      {\n        \"name\": \"number infinity\",\n        \"valid\": false,\n        \"json\": \"[Infinity]\"\n      },\n      {\n        \"name\": \"number int with exp\",\n        \"valid\": true,\n        \"json\": \"[20e1]\",\n        \"data\": [200]\n      },\n      {\n        \"name\": \"number invalid+-\",\n        \"valid\": false,\n        \"json\": \"[0e+-1]\"\n      },\n      {\n        \"name\": \"number invalid-negative-real\",\n        \"valid\": false,\n        \"json\": \"[-123.123foo]\"\n      },\n      {\n        \"name\": \"number invalid-utf-8-in-bigger-int\",\n        \"valid\": false,\n        \"json\": \"[123�]\"\n      },\n      {\n        \"name\": \"number invalid-utf-8-in-exponent\",\n        \"valid\": false,\n        \"json\": \"[1e1�]\"\n      },\n      {\n        \"name\": \"number invalid-utf-8-in-int\",\n        \"valid\": false,\n        \"json\": \"[0�]\\n\"\n      },\n      {\n        \"name\": \"number minus infinity\",\n        \"valid\": false,\n        \"json\": \"[-Infinity]\"\n      },\n      {\n        \"name\": \"number minus sign with trailing garbage\",\n        \"valid\": false,\n        \"json\": \"[-foo]\"\n      },\n      {\n        \"name\": \"number minus space 1\",\n        \"valid\": false,\n        \"json\": \"[- 1]\"\n      },\n      {\n        \"name\": \"number minus zero\",\n        \"valid\": true,\n        \"json\": \"[-0]\",\n        \"data\": [-0]\n      },\n      {\n        \"name\": \"number neg int huge exp\",\n        \"valid\": null,\n        \"json\": \"[-1e+9999]\"\n      },\n      {\n        \"name\": \"number neg int starting with zero\",\n        \"valid\": false,\n        \"json\": \"[-012]\"\n      },\n      {\n        \"name\": \"number neg real without int part\",\n        \"valid\": false,\n        \"json\": \"[-.123]\"\n      },\n      {\n        \"name\": \"number neg with garbage at end\",\n        \"valid\": false,\n        \"json\": \"[-1x]\"\n      },\n      {\n        \"name\": \"number negative int\",\n        \"valid\": true,\n        \"json\": \"[-123]\",\n        \"data\": [-123]\n      },\n      {\n        \"name\": \"number negative one\",\n        \"valid\": true,\n        \"json\": \"[-1]\",\n        \"data\": [-1]\n      },\n      {\n        \"name\": \"number negative zero\",\n        \"valid\": true,\n        \"json\": \"[-0]\",\n        \"data\": [-0]\n      },\n      {\n        \"name\": \"number pos double huge exp\",\n        \"valid\": null,\n        \"json\": \"[1.5e+9999]\"\n      },\n      {\n        \"name\": \"number real capital e\",\n        \"valid\": true,\n        \"json\": \"[1E22]\",\n        \"data\": [1e22]\n      },\n      {\n        \"name\": \"number real capital e neg exp\",\n        \"valid\": true,\n        \"json\": \"[1E-2]\",\n        \"data\": [0.01]\n      },\n      {\n        \"name\": \"number real capital e pos exp\",\n        \"valid\": true,\n        \"json\": \"[1E+2]\",\n        \"data\": [100]\n      },\n      {\n        \"name\": \"number real exponent\",\n        \"valid\": true,\n        \"json\": \"[123e45]\",\n        \"data\": [1.23e47]\n      },\n      {\n        \"name\": \"number real fraction exponent\",\n        \"valid\": true,\n        \"json\": \"[123.456e78]\",\n        \"data\": [1.23456e80]\n      },\n      {\n        \"name\": \"number real garbage after e\",\n        \"valid\": false,\n        \"json\": \"[1ea]\"\n      },\n      {\n        \"name\": \"number real neg exp\",\n        \"valid\": true,\n        \"json\": \"[1e-2]\",\n        \"data\": [0.01]\n      },\n      {\n        \"name\": \"number real neg overflow\",\n        \"valid\": null,\n        \"json\": \"[-123123e100000]\"\n      },\n      {\n        \"name\": \"number real pos exponent\",\n        \"valid\": true,\n        \"json\": \"[1e+2]\",\n        \"data\": [100]\n      },\n      {\n        \"name\": \"number real pos overflow\",\n        \"valid\": null,\n        \"json\": \"[123123e100000]\"\n      },\n      {\n        \"name\": \"number real underflow\",\n        \"valid\": null,\n        \"json\": \"[123e-10000000]\"\n      },\n      {\n        \"name\": \"number real with invalid utf8 after e\",\n        \"valid\": false,\n        \"json\": \"[1e�]\"\n      },\n      {\n        \"name\": \"number real without fractional part\",\n        \"valid\": false,\n        \"json\": \"[1.]\"\n      },\n      {\n        \"name\": \"number simple int\",\n        \"valid\": true,\n        \"json\": \"[123]\",\n        \"data\": [123]\n      },\n      {\n        \"name\": \"number simple real\",\n        \"valid\": true,\n        \"json\": \"[123.456789]\",\n        \"data\": [123.456789]\n      },\n      {\n        \"name\": \"number starting with dot\",\n        \"valid\": false,\n        \"json\": \"[.123]\"\n      },\n      {\n        \"name\": \"number too big neg int\",\n        \"valid\": null,\n        \"json\": \"[-123123123123123123123123123123]\"\n      },\n      {\n        \"name\": \"number too big pos int\",\n        \"valid\": null,\n        \"json\": \"[100000000000000000000]\"\n      },\n      {\n        \"name\": \"number very big negative int\",\n        \"valid\": null,\n        \"json\": \"[-237462374673276894279832749832423479823246327846]\"\n      },\n      {\n        \"name\": \"number with alpha\",\n        \"valid\": false,\n        \"json\": \"[1.2a-3]\"\n      },\n      {\n        \"name\": \"number with alpha char\",\n        \"valid\": false,\n        \"json\": \"[1.8011670033376514H-308]\"\n      },\n      {\n        \"name\": \"number with leading zero\",\n        \"valid\": false,\n        \"json\": \"[012]\"\n      }\n    ]\n  },\n  {\n    \"suite\": \"object\",\n    \"tests\": [\n      {\n        \"name\": \"object \",\n        \"valid\": true,\n        \"json\": \"{\\\"asd\\\":\\\"sdf\\\", \\\"dfg\\\":\\\"fgh\\\"}\",\n        \"data\": {\n          \"asd\": \"sdf\",\n          \"dfg\": \"fgh\"\n        }\n      },\n      {\n        \"name\": \"object bad value\",\n        \"valid\": false,\n        \"json\": \"[\\\"x\\\", truth]\"\n      },\n      {\n        \"name\": \"object basic\",\n        \"valid\": true,\n        \"json\": \"{\\\"asd\\\":\\\"sdf\\\"}\",\n        \"data\": {\n          \"asd\": \"sdf\"\n        }\n      },\n      {\n        \"name\": \"object bracket key\",\n        \"valid\": false,\n        \"json\": \"{[: \\\"x\\\"}\\n\"\n      },\n      {\n        \"name\": \"object comma instead of colon\",\n        \"valid\": false,\n        \"json\": \"{\\\"x\\\", null}\"\n      },\n      {\n        \"name\": \"object double colon\",\n        \"valid\": false,\n        \"json\": \"{\\\"x\\\"::\\\"b\\\"}\"\n      },\n      {\n        \"name\": \"object duplicated key\",\n        \"valid\": true,\n        \"json\": \"{\\\"a\\\":\\\"b\\\",\\\"a\\\":\\\"c\\\"}\",\n        \"data\": {\n          \"a\": \"c\"\n        }\n      },\n      {\n        \"name\": \"object duplicated key and value\",\n        \"valid\": true,\n        \"json\": \"{\\\"a\\\":\\\"b\\\",\\\"a\\\":\\\"b\\\"}\",\n        \"data\": {\n          \"a\": \"b\"\n        }\n      },\n      {\n        \"name\": \"object emoji\",\n        \"valid\": false,\n        \"json\": \"{🇨🇭}\"\n      },\n      {\n        \"name\": \"object empty\",\n        \"valid\": true,\n        \"json\": \"{}\",\n        \"data\": {}\n      },\n      {\n        \"name\": \"object empty key\",\n        \"valid\": true,\n        \"json\": \"{\\\"\\\":0}\",\n        \"data\": {\n          \"\": 0\n        }\n      },\n      {\n        \"name\": \"object escaped null in key\",\n        \"valid\": true,\n        \"json\": \"{\\\"foo\\\\u0000bar\\\": 42}\",\n        \"data\": {\n          \"foo\\u0000bar\": 42\n        }\n      },\n      {\n        \"name\": \"object extreme numbers\",\n        \"valid\": true,\n        \"json\": \"{ \\\"min\\\": -1.0e+28, \\\"max\\\": 1.0e+28 }\",\n        \"data\": {\n          \"min\": -1e28,\n          \"max\": 1e28\n        }\n      },\n      {\n        \"name\": \"object garbage at end\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"a\\\" 123}\"\n      },\n      {\n        \"name\": \"object key lone 2nd surrogate\",\n        \"valid\": null,\n        \"json\": \"{\\\"\\\\uDFAA\\\":0}\"\n      },\n      {\n        \"name\": \"object key with single quotes\",\n        \"valid\": false,\n        \"json\": \"{key: 'value'}\"\n      },\n      {\n        \"name\": \"object lone continuation byte in key and trailing comma\",\n        \"valid\": false,\n        \"json\": \"{\\\"�\\\":\\\"0\\\",}\"\n      },\n      {\n        \"name\": \"object long strings\",\n        \"valid\": true,\n        \"json\": \"{\\\"x\\\":[{\\\"id\\\": \\\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\\\"}], \\\"id\\\": \\\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\\\"}\",\n        \"data\": {\n          \"x\": [\n            {\n              \"id\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n            }\n          ],\n          \"id\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n        }\n      },\n      {\n        \"name\": \"object missing colon\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\" b}\"\n      },\n      {\n        \"name\": \"object missing key\",\n        \"valid\": false,\n        \"json\": \"{:\\\"b\\\"}\"\n      },\n      {\n        \"name\": \"object missing semicolon\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\" \\\"b\\\"}\"\n      },\n      {\n        \"name\": \"object missing value\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\"\n      },\n      {\n        \"name\": \"object no-colon\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\"\"\n      },\n      {\n        \"name\": \"object non string key\",\n        \"valid\": false,\n        \"json\": \"{1:1}\"\n      },\n      {\n        \"name\": \"object non string key but huge number instead\",\n        \"valid\": false,\n        \"json\": \"{9999E9999:1}\"\n      },\n      {\n        \"name\": \"object repeated null null\",\n        \"valid\": false,\n        \"json\": \"{null:null,null:null}\"\n      },\n      {\n        \"name\": \"object several trailing commas\",\n        \"valid\": false,\n        \"json\": \"{\\\"id\\\":0,,,,,}\"\n      },\n      {\n        \"name\": \"object simple\",\n        \"valid\": true,\n        \"json\": \"{\\\"a\\\":[]}\",\n        \"data\": {\n          \"a\": []\n        }\n      },\n      {\n        \"name\": \"object single quote\",\n        \"valid\": false,\n        \"json\": \"{'a':0}\"\n      },\n      {\n        \"name\": \"object string unicode\",\n        \"valid\": true,\n        \"json\": \"{\\\"title\\\":\\\"\\\\u041f\\\\u043e\\\\u043b\\\\u0442\\\\u043e\\\\u0440\\\\u0430 \\\\u0417\\\\u0435\\\\u043c\\\\u043b\\\\u0435\\\\u043a\\\\u043e\\\\u043f\\\\u0430\\\" }\",\n        \"data\": {\n          \"title\": \"Полтора Землекопа\"\n        }\n      },\n      {\n        \"name\": \"object trailing comma\",\n        \"valid\": false,\n        \"json\": \"{\\\"id\\\":0,}\"\n      },\n      {\n        \"name\": \"object trailing comment\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"b\\\"}/**/\"\n      },\n      {\n        \"name\": \"object trailing comment open\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"b\\\"}/**//\"\n      },\n      {\n        \"name\": \"object trailing comment slash open\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"b\\\"}//\"\n      },\n      {\n        \"name\": \"object trailing comment slash open incomplete\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"b\\\"}/\"\n      },\n      {\n        \"name\": \"object two commas in a row\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"b\\\",,\\\"c\\\":\\\"d\\\"}\"\n      },\n      {\n        \"name\": \"object unquoted key\",\n        \"valid\": false,\n        \"json\": \"{a: \\\"b\\\"}\"\n      },\n      {\n        \"name\": \"object unterminated-value\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"a\"\n      },\n      {\n        \"name\": \"object with newlines\",\n        \"valid\": true,\n        \"json\": \"{\\n\\\"a\\\": \\\"b\\\"\\n}\",\n        \"data\": {\n          \"a\": \"b\"\n        }\n      },\n      {\n        \"name\": \"object with single string\",\n        \"valid\": false,\n        \"json\": \"{ \\\"foo\\\" : \\\"bar\\\", \\\"a\\\" }\"\n      },\n      {\n        \"name\": \"object with trailing garbage\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"b\\\"}#\"\n      }\n    ]\n  },\n  {\n    \"suite\": \"string\",\n    \"tests\": [\n      {\n        \"name\": \"string 1 2 3 bytes UTF-8 sequences\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u0060\\\\u012a\\\\u12AB\\\"]\",\n        \"data\": [\"`Īካ\"]\n      },\n      {\n        \"name\": \"string 1 surrogate then escape\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\uD800\\\\\\\"]\"\n      },\n      {\n        \"name\": \"string 1 surrogate then escape u\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\uD800\\\\u\\\"]\"\n      },\n      {\n        \"name\": \"string 1 surrogate then escape u1\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\uD800\\\\u1\\\"]\"\n      },\n      {\n        \"name\": \"string 1 surrogate then escape u1x\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\uD800\\\\u1x\\\"]\"\n      },\n      {\n        \"name\": \"string 1st surrogate but 2nd missing\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\uDADA\\\"]\"\n      },\n      {\n        \"name\": \"string 1st valid surrogate 2nd invalid\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\uD888\\\\u1234\\\"]\"\n      },\n      {\n        \"name\": \"string UTF-16LE with BOM\",\n        \"valid\": null,\n        \"json\": \"��[\\u0000\\\"\\u0000�\\u0000\\\"\\u0000]\\u0000\"\n      },\n      {\n        \"name\": \"string UTF-8 invalid sequence\",\n        \"valid\": null,\n        \"json\": \"[\\\"日ш�\\\"]\"\n      },\n      {\n        \"name\": \"string UTF8 surrogate U+D800\",\n        \"valid\": null,\n        \"json\": \"[\\\"���\\\"]\"\n      },\n      {\n        \"name\": \"string accentuated char no quotes\",\n        \"valid\": false,\n        \"json\": \"[é]\"\n      },\n      {\n        \"name\": \"string accepted surrogate pair\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uD801\\\\udc37\\\"]\",\n        \"data\": [\"𐐷\"]\n      },\n      {\n        \"name\": \"string accepted surrogate pairs\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\ud83d\\\\ude39\\\\ud83d\\\\udc8d\\\"]\",\n        \"data\": [\"😹💍\"]\n      },\n      {\n        \"name\": \"string allowed escapes\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\\\\"\\\\\\\\\\\\/\\\\b\\\\f\\\\n\\\\r\\\\t\\\"]\",\n        \"data\": [\"\\\"\\\\/\\b\\f\\n\\r\\t\"]\n      },\n      {\n        \"name\": \"string backslash 00\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\\\u0000\\\"]\"\n      },\n      {\n        \"name\": \"string backslash and u escaped zero\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\\\\\u0000\\\"]\",\n        \"data\": [\"\\\\u0000\"]\n      },\n      {\n        \"name\": \"string backslash doublequotes\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\\\\"\\\"]\",\n        \"data\": [\"\\\"\"]\n      },\n      {\n        \"name\": \"string comments\",\n        \"valid\": true,\n        \"json\": \"[\\\"a/*b*/c/*d//e\\\"]\",\n        \"data\": [\"a/*b*/c/*d//e\"]\n      },\n      {\n        \"name\": \"string double escape a\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\\\\\a\\\"]\",\n        \"data\": [\"\\\\a\"]\n      },\n      {\n        \"name\": \"string double escape n\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\\\\\n\\\"]\",\n        \"data\": [\"\\\\n\"]\n      },\n      {\n        \"name\": \"string escape x\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\x00\\\"]\"\n      },\n      {\n        \"name\": \"string escaped backslash bad\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\\\\\\\\\\\\"]\"\n      },\n      {\n        \"name\": \"string escaped control character\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u0012\\\"]\",\n        \"data\": [\"\\u0012\"]\n      },\n      {\n        \"name\": \"string escaped ctrl char tab\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\\\t\\\"]\"\n      },\n      {\n        \"name\": \"string escaped emoji\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\🌀\\\"]\"\n      },\n      {\n        \"name\": \"string escaped noncharacter\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uFFFF\\\"]\",\n        \"data\": [\"￿\"]\n      },\n      {\n        \"name\": \"string in array\",\n        \"valid\": true,\n        \"json\": \"[\\\"asd\\\"]\",\n        \"data\": [\"asd\"]\n      },\n      {\n        \"name\": \"string in array with leading space\",\n        \"valid\": true,\n        \"json\": \"[ \\\"asd\\\"]\",\n        \"data\": [\"asd\"]\n      },\n      {\n        \"name\": \"string incomplete escape\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\\\\"]\"\n      },\n      {\n        \"name\": \"string incomplete escaped character\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\u00A\\\"]\"\n      },\n      {\n        \"name\": \"string incomplete surrogate\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\uD834\\\\uDd\\\"]\"\n      },\n      {\n        \"name\": \"string incomplete surrogate and escape valid\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\uD800\\\\n\\\"]\"\n      },\n      {\n        \"name\": \"string incomplete surrogate escape invalid\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\uD800\\\\uD800\\\\x\\\"]\"\n      },\n      {\n        \"name\": \"string incomplete surrogate pair\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\uDd1ea\\\"]\"\n      },\n      {\n        \"name\": \"string incomplete surrogates escape valid\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\uD800\\\\uD800\\\\n\\\"]\"\n      },\n      {\n        \"name\": \"string invalid backslash esc\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\a\\\"]\"\n      },\n      {\n        \"name\": \"string invalid lonely surrogate\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\ud800\\\"]\"\n      },\n      {\n        \"name\": \"string invalid surrogate\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\ud800abc\\\"]\"\n      },\n      {\n        \"name\": \"string invalid unicode escape\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\uqqqq\\\"]\"\n      },\n      {\n        \"name\": \"string invalid utf-8\",\n        \"valid\": null,\n        \"json\": \"[\\\"�\\\"]\"\n      },\n      {\n        \"name\": \"string invalid utf8 after escape\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\�\\\"]\"\n      },\n      {\n        \"name\": \"string invalid-utf-8-in-escape\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\u�\\\"]\"\n      },\n      {\n        \"name\": \"string inverted surrogates U+1D11E\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\uDd1e\\\\uD834\\\"]\"\n      },\n      {\n        \"name\": \"string iso latin 1\",\n        \"valid\": null,\n        \"json\": \"[\\\"�\\\"]\"\n      },\n      {\n        \"name\": \"string last surrogates 1 and 2\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uDBFF\\\\uDFFF\\\"]\",\n        \"data\": [\"􏿿\"]\n      },\n      {\n        \"name\": \"string leading uescaped thinspace\",\n        \"valid\": false,\n        \"json\": \"[\\\\u0020\\\"asd\\\"]\"\n      },\n      {\n        \"name\": \"string lone second surrogate\",\n        \"valid\": null,\n        \"json\": \"[\\\"\\\\uDFAA\\\"]\"\n      },\n      {\n        \"name\": \"string lone utf8 continuation byte\",\n        \"valid\": null,\n        \"json\": \"[\\\"�\\\"]\"\n      },\n      {\n        \"name\": \"string nbsp uescaped\",\n        \"valid\": true,\n        \"json\": \"[\\\"new\\\\u00A0line\\\"]\",\n        \"data\": [\"new line\"]\n      },\n      {\n        \"name\": \"string no quotes with bad escape\",\n        \"valid\": false,\n        \"json\": \"[\\\\n]\"\n      },\n      {\n        \"name\": \"string nonCharacterInUTF-8 U+10FFFF\",\n        \"valid\": true,\n        \"json\": \"[\\\"􏿿\\\"]\",\n        \"data\": [\"􏿿\"]\n      },\n      {\n        \"name\": \"string nonCharacterInUTF-8 U+FFFF\",\n        \"valid\": true,\n        \"json\": \"[\\\"￿\\\"]\",\n        \"data\": [\"￿\"]\n      },\n      {\n        \"name\": \"string not in unicode range\",\n        \"valid\": null,\n        \"json\": \"[\\\"����\\\"]\"\n      },\n      {\n        \"name\": \"string null escape\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u0000\\\"]\",\n        \"data\": [\"\\u0000\"]\n      },\n      {\n        \"name\": \"string one-byte-utf-8\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u002c\\\"]\",\n        \"data\": [\",\"]\n      },\n      {\n        \"name\": \"string overlong sequence 2 bytes\",\n        \"valid\": null,\n        \"json\": \"[\\\"��\\\"]\"\n      },\n      {\n        \"name\": \"string overlong sequence 6 bytes\",\n        \"valid\": null,\n        \"json\": \"[\\\"������\\\"]\"\n      },\n      {\n        \"name\": \"string overlong sequence 6 bytes null\",\n        \"valid\": null,\n        \"json\": \"[\\\"������\\\"]\"\n      },\n      {\n        \"name\": \"string pi\",\n        \"valid\": true,\n        \"json\": \"[\\\"π\\\"]\",\n        \"data\": [\"π\"]\n      },\n      {\n        \"name\": \"string reservedCharacterInUTF-8 U+1BFFF\",\n        \"valid\": true,\n        \"json\": \"[\\\"𛿿\\\"]\",\n        \"data\": [\"𛿿\"]\n      },\n      {\n        \"name\": \"string simple ascii\",\n        \"valid\": true,\n        \"json\": \"[\\\"asd \\\"]\",\n        \"data\": [\"asd \"]\n      },\n      {\n        \"name\": \"string single doublequote\",\n        \"valid\": false,\n        \"json\": \"\\\"\"\n      },\n      {\n        \"name\": \"string single quote\",\n        \"valid\": false,\n        \"json\": \"['single quote']\"\n      },\n      {\n        \"name\": \"string single string no double quotes\",\n        \"valid\": false,\n        \"json\": \"abc\"\n      },\n      {\n        \"name\": \"string space\",\n        \"valid\": true,\n        \"json\": \"[\\\" \\\"]\",\n        \"data\": [\" \"]\n      },\n      {\n        \"name\": \"string start escape unclosed\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\\"\n      },\n      {\n        \"name\": \"string surrogates U+1D11E MUSICAL SYMBOL G CLEF\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uD834\\\\uDd1e\\\"]\",\n        \"data\": [\"𝄞\"]\n      },\n      {\n        \"name\": \"string three-byte-utf-8\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u0821\\\"]\",\n        \"data\": [\"ࠡ\"]\n      },\n      {\n        \"name\": \"string truncated-utf-8\",\n        \"valid\": null,\n        \"json\": \"[\\\"��\\\"]\"\n      },\n      {\n        \"name\": \"string two-byte-utf-8\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u0123\\\"]\",\n        \"data\": [\"ģ\"]\n      },\n      {\n        \"name\": \"string u+2028 line sep\",\n        \"valid\": true,\n        \"json\": \"[\\\" \\\"]\",\n        \"data\": [\" \"]\n      },\n      {\n        \"name\": \"string u+2029 par sep\",\n        \"valid\": true,\n        \"json\": \"[\\\" \\\"]\",\n        \"data\": [\" \"]\n      },\n      {\n        \"name\": \"string uEscape\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u0061\\\\u30af\\\\u30EA\\\\u30b9\\\"]\",\n        \"data\": [\"aクリス\"]\n      },\n      {\n        \"name\": \"string uescaped newline\",\n        \"valid\": true,\n        \"json\": \"[\\\"new\\\\u000Aline\\\"]\",\n        \"data\": [\"new\\nline\"]\n      },\n      {\n        \"name\": \"string unescaped char delete\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\"]\",\n        \"data\": [\"\"]\n      },\n      {\n        \"name\": \"string unescaped ctrl char\",\n        \"valid\": false,\n        \"json\": \"[\\\"a\\u0000a\\\"]\"\n      },\n      {\n        \"name\": \"string unescaped newline\",\n        \"valid\": false,\n        \"json\": \"[\\\"new\\nline\\\"]\"\n      },\n      {\n        \"name\": \"string unescaped tab\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\t\\\"]\"\n      },\n      {\n        \"name\": \"string unicode\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uA66D\\\"]\",\n        \"data\": [\"ꙭ\"]\n      },\n      {\n        \"name\": \"string unicode 2\",\n        \"valid\": true,\n        \"json\": \"[\\\"⍂㈴⍂\\\"]\",\n        \"data\": [\"⍂㈴⍂\"]\n      },\n      {\n        \"name\": \"string unicode CapitalU\",\n        \"valid\": false,\n        \"json\": \"\\\"\\\\UA66D\\\"\"\n      },\n      {\n        \"name\": \"string unicode U+10FFFE nonchar\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uDBFF\\\\uDFFE\\\"]\",\n        \"data\": [\"􏿾\"]\n      },\n      {\n        \"name\": \"string unicode U+1FFFE nonchar\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uD83F\\\\uDFFE\\\"]\",\n        \"data\": [\"🿾\"]\n      },\n      {\n        \"name\": \"string unicode U+200B ZERO WIDTH SPACE\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u200B\\\"]\",\n        \"data\": [\"​\"]\n      },\n      {\n        \"name\": \"string unicode U+2064 invisible plus\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u2064\\\"]\",\n        \"data\": [\"⁤\"]\n      },\n      {\n        \"name\": \"string unicode U+FDD0 nonchar\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uFDD0\\\"]\",\n        \"data\": [\"﷐\"]\n      },\n      {\n        \"name\": \"string unicode U+FFFE nonchar\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\uFFFE\\\"]\",\n        \"data\": [\"￾\"]\n      },\n      {\n        \"name\": \"string unicode escaped double quote\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u0022\\\"]\",\n        \"data\": [\"\\\"\"]\n      },\n      {\n        \"name\": \"string unicodeEscapedBackslash\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\\u005C\\\"]\",\n        \"data\": [\"\\\\\"]\n      },\n      {\n        \"name\": \"string utf16BE no BOM\",\n        \"valid\": null,\n        \"json\": \"\\u0000[\\u0000\\\"\\u0000�\\u0000\\\"\\u0000]\"\n      },\n      {\n        \"name\": \"string utf16LE no BOM\",\n        \"valid\": null,\n        \"json\": \"[\\u0000\\\"\\u0000�\\u0000\\\"\\u0000]\\u0000\"\n      },\n      {\n        \"name\": \"string utf8\",\n        \"valid\": true,\n        \"json\": \"[\\\"€𝄞\\\"]\",\n        \"data\": [\"€𝄞\"]\n      },\n      {\n        \"name\": \"string with del character\",\n        \"valid\": true,\n        \"json\": \"[\\\"aa\\\"]\",\n        \"data\": [\"aa\"]\n      },\n      {\n        \"name\": \"string with trailing garbage\",\n        \"valid\": false,\n        \"json\": \"\\\"\\\"x\"\n      }\n    ]\n  },\n  {\n    \"suite\": \"structure\",\n    \"tests\": [\n      {\n        \"name\": \"structure 100000 opening arrays\",\n        \"valid\": false,\n        \"json\": \"[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\"\n      },\n      {\n        \"name\": \"structure 500 nested arrays\",\n        \"valid\": null,\n        \"json\": \"[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\"\n      },\n      {\n        \"name\": \"structure U+2060 word joined\",\n        \"valid\": false,\n        \"json\": \"[⁠]\"\n      },\n      {\n        \"name\": \"structure UTF-8 BOM empty object\",\n        \"valid\": null,\n        \"json\": \"﻿{}\"\n      },\n      {\n        \"name\": \"structure UTF8 BOM no data\",\n        \"valid\": false,\n        \"json\": \"﻿\"\n      },\n      {\n        \"name\": \"structure angle bracket .\",\n        \"valid\": false,\n        \"json\": \"<.>\"\n      },\n      {\n        \"name\": \"structure angle bracket null\",\n        \"valid\": false,\n        \"json\": \"[<null>]\"\n      },\n      {\n        \"name\": \"structure array trailing garbage\",\n        \"valid\": false,\n        \"json\": \"[1]x\"\n      },\n      {\n        \"name\": \"structure array with extra array close\",\n        \"valid\": false,\n        \"json\": \"[1]]\"\n      },\n      {\n        \"name\": \"structure array with unclosed string\",\n        \"valid\": false,\n        \"json\": \"[\\\"asd]\"\n      },\n      {\n        \"name\": \"structure ascii-unicode-identifier\",\n        \"valid\": false,\n        \"json\": \"aå\"\n      },\n      {\n        \"name\": \"structure capitalized True\",\n        \"valid\": false,\n        \"json\": \"[True]\"\n      },\n      {\n        \"name\": \"structure close unopened array\",\n        \"valid\": false,\n        \"json\": \"1]\"\n      },\n      {\n        \"name\": \"structure comma instead of closing brace\",\n        \"valid\": false,\n        \"json\": \"{\\\"x\\\": true,\"\n      },\n      {\n        \"name\": \"structure double array\",\n        \"valid\": false,\n        \"json\": \"[][]\"\n      },\n      {\n        \"name\": \"structure end array\",\n        \"valid\": false,\n        \"json\": \"]\"\n      },\n      {\n        \"name\": \"structure incomplete UTF8 BOM\",\n        \"valid\": false,\n        \"json\": \"�{}\"\n      },\n      {\n        \"name\": \"structure lone-invalid-utf-8\",\n        \"valid\": false,\n        \"json\": \"�\"\n      },\n      {\n        \"name\": \"structure lone-open-bracket\",\n        \"valid\": false,\n        \"json\": \"[\"\n      },\n      {\n        \"name\": \"structure lonely false\",\n        \"valid\": true,\n        \"json\": \"false\",\n        \"data\": false\n      },\n      {\n        \"name\": \"structure lonely int\",\n        \"valid\": true,\n        \"json\": \"42\",\n        \"data\": 42\n      },\n      {\n        \"name\": \"structure lonely negative real\",\n        \"valid\": true,\n        \"json\": \"-0.1\",\n        \"data\": -0.1\n      },\n      {\n        \"name\": \"structure lonely null\",\n        \"valid\": true,\n        \"json\": \"null\",\n        \"data\": null\n      },\n      {\n        \"name\": \"structure lonely string\",\n        \"valid\": true,\n        \"json\": \"\\\"asd\\\"\",\n        \"data\": \"asd\"\n      },\n      {\n        \"name\": \"structure lonely true\",\n        \"valid\": true,\n        \"json\": \"true\",\n        \"data\": true\n      },\n      {\n        \"name\": \"structure no data\",\n        \"valid\": false,\n        \"json\": \"\"\n      },\n      {\n        \"name\": \"structure null-byte-outside-string\",\n        \"valid\": false,\n        \"json\": \"[\\u0000]\"\n      },\n      {\n        \"name\": \"structure number with trailing garbage\",\n        \"valid\": false,\n        \"json\": \"2@\"\n      },\n      {\n        \"name\": \"structure object followed by closing object\",\n        \"valid\": false,\n        \"json\": \"{}}\"\n      },\n      {\n        \"name\": \"structure object unclosed no value\",\n        \"valid\": false,\n        \"json\": \"{\\\"\\\":\"\n      },\n      {\n        \"name\": \"structure object with comment\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":/*comment*/\\\"b\\\"}\"\n      },\n      {\n        \"name\": \"structure object with trailing garbage\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\": true} \\\"x\\\"\"\n      },\n      {\n        \"name\": \"structure open array apostrophe\",\n        \"valid\": false,\n        \"json\": \"['\"\n      },\n      {\n        \"name\": \"structure open array comma\",\n        \"valid\": false,\n        \"json\": \"[,\"\n      },\n      {\n        \"name\": \"structure open array object\",\n        \"valid\": false,\n        \"json\": \"[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":[{\\\"\\\":\\n\"\n      },\n      {\n        \"name\": \"structure open array open object\",\n        \"valid\": false,\n        \"json\": \"[{\"\n      },\n      {\n        \"name\": \"structure open array open string\",\n        \"valid\": false,\n        \"json\": \"[\\\"a\"\n      },\n      {\n        \"name\": \"structure open array string\",\n        \"valid\": false,\n        \"json\": \"[\\\"a\\\"\"\n      },\n      {\n        \"name\": \"structure open object\",\n        \"valid\": false,\n        \"json\": \"{\"\n      },\n      {\n        \"name\": \"structure open object close array\",\n        \"valid\": false,\n        \"json\": \"{]\"\n      },\n      {\n        \"name\": \"structure open object comma\",\n        \"valid\": false,\n        \"json\": \"{,\"\n      },\n      {\n        \"name\": \"structure open object open array\",\n        \"valid\": false,\n        \"json\": \"{[\"\n      },\n      {\n        \"name\": \"structure open object open string\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\"\n      },\n      {\n        \"name\": \"structure open object string with apostrophes\",\n        \"valid\": false,\n        \"json\": \"{'a'\"\n      },\n      {\n        \"name\": \"structure open open\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\\{[\\\"\\\\{[\\\"\\\\{[\\\"\\\\{\"\n      },\n      {\n        \"name\": \"structure single eacute\",\n        \"valid\": false,\n        \"json\": \"�\"\n      },\n      {\n        \"name\": \"structure single star\",\n        \"valid\": false,\n        \"json\": \"*\"\n      },\n      {\n        \"name\": \"structure string empty\",\n        \"valid\": true,\n        \"json\": \"\\\"\\\"\",\n        \"data\": \"\"\n      },\n      {\n        \"name\": \"structure trailing #\",\n        \"valid\": false,\n        \"json\": \"{\\\"a\\\":\\\"b\\\"}#{}\"\n      },\n      {\n        \"name\": \"structure trailing newline\",\n        \"valid\": true,\n        \"json\": \"[\\\"a\\\"]\\n\",\n        \"data\": [\"a\"]\n      },\n      {\n        \"name\": \"structure true in array\",\n        \"valid\": true,\n        \"json\": \"[true]\",\n        \"data\": [true]\n      },\n      {\n        \"name\": \"structure uescaped LF before string\",\n        \"valid\": false,\n        \"json\": \"[\\\\u000A\\\"\\\"]\"\n      },\n      {\n        \"name\": \"structure unclosed array\",\n        \"valid\": false,\n        \"json\": \"[1\"\n      },\n      {\n        \"name\": \"structure unclosed array partial null\",\n        \"valid\": false,\n        \"json\": \"[ false, nul\"\n      },\n      {\n        \"name\": \"structure unclosed array unfinished false\",\n        \"valid\": false,\n        \"json\": \"[ true, fals\"\n      },\n      {\n        \"name\": \"structure unclosed array unfinished true\",\n        \"valid\": false,\n        \"json\": \"[ false, tru\"\n      },\n      {\n        \"name\": \"structure unclosed object\",\n        \"valid\": false,\n        \"json\": \"{\\\"asd\\\":\\\"asd\\\"\"\n      },\n      {\n        \"name\": \"structure unicode-identifier\",\n        \"valid\": false,\n        \"json\": \"å\"\n      },\n      {\n        \"name\": \"structure whitespace U+2060 word joiner\",\n        \"valid\": false,\n        \"json\": \"[⁠]\"\n      },\n      {\n        \"name\": \"structure whitespace array\",\n        \"valid\": true,\n        \"json\": \" [] \",\n        \"data\": []\n      },\n      {\n        \"name\": \"structure whitespace formfeed\",\n        \"valid\": false,\n        \"json\": \"[\\f]\"\n      }\n    ]\n  },\n  {\n    \"suite\": \"array\",\n    \"tests\": [\n      {\n        \"name\": \"array 1 true without comma\",\n        \"valid\": false,\n        \"json\": \"[1 true]\"\n      },\n      {\n        \"name\": \"array a invalid utf8\",\n        \"valid\": false,\n        \"json\": \"[a�]\"\n      },\n      {\n        \"name\": \"array arraysWithSpaces\",\n        \"valid\": true,\n        \"json\": \"[[]   ]\",\n        \"data\": [[]]\n      },\n      {\n        \"name\": \"array colon instead of comma\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\": 1]\"\n      },\n      {\n        \"name\": \"array comma after close\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\"],\"\n      },\n      {\n        \"name\": \"array comma and number\",\n        \"valid\": false,\n        \"json\": \"[,1]\"\n      },\n      {\n        \"name\": \"array double comma\",\n        \"valid\": false,\n        \"json\": \"[1,,2]\"\n      },\n      {\n        \"name\": \"array double extra comma\",\n        \"valid\": false,\n        \"json\": \"[\\\"x\\\",,]\"\n      },\n      {\n        \"name\": \"array empty\",\n        \"valid\": true,\n        \"json\": \"[]\",\n        \"data\": []\n      },\n      {\n        \"name\": \"array empty-string\",\n        \"valid\": true,\n        \"json\": \"[\\\"\\\"]\",\n        \"data\": [\"\"]\n      },\n      {\n        \"name\": \"array ending with newline\",\n        \"valid\": true,\n        \"json\": \"[\\\"a\\\"]\",\n        \"data\": [\"a\"]\n      },\n      {\n        \"name\": \"array extra close\",\n        \"valid\": false,\n        \"json\": \"[\\\"x\\\"]]\"\n      },\n      {\n        \"name\": \"array extra comma\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\",]\"\n      },\n      {\n        \"name\": \"array false\",\n        \"valid\": true,\n        \"json\": \"[false]\",\n        \"data\": [false]\n      },\n      {\n        \"name\": \"array heterogeneous\",\n        \"valid\": true,\n        \"json\": \"[null, 1, \\\"1\\\", {}]\",\n        \"data\": [null, 1, \"1\", {}]\n      },\n      {\n        \"name\": \"array incomplete\",\n        \"valid\": false,\n        \"json\": \"[\\\"x\\\"\"\n      },\n      {\n        \"name\": \"array incomplete invalid value\",\n        \"valid\": false,\n        \"json\": \"[x\"\n      },\n      {\n        \"name\": \"array inner array no comma\",\n        \"valid\": false,\n        \"json\": \"[3[4]]\"\n      },\n      {\n        \"name\": \"array invalid utf8\",\n        \"valid\": false,\n        \"json\": \"[�]\"\n      },\n      {\n        \"name\": \"array items separated by semicolon\",\n        \"valid\": false,\n        \"json\": \"[1:2]\"\n      },\n      {\n        \"name\": \"array just comma\",\n        \"valid\": false,\n        \"json\": \"[,]\"\n      },\n      {\n        \"name\": \"array just minus\",\n        \"valid\": false,\n        \"json\": \"[-]\"\n      },\n      {\n        \"name\": \"array missing value\",\n        \"valid\": false,\n        \"json\": \"[   , \\\"\\\"]\"\n      },\n      {\n        \"name\": \"array newlines unclosed\",\n        \"valid\": false,\n        \"json\": \"[\\\"a\\\",\\n4\\n,1,\"\n      },\n      {\n        \"name\": \"array null\",\n        \"valid\": true,\n        \"json\": \"[null]\",\n        \"data\": [null]\n      },\n      {\n        \"name\": \"array number and comma\",\n        \"valid\": false,\n        \"json\": \"[1,]\"\n      },\n      {\n        \"name\": \"array number and several commas\",\n        \"valid\": false,\n        \"json\": \"[1,,]\"\n      },\n      {\n        \"name\": \"array spaces vertical tab formfeed\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\u000ba\\\"\\\\f]\"\n      },\n      {\n        \"name\": \"array star inside\",\n        \"valid\": false,\n        \"json\": \"[*]\"\n      },\n      {\n        \"name\": \"array unclosed\",\n        \"valid\": false,\n        \"json\": \"[\\\"\\\"\"\n      },\n      {\n        \"name\": \"array unclosed trailing comma\",\n        \"valid\": false,\n        \"json\": \"[1,\"\n      },\n      {\n        \"name\": \"array unclosed with new lines\",\n        \"valid\": false,\n        \"json\": \"[1,\\n1\\n,1\"\n      },\n      {\n        \"name\": \"array unclosed with object inside\",\n        \"valid\": false,\n        \"json\": \"[{}\"\n      },\n      {\n        \"name\": \"array with 1 and newline\",\n        \"valid\": true,\n        \"json\": \"[1\\n]\",\n        \"data\": [1]\n      },\n      {\n        \"name\": \"array with leading space\",\n        \"valid\": true,\n        \"json\": \" [1]\",\n        \"data\": [1]\n      },\n      {\n        \"name\": \"array with several null\",\n        \"valid\": true,\n        \"json\": \"[1,null,null,null,2]\",\n        \"data\": [1, null, null, null, 2]\n      },\n      {\n        \"name\": \"array with trailing space\",\n        \"valid\": true,\n        \"json\": \"[2] \",\n        \"data\": [2]\n      }\n    ]\n  },\n  {\n    \"suite\": \"incomplete\",\n    \"tests\": [\n      {\n        \"name\": \"incomplete false\",\n        \"valid\": false,\n        \"json\": \"[fals]\"\n      },\n      {\n        \"name\": \"incomplete null\",\n        \"valid\": false,\n        \"json\": \"[nul]\"\n      },\n      {\n        \"name\": \"incomplete true\",\n        \"valid\": false,\n        \"json\": \"[tru]\"\n      }\n    ]\n  },\n  {\n    \"suite\": \"multidigit\",\n    \"tests\": [\n      {\n        \"name\": \"multidigit number then 00\",\n        \"valid\": false,\n        \"json\": \"123\\u0000\"\n      }\n    ]\n  },\n  {\n    \"suite\": \"single\",\n    \"tests\": [\n      {\n        \"name\": \"single space\",\n        \"valid\": false,\n        \"json\": \" \"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/jtd-schema.spec.ts",
    "content": "import type AjvJTD from \"../dist/jtd\"\nimport type {SchemaObject, JTDParser} from \"../dist/jtd\"\nimport _AjvJTD from \"./ajv_jtd\"\nimport getAjvInstances from \"./ajv_instances\"\nimport {withStandalone} from \"./ajv_standalone\"\nimport jtdValidationTests = require(\"./json-typedef-spec/tests/validation.json\")\nimport jtdInvalidSchemasTests = require(\"./json-typedef-spec/tests/invalid_schemas.json\")\n// tests from https://github.com/nst/JSONTestSuite\nimport jsonParseTests = require(\"./json_parse_tests.json\")\nimport assert = require(\"assert\")\nimport AjvPack from \"../dist/standalone/instance\"\n\ninterface TestCase {\n  schema: SchemaObject\n  instance: unknown\n  errors: TestCaseError[]\n}\n\ninterface TestCaseError {\n  instancePath: string[]\n  schemaPath: string[]\n}\n\ninterface JSONParseTest {\n  name: string\n  valid: boolean | null\n  json: string\n  data?: unknown\n  only?: boolean\n  skip?: boolean\n}\n\ninterface JSONParseTestSuite {\n  suite: string\n  tests: JSONParseTest[]\n}\n\ninterface JTDError {\n  instancePath: string\n  schemaPath: string\n}\n\n// const ONLY: RegExp[] = [\n//   \"empty\",\n//   \"ref\",\n//   \"type\",\n//   \"enum\",\n//   \"elements\",\n//   \"properties\",\n//   \"optionalProperties\",\n//   \"discriminator\",\n//   \"values\",\n// ].map((s) => new RegExp(`(^|.*\\\\s)${s}\\\\s.*-`))\n\nconst ONLY: RegExp[] = []\n\ndescribe(\"JSON Type Definition\", () => {\n  describe(\"validation\", function () {\n    this.timeout(10000)\n    let ajvs: AjvJTD[]\n\n    before(() => {\n      ajvs = getAjvInstances(_AjvJTD, {\n        allErrors: true,\n        inlineRefs: false,\n        code: {es5: true, lines: true, optimize: false},\n      }) as AjvJTD[]\n      ajvs.forEach((ajv) => (ajv.opts.code.source = true))\n    })\n\n    for (const testName in jtdValidationTests) {\n      const {schema, instance, errors} = jtdValidationTests[testName] as TestCase\n      const valid = errors.length === 0\n      describeOnly(testName, () =>\n        it(`should be ${valid ? \"valid\" : \"invalid\"}`, () =>\n          withStandalone(ajvs).forEach((ajv) => {\n            // console.log(ajv.compile(schema).toString())\n            // console.log(ajv.validate(schema, instance), ajv.errors)\n            assert.strictEqual(ajv.validate(schema, instance), valid)\n            const opts = ajv instanceof AjvPack ? ajv.ajv.opts : ajv.opts\n            if (opts.allErrors) {\n              assert.deepStrictEqual(cleanErrors(ajv.errors), valid ? null : convertErrors(errors))\n            }\n          }))\n      )\n    }\n\n    function cleanErrors(errors?: JTDError[] | null): JTDError[] | null | undefined {\n      if (errors) {\n        return sortErrors(errors.map(({instancePath, schemaPath}) => ({instancePath, schemaPath})))\n      }\n      return errors\n    }\n\n    function convertErrors(errors: TestCaseError[]): JTDError[] | null | undefined {\n      return sortErrors(\n        errors.map((e) => ({\n          instancePath: jsonPointer(e.instancePath),\n          schemaPath: jsonPointer(e.schemaPath),\n        }))\n      )\n    }\n\n    function sortErrors(errors?: JTDError[] | null): JTDError[] | null | undefined {\n      if (errors) {\n        errors.sort(\n          (e1: JTDError, e2: JTDError) =>\n            e1.schemaPath.localeCompare(e2.schemaPath) ||\n            e1.instancePath.localeCompare(e2.instancePath)\n        )\n      }\n      return errors\n    }\n\n    function jsonPointer(error: string[]): string {\n      return error.map((s) => `/${s}`).join(\"\")\n    }\n  })\n\n  describe(\"invalid schemas\", () => {\n    let ajv: AjvJTD\n    before(() => (ajv = new _AjvJTD()))\n\n    for (const testName in jtdInvalidSchemasTests) {\n      const schema = jtdInvalidSchemasTests[testName]\n      describe(testName, () =>\n        it(\"should be invalid schema\", () => assert.throws(() => ajv.compile(schema)))\n      )\n    }\n  })\n\n  describe(\"serialize\", () => {\n    const ajv = new _AjvJTD()\n\n    for (const testName in jtdValidationTests) {\n      const {schema, instance, errors} = jtdValidationTests[testName] as TestCase\n      const valid = errors.length === 0\n      if (!valid) continue\n      describe(testName, () =>\n        it(`should serialize data`, () => {\n          const serialize = ajv.compileSerializer(schema)\n          // console.log(serialize.toString())\n          assert.deepStrictEqual(JSON.parse(serialize(instance)), instance)\n        })\n      )\n    }\n  })\n\n  describe(\"serialize special numeric values\", () => {\n    describe(\"fast\", () => {\n      const ajv = new _AjvJTD({specialNumbers: \"fast\"})\n\n      it(`should serialize Infinity to literal`, () => {\n        const serialize = ajv.compileSerializer({type: \"float64\"})\n        const res = serialize(Infinity)\n        assert.equal(res, \"Infinity\")\n        assert.throws(() => JSON.parse(res))\n      })\n      it(`should serialize -Infinity to literal`, () => {\n        const serialize = ajv.compileSerializer({type: \"float64\"})\n        const res = serialize(-Infinity)\n        assert.equal(res, \"-Infinity\")\n        assert.throws(() => JSON.parse(res))\n      })\n      it(`should serialize NaN to literal`, () => {\n        const serialize = ajv.compileSerializer({type: \"float64\"})\n        const res = serialize(NaN)\n        assert.equal(res, \"NaN\")\n        assert.throws(() => JSON.parse(res))\n      })\n    })\n    describe(\"to null\", () => {\n      const ajv = new _AjvJTD({specialNumbers: \"null\"})\n\n      it(`should serialize Infinity to null`, () => {\n        const serialize = ajv.compileSerializer({type: \"float64\"})\n        const res = serialize(Infinity)\n        assert.equal(res, \"null\")\n        assert.equal(JSON.parse(res), null)\n      })\n      it(`should serialize -Infinity to null`, () => {\n        const serialize = ajv.compileSerializer({type: \"float64\"})\n        const res = serialize(-Infinity)\n        assert.equal(res, \"null\")\n        assert.equal(JSON.parse(res), null)\n      })\n      it(`should serialize NaN to null`, () => {\n        const serialize = ajv.compileSerializer({type: \"float64\"})\n        const res = serialize(NaN)\n        assert.equal(res, \"null\")\n        assert.equal(JSON.parse(res), null)\n      })\n    })\n  })\n\n  describe(\"parse\", () => {\n    let ajv: AjvJTD\n    before(() => (ajv = new _AjvJTD()))\n\n    for (const testName in jtdValidationTests) {\n      const {schema, instance, errors} = jtdValidationTests[testName] as TestCase\n      const valid = errors.length === 0\n      describeOnly(testName, () => {\n        if (valid) {\n          it(`should parse valid JSON string`, () => {\n            const parse = ajv.compileParser(schema)\n            // console.log(schema, instance, `\"${JSON.stringify(instance)}\"`, parse.toString())\n            shouldParse(parse, JSON.stringify(instance), instance)\n            shouldParse(parse, `  ${JSON.stringify(instance, null, 2)}  `, instance)\n          })\n        } else {\n          it(`should return undefined on invalid JSON string`, () => {\n            const parse = ajv.compileParser(schema)\n            // console.log(parse.toString())\n            shouldFail(parse, JSON.stringify(instance))\n            shouldFail(parse, `  ${JSON.stringify(instance, null, 2)}  `)\n          })\n        }\n      })\n    }\n  })\n\n  describe(\"parse tests nst/JSONTestSuite\", () => {\n    const ajv = new _AjvJTD()\n    const parseJson: JTDParser = ajv.compileParser({})\n    const parse: {[K in \"string\" | \"number\" | \"array\" | \"object\"]: JTDParser} = {\n      string: ajv.compileParser({elements: {type: \"string\"}}),\n      number: ajv.compileParser({elements: {type: \"float64\"}}),\n      array: ajv.compileParser({elements: {}}),\n      object: ajv.compileParser({values: {}}),\n    }\n\n    for (const {suite, tests} of jsonParseTests as JSONParseTestSuite[]) {\n      describe(suite, () => {\n        for (const test of tests) {\n          const {valid, name, json, data} = test\n          if (valid) {\n            it(`should parse ${name}`, () => shouldParse(parseJson, json, data))\n            if (suite in parse) {\n              _it(test)(`should parse as ${suite}: ${name}`, () =>\n                shouldParse(parse[suite], json, data)\n              )\n            }\n          } else if (valid === false) {\n            it(`should fail parsing ${name}`, () => shouldFail(parseJson, json))\n            if (suite in parse) {\n              _it(test)(`should fail parsing as ${suite}: ${name}`, () =>\n                shouldFail(parse[suite], json)\n              )\n            }\n          }\n        }\n      })\n    }\n  })\n})\n\ntype TestFunc = typeof it | typeof it.only | typeof it.skip\n\nfunction _it({only, skip}: JSONParseTest): TestFunc {\n  return skip ? it.skip : only ? it.only : it\n}\n\nfunction shouldParse(parse: JTDParser, str: string, res: unknown): void {\n  assert.deepStrictEqual(parse(str), res)\n  assert.strictEqual(parse.message, undefined)\n  assert.strictEqual(parse.position, undefined)\n}\n\nfunction shouldFail(parse: JTDParser, str: string): void {\n  assert.strictEqual(parse(str), undefined)\n  assert.strictEqual(typeof parse.message, \"string\")\n  assert.strictEqual(typeof parse.position, \"number\")\n}\n\nfunction describeOnly(name: string, func: () => void) {\n  if (ONLY.length === 0 || ONLY.some((p) => p.test(name))) {\n    describe(name, func)\n  } else {\n    describe.skip(name, func)\n  }\n}\n"
  },
  {
    "path": "spec/jtd-timestamps.spec.ts",
    "content": "import _AjvJTD from \"./ajv_jtd\"\nimport assert = require(\"assert\")\nimport type {JTDOptions, JTDSchemaType} from \"../dist/jtd\"\n\ndescribe(\"JTD timestamps\", function () {\n  this.timeout(10000)\n\n  describe(\"validation\", () => {\n    it(\"should accept dates or strings by default\", () => {\n      testTimestamp({}, {Date: true, datetime: true, date: false})\n    })\n\n    it(\"timestamp: string should accept only strings\", () => {\n      testTimestamp({timestamp: \"string\"}, {Date: false, datetime: true, date: false})\n    })\n\n    it(\"timestamp: date should accept only Date objects\", () => {\n      testTimestamp({timestamp: \"date\"}, {Date: true, datetime: false, date: false})\n    })\n\n    it(\"allowDate: true should accept date without time component\", () => {\n      testTimestamp({allowDate: true}, {Date: true, datetime: true, date: true})\n      testTimestamp(\n        {allowDate: true, timestamp: \"string\"},\n        {Date: false, datetime: true, date: true}\n      )\n      testTimestamp(\n        {allowDate: true, timestamp: \"date\"},\n        {Date: true, datetime: false, date: false}\n      )\n    })\n\n    function testTimestamp(\n      opts: JTDOptions,\n      valid: {Date: boolean; datetime: boolean; date: boolean}\n    ) {\n      const ajv = new _AjvJTD(opts)\n      const schema = {type: \"timestamp\"}\n      const validate = ajv.compile(schema)\n      assert.strictEqual(validate(new Date()), valid.Date)\n      assert.strictEqual(validate(\"2021-05-03T05:24:43.906Z\"), valid.datetime)\n      assert.strictEqual(validate(\"2021-05-03\"), valid.date)\n      assert.strictEqual(validate(\"foo\"), false)\n    }\n  })\n\n  describe(\"parseDate option\", () => {\n    it(\"should parse timestamp as Date object\", () => {\n      const schema: JTDSchemaType<Date> = {type: \"timestamp\"}\n      const ajv = new _AjvJTD({parseDate: true})\n      const parseTS = ajv.compileParser(schema)\n      assert.strictEqual(\n        parseTS('\"2021-05-14T17:59:03.851Z\"')?.toISOString(),\n        \"2021-05-14T17:59:03.851Z\"\n      )\n      assert.strictEqual(parseTS('\"2021-05-14\"')?.toISOString(), undefined)\n    })\n\n    it(\"allowDate: true should parse timestamp and date as Date objects\", () => {\n      const schema: JTDSchemaType<Date> = {type: \"timestamp\"}\n      const ajv = new _AjvJTD({parseDate: true, allowDate: true})\n      const parseTS = ajv.compileParser(schema)\n      assert.strictEqual(\n        parseTS('\"2021-05-14T17:59:03.851Z\"')?.toISOString(),\n        \"2021-05-14T17:59:03.851Z\"\n      )\n      assert.strictEqual(parseTS('\"2021-05-14\"')?.toISOString(), \"2021-05-14T00:00:00.000Z\")\n    })\n  })\n\n  describe(\"serializing Date objects\", () => {\n    it(\"should serialize Date as JSON string\", () => {\n      const schema: JTDSchemaType<Date> = {type: \"timestamp\"}\n      const ajv = new _AjvJTD()\n      const serializeTS = ajv.compileSerializer(schema)\n      assert.strictEqual(\n        serializeTS(new Date(\"2021-05-14T17:59:03.851Z\")),\n        '\"2021-05-14T17:59:03.851Z\"'\n      )\n    })\n  })\n})\n"
  },
  {
    "path": "spec/keyword.spec.ts",
    "content": "import type {ErrorObject, SchemaObject, SchemaValidateFunction} from \"../lib/types\"\nimport type AjvCore from \"../dist/core\"\n// currently most tests include compiled code, if any code re-compiled locally, instanceof would fail\nimport {_, nil} from \"../dist/compile/codegen/code\"\nimport getAjvAllInstances from \"./ajv_all_instances\"\nimport _Ajv from \"./ajv\"\nimport equal from \"../dist/runtime/equal\"\nimport assert = require(\"assert\")\nimport chai from \"./chai\"\nconst should = chai.should()\n\ndescribe(\"User-defined keywords\", () => {\n  let ajv: AjvCore, instances: AjvCore[]\n\n  beforeEach(() => {\n    instances = getAjvAllInstances(\n      {\n        allErrors: true,\n        verbose: true,\n        inlineRefs: false,\n      },\n      {allowUnionTypes: true}\n    )\n    ajv = instances[0]\n  })\n\n  describe(\"user-defined keyword\", () => {\n    describe('keyword with \"validate\" function', () => {\n      it(\"should add and validate keyword\", () => {\n        testEvenKeyword({keyword: \"x-even\", type: \"number\", validate: validateEven})\n\n        function validateEven(schema, data) {\n          if (typeof schema != \"boolean\") {\n            throw new Error('The value of \"even\" keyword must be boolean')\n          }\n          return data % 2 ? !schema : schema\n        }\n      })\n\n      it(\"should add, validate keyword schema and validate rule\", () => {\n        testEvenKeyword({\n          keyword: \"x-even\",\n          type: \"number\",\n          validate: validateEven,\n          metaSchema: {type: \"boolean\"},\n        })\n\n        shouldBeInvalidSchema({type: \"number\", \"x-even\": \"not_boolean\"})\n\n        function validateEven(schema, data) {\n          return data % 2 ? !schema : schema\n        }\n      })\n\n      it('should pass parent schema to \"interpreted\" keyword validation', () => {\n        testRangeKeyword({\n          keyword: \"x-range\",\n          type: \"number\",\n          validate: validateRange,\n        })\n\n        function validateRange(schema, data, parentSchema) {\n          validateRangeSchema(schema, parentSchema)\n\n          return parentSchema.exclusiveRange === true\n            ? data > schema[0] && data < schema[1]\n            : data >= schema[0] && data <= schema[1]\n        }\n      })\n\n      it('should validate meta schema and pass parent schema to \"interpreted\" keyword validation', () => {\n        testRangeKeyword({\n          keyword: \"x-range\",\n          type: \"number\",\n          validate: validateRange,\n          metaSchema: {\n            type: \"array\",\n            items: [{type: \"number\"}, {type: \"number\"}],\n            minItems: 2,\n            additionalItems: false,\n          },\n        })\n        shouldBeInvalidSchema({type: \"number\", \"x-range\": [\"1\", 2]})\n        shouldBeInvalidSchema({type: \"number\", \"x-range\": {}})\n        shouldBeInvalidSchema({type: \"number\", \"x-range\": [1, 2, 3]})\n\n        function validateRange(schema, data, parentSchema) {\n          return parentSchema.exclusiveRange === true\n            ? data > schema[0] && data < schema[1]\n            : data >= schema[0] && data <= schema[1]\n        }\n      })\n\n      it('should allow defining errors for \"validate\" keyword', () => {\n        const validateRange: SchemaValidateFunction = _validateRange\n        testRangeKeyword({keyword: \"x-range\", type: \"number\", validate: validateRange}, true)\n\n        function _validateRange(schema, data, parentSchema) {\n          validateRangeSchema(schema, parentSchema)\n          const min = schema[0],\n            max = schema[1],\n            exclusive = parentSchema.exclusiveRange === true\n\n          const minOk = exclusive ? data > min : data >= min\n          const maxOk = exclusive ? data < max : data <= max\n          const valid = minOk && maxOk\n\n          if (!valid) {\n            const err: Partial<ErrorObject> = {keyword: \"x-range\"}\n            validateRange.errors = [err]\n            let comparison, limit\n            if (minOk) {\n              comparison = exclusive ? \"<\" : \"<=\"\n              limit = max\n            } else {\n              comparison = exclusive ? \">\" : \">=\"\n              limit = min\n            }\n            err.message = \"should be \" + comparison + \" \" + limit\n            err.params = {\n              comparison: comparison,\n              limit: limit,\n              exclusive: exclusive,\n            }\n          }\n\n          return valid\n        }\n      })\n\n      it(\"should support schemaType\", () => {\n        testEvenKeyword({\n          keyword: \"x-even\",\n          type: \"number\",\n          schemaType: \"boolean\",\n          validate: (schema, data) => (data % 2 ? !schema : schema),\n        })\n      })\n    })\n\n    describe('keyword with \"compile\" function', () => {\n      it(\"should add and validate keyword\", () => {\n        testEvenKeyword({\n          keyword: \"x-even\",\n          type: \"number\",\n          compile: compileEven,\n        })\n        shouldBeInvalidSchema(\n          {\n            type: \"number\",\n            \"x-even\": \"not_boolean\",\n          },\n          'The value of \"x-even\" keyword must be boolean'\n        )\n\n        function compileEven(schema) {\n          if (typeof schema != \"boolean\") {\n            throw new Error('The value of \"x-even\" keyword must be boolean')\n          }\n          return schema ? isEven : isOdd\n        }\n\n        function isEven(data) {\n          return data % 2 === 0\n        }\n        function isOdd(data) {\n          return data % 2 !== 0\n        }\n      })\n\n      it(\"should add, validate keyword schema and validate rule\", () => {\n        testEvenKeyword({\n          keyword: \"x-even\",\n          type: \"number\",\n          compile: compileEven,\n          metaSchema: {type: \"boolean\"},\n        })\n        shouldBeInvalidSchema({\n          type: \"number\",\n          \"x-even\": \"not_boolean\",\n        })\n\n        function compileEven(schema) {\n          return schema ? isEven : isOdd\n        }\n\n        function isEven(data) {\n          return data % 2 === 0\n        }\n        function isOdd(data) {\n          return data % 2 !== 0\n        }\n      })\n\n      it(\"should compile keyword validating function only once per schema\", () => {\n        testConstantKeyword({keyword: \"myConstant\", compile: compileConstant})\n      })\n\n      it(\"should allow multiple schemas for the same keyword\", () => {\n        testMultipleConstantKeyword({keyword: \"x-constant\", compile: compileConstant})\n      })\n\n      it('should pass parent schema to \"compiled\" keyword validation', () => {\n        testRangeKeyword({keyword: \"x-range\", type: \"number\", compile: compileRange})\n      })\n\n      it(\"should allow multiple parent schemas for the same keyword\", () => {\n        testMultipleRangeKeyword({keyword: \"x-range\", type: \"number\", compile: compileRange})\n      })\n\n      it(\"should support schemaType\", () => {\n        testEvenKeyword({\n          keyword: \"x-even\",\n          type: \"number\",\n          schemaType: \"boolean\",\n          compile: compileEven,\n        })\n        shouldBeInvalidSchema(\n          {\n            type: \"number\",\n            \"x-even\": \"not_boolean\",\n          },\n          'x-even value must be [\"boolean\"]'\n        )\n\n        function compileEven(schema) {\n          if (schema) return (data) => data % 2 === 0\n          return (data) => data % 2 !== 0\n        }\n      })\n    })\n\n    function compileConstant(schema) {\n      return typeof schema == \"object\" && schema !== null ? isDeepEqual : isStrictEqual\n\n      function isDeepEqual(data) {\n        return equal(data, schema)\n      }\n      function isStrictEqual(data) {\n        return data === schema\n      }\n    }\n\n    function compileRange(schema, parentSchema) {\n      validateRangeSchema(schema, parentSchema)\n\n      const min = schema[0]\n      const max = schema[1]\n\n      return parentSchema.exclusiveRange === true\n        ? (data) => data > min && data < max\n        : (data) => data >= min && data <= max\n    }\n  })\n\n  describe(\"macro keywords\", () => {\n    it('should add and validate keywords with \"macro\" function', () => {\n      testEvenKeyword({keyword: \"x-even\", type: \"number\", macro: macroEven}, 2)\n    })\n\n    it(\"should add and expand macro rule\", () => {\n      testConstantKeyword({keyword: \"myConstant\", macro: macroConstant}, 2)\n    })\n\n    it(\"should allow multiple schemas for the same macro keyword\", () => {\n      testMultipleConstantKeyword({keyword: \"x-constant\", macro: macroConstant}, 2)\n    })\n\n    it('should pass parent schema to \"macro\" keyword', () => {\n      testRangeKeyword({keyword: \"x-range\", type: \"number\", macro: macroRange}, undefined, 2)\n    })\n\n    it(\"should allow multiple parent schemas for the same macro keyword\", () => {\n      testMultipleRangeKeyword({keyword: \"x-range\", type: \"number\", macro: macroRange}, 2)\n    })\n\n    it(\"should support resolving $ref without id or $id\", () => {\n      instances.forEach((_ajv) => {\n        _ajv.addKeyword({\n          keyword: \"macroRef\",\n          macro(schema, _parentSchema, it) {\n            it.baseId.should.equal(\"#\")\n            const ref = schema.$ref\n            const validate = _ajv.getSchema(ref)\n            if (!validate) throw new _Ajv.MissingRefError(_ajv.opts.uriResolver, it.baseId, ref)\n            return validate.schema\n          },\n          metaSchema: {\n            type: \"object\",\n            required: [\"$ref\"],\n            additionalProperties: false,\n            properties: {\n              $ref: {\n                type: \"string\",\n              },\n            },\n          },\n        })\n        const schema = {\n          macroRef: {\n            $ref: \"#/definitions/schema\",\n          },\n          definitions: {\n            schema: {\n              type: \"string\",\n            },\n          },\n        }\n        const validate = _ajv.compile(schema)\n        shouldBeValid(validate, \"foo\")\n        shouldBeInvalid(validate, 1, 2)\n      })\n    })\n\n    it(\"should recursively expand macro keywords\", () => {\n      instances.forEach((_ajv) => {\n        _ajv.addKeyword({\n          keyword: \"deepProperties\",\n          type: \"object\",\n          macro: macroDeepProperties,\n        })\n        _ajv.addKeyword({keyword: \"range\", type: \"number\", macro: macroRange})\n\n        const schema = {\n          type: \"object\",\n          deepProperties: {\n            \"a.b.c\": {type: \"number\", range: [2, 4]},\n            \"d.e.f.g\": {type: \"string\"},\n          },\n        }\n\n        /* This schema recursively expands to:\n        {\n          \"allOf\": [\n            {\n              \"properties\": {\n                \"a\": {\n                  \"properties\": {\n                    \"b\": {\n                      \"properties\": {\n                        \"c\": {\n                          \"type\": \"number\",\n                          \"minimum\": 2,\n                          \"exclusiveMinimum\": false,\n                          \"maximum\": 4,\n                          \"exclusiveMaximum\": false\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            {\n              \"properties\": {\n                \"d\": {\n                  \"properties\": {\n                    \"e\": {\n                      \"properties\": {\n                        \"f\": {\n                          \"properties\": {\n                            \"g\": {\n                              \"type\": \"string\"\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          ]\n        }\n        */\n\n        const validate = _ajv.compile(schema)\n\n        shouldBeValid(validate, {\n          a: {b: {c: 3}},\n          d: {e: {f: {g: \"foo\"}}},\n        })\n\n        shouldBeInvalid(\n          validate,\n          {\n            a: {b: {c: 5}}, // out of range\n            d: {e: {f: {g: \"foo\"}}},\n          },\n          5\n        )\n\n        shouldBeInvalid(\n          validate,\n          {\n            a: {b: {c: \"bar\"}}, // not number\n            d: {e: {f: {g: \"foo\"}}},\n          },\n          4\n        )\n\n        shouldBeInvalid(\n          validate,\n          {\n            a: {b: {c: 3}},\n            d: {e: {f: {g: 2}}}, // not string\n          },\n          5\n        )\n\n        function macroDeepProperties(_schema) {\n          if (typeof _schema != \"object\") {\n            throw new Error(\"schema of deepProperty should be an object\")\n          }\n\n          const expanded: any[] = []\n\n          for (const prop in _schema) {\n            const path = prop.split(\".\")\n            const properties = {}\n            if (path.length === 1) {\n              properties[prop] = _schema[prop]\n            } else {\n              const deepProperties = {}\n              deepProperties[path.slice(1).join(\".\")] = _schema[prop]\n              properties[path[0]] = {type: \"object\", deepProperties}\n            }\n            expanded.push({type: \"object\", properties})\n          }\n\n          return expanded.length === 1 ? expanded[0] : {allOf: expanded}\n        }\n      })\n    })\n\n    it(\"should correctly expand multiple macros on the same level\", () => {\n      instances.forEach((_ajv) => {\n        _ajv.addKeyword({keyword: \"range\", type: \"number\", macro: macroRange})\n        _ajv.addKeyword({keyword: \"even\", type: \"number\", macro: macroEven})\n\n        const schema = {\n          type: \"number\",\n          range: [4, 6],\n          even: true,\n        }\n\n        const validate = _ajv.compile(schema)\n        const numErrors = _ajv.opts.allErrors ? 4 : 2\n\n        shouldBeInvalid(validate, 2, 2)\n        shouldBeInvalid(validate, 3, numErrors)\n        shouldBeValid(validate, 4)\n        shouldBeInvalid(validate, 5, 2)\n        shouldBeValid(validate, 6)\n        shouldBeInvalid(validate, 7, numErrors)\n        shouldBeInvalid(validate, 8, 2)\n      })\n    })\n\n    it(\"should validate macro keyword when it resolves to the same keyword as exists\", () => {\n      instances.forEach((_ajv) => {\n        _ajv.addKeyword({keyword: \"range\", type: \"number\", macro: macroRange})\n\n        const schema = {\n          type: \"number\",\n          range: [1, 4],\n          minimum: 2.5,\n        }\n\n        const validate = _ajv.compile(schema)\n\n        shouldBeValid(validate, 3)\n        shouldBeInvalid(validate, 2)\n      })\n    })\n\n    it(\"should correctly expand macros in subschemas\", () => {\n      instances.forEach((_ajv) => {\n        _ajv.addKeyword({keyword: \"range\", type: \"number\", macro: macroRange})\n\n        const schema = {\n          type: \"number\",\n          allOf: [{range: [4, 8]}, {range: [2, 6]}],\n        }\n\n        const validate = _ajv.compile(schema)\n\n        shouldBeInvalid(validate, 2, 2)\n        shouldBeInvalid(validate, 3, 2)\n        shouldBeValid(validate, 4)\n        shouldBeValid(validate, 5)\n        shouldBeValid(validate, 6)\n        shouldBeInvalid(validate, 7, 2)\n        shouldBeInvalid(validate, 8, 2)\n      })\n    })\n\n    it(\"should correctly expand macros in macro expansions\", () => {\n      instances.forEach((_ajv) => {\n        _ajv.addKeyword({keyword: \"range\", type: \"number\", macro: macroRange})\n        _ajv.addKeyword({keyword: \"exclusiveRange\", metaSchema: {type: \"boolean\"}})\n        _ajv.addKeyword({keyword: \"myContains\", type: \"array\", macro: macroContains})\n\n        const schema = {\n          type: \"array\",\n          myContains: {\n            type: \"number\",\n            range: [4, 7],\n            exclusiveRange: true,\n          },\n        }\n\n        const validate = _ajv.compile(schema)\n\n        shouldBeInvalid(validate, [1, 2, 3], 2)\n        shouldBeInvalid(validate, [2, 3, 4], 2)\n        shouldBeValid(validate, [3, 4, 5]) // only 5 is in range\n        shouldBeValid(validate, [6, 7, 8]) // only 6 is in range\n        shouldBeInvalid(validate, [7, 8, 9], 2)\n        shouldBeInvalid(validate, [8, 9, 10], 2)\n\n        function macroContains(_schema) {\n          return {not: {items: {not: _schema}}}\n        }\n      })\n    })\n\n    it(\"should throw exception if macro expansion is an invalid schema\", () => {\n      ajv.addKeyword({keyword: \"invalid\", macro: macroInvalid})\n      const schema = {invalid: true}\n\n      should.throw(() => {\n        ajv.compile(schema)\n      }, /type must be equal to one of the allowed values/)\n\n      function macroInvalid(/* schema */) {\n        return {type: \"invalid\"}\n      }\n    })\n\n    function macroEven(schema) {\n      if (schema === true) return {multipleOf: 2}\n      if (schema === false) return {not: {multipleOf: 2}}\n      throw new Error('Schema for \"even\" keyword should be boolean')\n    }\n\n    function macroConstant(schema /*, parentSchema */) {\n      return {enum: [schema]}\n    }\n\n    function macroRange(schema, parentSchema) {\n      validateRangeSchema(schema, parentSchema)\n      const exclusive = !!parentSchema.exclusiveRange\n\n      return exclusive\n        ? {exclusiveMinimum: schema[0], exclusiveMaximum: schema[1]}\n        : {minimum: schema[0], maximum: schema[1]}\n    }\n  })\n\n  describe('\"code\" keywords', () => {\n    it('should add and validate keyword with \"code\" function', () => {\n      testEvenKeyword({\n        keyword: \"x-even\",\n        type: \"number\",\n        code(cxt) {\n          const {schema, data} = cxt\n          const op = schema ? _`===` : _`!==`\n          cxt.pass(_`${data} % 2 ${op} 0`)\n        },\n      })\n    })\n\n    it('should pass parent schema to \"inline\" keyword', () => {\n      testRangeKeyword({\n        keyword: \"x-range\",\n        type: \"number\",\n        code(cxt) {\n          const {\n            schema: [min, max],\n            parentSchema,\n            data,\n          } = cxt\n          const eq = parentSchema.exclusiveRange ? nil : _`=`\n          cxt.pass(_`${data} >${eq} ${min} && ${data} <${eq} ${max}`)\n        },\n      })\n    })\n\n    it(\"should allow defining keyword error\", () => {\n      testRangeKeyword({\n        keyword: \"x-range\",\n        type: \"number\",\n        code(cxt) {\n          const {\n            gen,\n            schema: [min, max],\n            parentSchema,\n            data,\n          } = cxt\n          const eq = parentSchema.exclusiveRange ? nil : _`=`\n          const minOk = gen.const(\"minOk\", _`${data} >${eq} ${min}`)\n          const maxOk = gen.const(\"maxOk\", _`${data} <${eq} ${max}`)\n          cxt.setParams({minOk, maxOk, eq})\n          cxt.pass(_`${minOk} && ${maxOk}`)\n        },\n        error: {\n          message: ({params: {minOk, eq}, schema: [min, max]}) =>\n            _`${minOk} ? \"should be <${eq} ${max}\" : \"should be >${eq} ${min}\"`,\n          params: ({params: {minOk, eq}, schema: [min, max], parentSchema}) => _`{\n            comparison: ${minOk} ? \"<${eq}\" : \">${eq}\",\n            limit: ${minOk} ? ${max} : ${min},\n            exclusive: ${!!parentSchema.exclusiveRange}\n          }`,\n        },\n      })\n    })\n  })\n\n  describe('$data reference support with \"validate\" keywords (with $data option)', () => {\n    beforeEach(() => {\n      instances = getAjvAllInstances(\n        {\n          allErrors: true,\n          verbose: true,\n          inlineRefs: false,\n        },\n        {$data: true, allowUnionTypes: true}\n      )\n      ajv = instances[0]\n    })\n\n    it('should validate \"interpreted\" rule', () => {\n      testEvenKeyword$data({\n        keyword: \"x-even-$data\",\n        type: \"number\",\n        $data: true,\n        validate: validateEven,\n      })\n\n      function validateEven(schema, data) {\n        if (typeof schema != \"boolean\") return false\n        return data % 2 ? !schema : schema\n      }\n    })\n\n    it('should validate rule with \"compile\" and \"validate\" funcs', () => {\n      let compileCalled\n      testEvenKeyword$data({\n        keyword: \"x-even-$data\",\n        type: \"number\",\n        $data: true,\n        compile: compileEven,\n        validate: validateEven,\n      })\n      compileCalled.should.equal(true)\n\n      function validateEven(schema, data) {\n        if (typeof schema != \"boolean\") return false\n        return data % 2 ? !schema : schema\n      }\n\n      function compileEven(schema) {\n        compileCalled = true\n        if (typeof schema != \"boolean\") {\n          throw new Error('The value of \"even\" keyword must be boolean')\n        }\n        return schema ? isEven : isOdd\n      }\n\n      function isEven(data) {\n        return data % 2 === 0\n      }\n      function isOdd(data) {\n        return data % 2 !== 0\n      }\n    })\n\n    it('should validate with \"compile\" and \"validate\" funcs with meta-schema', () => {\n      let compileCalled\n      testEvenKeyword$data({\n        keyword: \"x-even-$data\",\n        type: \"number\",\n        $data: true,\n        compile: compileEven,\n        validate: validateEven,\n        metaSchema: {type: \"boolean\"},\n      })\n      compileCalled.should.equal(true)\n      shouldBeInvalidSchema({\n        type: \"number\",\n        \"x-even-$data\": \"false\",\n      })\n\n      function validateEven(schema, data) {\n        return data % 2 ? !schema : schema\n      }\n\n      function compileEven(schema) {\n        compileCalled = true\n        return schema ? isEven : isOdd\n      }\n\n      function isEven(data) {\n        return data % 2 === 0\n      }\n      function isOdd(data) {\n        return data % 2 !== 0\n      }\n    })\n\n    it('should validate rule with \"macro\" and \"validate\" funcs', () => {\n      let macroCalled\n      testEvenKeyword$data(\n        {\n          keyword: \"x-even-$data\",\n          type: \"number\",\n          $data: true,\n          macro: macroEven,\n          validate: validateEven,\n        },\n        2\n      )\n      macroCalled.should.equal(true)\n\n      function validateEven(schema, data) {\n        if (typeof schema != \"boolean\") return false\n        return data % 2 ? !schema : schema\n      }\n\n      function macroEven(schema) {\n        macroCalled = true\n        if (schema === true) return {multipleOf: 2}\n        if (schema === false) return {not: {multipleOf: 2}}\n        throw new Error('Schema for \"even\" keyword should be boolean')\n      }\n    })\n\n    it('should validate with \"macro\" and \"validate\" funcs with meta-schema', () => {\n      let macroCalled\n      testEvenKeyword$data(\n        {\n          keyword: \"x-even-$data\",\n          type: \"number\",\n          $data: true,\n          macro: macroEven,\n          validate: validateEven,\n          metaSchema: {type: \"boolean\"},\n        },\n        2\n      )\n      macroCalled.should.equal(true)\n      shouldBeInvalidSchema({\n        type: \"number\",\n        \"x-even-$data\": \"false\",\n      })\n\n      function validateEven(schema, data) {\n        return data % 2 ? !schema : schema\n      }\n\n      function macroEven(schema): SchemaObject | void {\n        macroCalled = true\n        if (schema === true) return {multipleOf: 2}\n        if (schema === false) return {not: {multipleOf: 2}}\n      }\n    })\n\n    it('should validate rule with \"code\" keyword', () => {\n      testEvenKeyword$data({\n        keyword: \"x-even-$data\",\n        type: \"number\",\n        $data: true,\n        code(cxt) {\n          const {gen, schemaCode: s, data} = cxt\n          gen.if(_`${s} !== undefined`)\n          cxt.pass(_`typeof ${s} == \"boolean\" && (${data} % 2 ? !${s} : ${s})`)\n        },\n      })\n    })\n\n    it('should validate with \"code\" and meta-schema', () => {\n      testEvenKeyword$data({\n        keyword: \"x-even-$data\",\n        type: \"number\",\n        $data: true,\n        code(cxt) {\n          const {gen, schemaCode: s, data} = cxt\n          gen.if(_`${s} !== undefined`)\n          cxt.pass(_`typeof ${s} == \"boolean\" && (${data} % 2 ? !${s} : ${s})`)\n        },\n        metaSchema: {type: \"boolean\"},\n      })\n      shouldBeInvalidSchema({\n        type: \"number\",\n        \"x-even-$data\": \"false\",\n      })\n    })\n\n    it('should fail if \"macro\" keyword definition has \"$data\" but no \"code\" or \"validate\"', () => {\n      should.throw(() => {\n        ajv.addKeyword({\n          keyword: \"even\",\n          type: \"number\",\n          $data: true,\n          macro: () => {\n            return {}\n          },\n        })\n      }, /\\$data keyword must have \"code\" or \"validate\" function/)\n    })\n\n    it(\"should support schemaType with $data\", () => {\n      testEvenKeyword$data({\n        keyword: \"x-even-$data\",\n        type: \"number\",\n        schemaType: \"boolean\",\n        $data: true,\n        validate: validateEven,\n      })\n\n      function validateEven(schema, data) {\n        return data % 2 ? !schema : schema\n      }\n    })\n  })\n\n  function testEvenKeyword(evenDefinition, numErrors = 1) {\n    instances.forEach((_ajv) => {\n      _ajv.addKeyword(evenDefinition)\n      const schema = {\n        type: [\"number\", \"string\"],\n        \"x-even\": true,\n      }\n      const validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, 2)\n      shouldBeValid(validate, \"abc\")\n      shouldBeInvalid(validate, 2.5, numErrors)\n      shouldBeInvalid(validate, 3, numErrors)\n    })\n  }\n\n  function testEvenKeyword$data(definition, numErrors = 1) {\n    instances.forEach((_ajv) => {\n      _ajv.addKeyword(definition)\n\n      let schema: any = {\n        type: [\"number\", \"string\"],\n        \"x-even-$data\": true,\n      }\n      let validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, 2)\n      shouldBeValid(validate, \"abc\")\n      shouldBeInvalid(validate, 2.5, numErrors)\n      shouldBeInvalid(validate, 3, numErrors)\n\n      schema = {\n        type: \"object\",\n        properties: {\n          data: {\n            type: [\"number\", \"string\"],\n            \"x-even-$data\": {$data: \"1/evenValue\"},\n          },\n          evenValue: {},\n        },\n      }\n      validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, {data: 2, evenValue: true})\n      shouldBeInvalid(validate, {data: 2, evenValue: false})\n      shouldBeValid(validate, {data: \"abc\", evenValue: true})\n      shouldBeValid(validate, {data: \"abc\", evenValue: false})\n      shouldBeInvalid(validate, {data: 2.5, evenValue: true})\n      shouldBeValid(validate, {data: 2.5, evenValue: false})\n      shouldBeInvalid(validate, {data: 3, evenValue: true})\n      shouldBeValid(validate, {data: 3, evenValue: false})\n\n      shouldBeInvalid(validate, {data: 2, evenValue: \"true\"})\n\n      // valid if the value of x-even-$data keyword is undefined\n      shouldBeValid(validate, {data: 2})\n      shouldBeValid(validate, {data: 3})\n    })\n  }\n\n  function testConstantKeyword(definition, numErrors?: number) {\n    instances.forEach((_ajv) => {\n      _ajv.addKeyword(definition)\n\n      const schema = {myConstant: \"abc\"}\n      const validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, \"abc\")\n      shouldBeInvalid(validate, 2, numErrors)\n      shouldBeInvalid(validate, {}, numErrors)\n    })\n  }\n\n  function testMultipleConstantKeyword(definition, numErrors?: number) {\n    instances.forEach((_ajv) => {\n      _ajv.addKeyword(definition)\n\n      const schema = {\n        type: [\"object\", \"array\"],\n        properties: {\n          a: {\"x-constant\": 1},\n          b: {\"x-constant\": 1},\n        },\n        additionalProperties: {\"x-constant\": {foo: \"bar\"}},\n        items: {\"x-constant\": {foo: \"bar\"}},\n      }\n      const validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, {a: 1, b: 1})\n      shouldBeInvalid(validate, {a: 2, b: 1}, numErrors)\n\n      shouldBeValid(validate, {a: 1, c: {foo: \"bar\"}})\n      shouldBeInvalid(validate, {a: 1, c: {foo: \"baz\"}}, numErrors)\n\n      shouldBeValid(validate, [{foo: \"bar\"}])\n      shouldBeValid(validate, [{foo: \"bar\"}, {foo: \"bar\"}])\n\n      shouldBeInvalid(validate, [1], numErrors)\n    })\n  }\n\n  function testRangeKeyword(definition, createsErrors?: boolean, numErrors?: number) {\n    instances.forEach((_ajv) => {\n      _ajv.addKeyword(definition)\n      _ajv.addKeyword({keyword: \"exclusiveRange\", schemaType: \"boolean\"})\n\n      let schema: SchemaObject = {\n        type: [\"number\", \"string\"],\n        \"x-range\": [2, 4],\n      }\n      let validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, 2)\n      shouldBeValid(validate, 3)\n      shouldBeValid(validate, 4)\n      shouldBeValid(validate, \"abc\")\n\n      shouldBeInvalid(validate, 1.99, numErrors)\n      if (createsErrors) {\n        shouldBeRangeError(validate.errors?.[0], \"\", \"#/x-range\", \">=\", 2)\n      }\n      shouldBeInvalid(validate, 4.01, numErrors)\n      if (createsErrors) {\n        shouldBeRangeError(validate.errors?.[0], \"\", \"#/x-range\", \"<=\", 4)\n      }\n\n      schema = {\n        type: \"object\",\n        properties: {\n          foo: {\n            type: [\"number\"],\n            \"x-range\": [2, 4],\n            exclusiveRange: true,\n          },\n        },\n      }\n      validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, {foo: 2.01})\n      shouldBeValid(validate, {foo: 3})\n      shouldBeValid(validate, {foo: 3.99})\n\n      shouldBeInvalid(validate, {foo: 2}, numErrors)\n      if (createsErrors) {\n        shouldBeRangeError(validate.errors?.[0], \"/foo\", \"#/properties/foo/x-range\", \">\", 2, true)\n      }\n      shouldBeInvalid(validate, {foo: 4}, numErrors)\n      if (createsErrors) {\n        shouldBeRangeError(validate.errors?.[0], \"/foo\", \"#/properties/foo/x-range\", \"<\", 4, true)\n      }\n    })\n  }\n\n  function testMultipleRangeKeyword(definition, numErrors?: number) {\n    instances.forEach((_ajv) => {\n      _ajv.opts.strictTypes = false\n      _ajv.addKeyword(definition)\n      _ajv.addKeyword({keyword: \"exclusiveRange\", schemaType: \"boolean\"})\n\n      const schema = {\n        properties: {\n          a: {type: \"number\", \"x-range\": [2, 4], exclusiveRange: true},\n          b: {type: \"number\", \"x-range\": [2, 4], exclusiveRange: false},\n        },\n        additionalProperties: {type: \"number\", \"x-range\": [5, 7]},\n        items: {type: \"number\", \"x-range\": [5, 7]},\n      }\n      const validate = _ajv.compile(schema)\n\n      shouldBeValid(validate, {a: 3.99, b: 4})\n      shouldBeInvalid(validate, {a: 4, b: 4}, numErrors)\n\n      shouldBeValid(validate, {a: 2.01, c: 7})\n      shouldBeInvalid(validate, {a: 2.01, c: 7.01}, numErrors)\n\n      shouldBeValid(validate, [5, 6, 7])\n      shouldBeInvalid(validate, [7.01], numErrors)\n    })\n  }\n\n  function shouldBeRangeError(\n    error,\n    instancePath,\n    schemaPath,\n    comparison,\n    limit,\n    exclusive?: boolean\n  ) {\n    delete error.schema\n    delete error.data\n    error.should.eql({\n      keyword: \"x-range\",\n      instancePath,\n      schemaPath,\n      message: \"should be \" + comparison + \" \" + limit,\n      params: {\n        comparison: comparison,\n        limit: limit,\n        exclusive: !!exclusive,\n      },\n    })\n  }\n\n  function validateRangeSchema(schema, parentSchema) {\n    const schemaValid =\n      Array.isArray(schema) &&\n      schema.length === 2 &&\n      typeof schema[0] == \"number\" &&\n      typeof schema[1] == \"number\"\n    if (!schemaValid) {\n      throw new Error(\"Invalid schema for range keyword, should be array of 2 numbers\")\n    }\n\n    const exclusiveRangeSchemaValid =\n      parentSchema.exclusiveRange === undefined || typeof parentSchema.exclusiveRange == \"boolean\"\n    if (!exclusiveRangeSchemaValid) {\n      throw new Error(\"Invalid schema for exclusiveRange keyword, should be boolean\")\n    }\n  }\n\n  function shouldBeValid(validate, data) {\n    validate(data).should.equal(true)\n    should.not.exist(validate.errors)\n  }\n\n  function shouldBeInvalid(validate, data, numErrors = 1) {\n    validate(data).should.equal(false)\n    validate.errors.should.have.length(numErrors)\n  }\n\n  function shouldBeInvalidSchema(\n    schema,\n    msg: string | RegExp = /keyword .+ value is invalid at path/\n  ) {\n    instances.forEach((_ajv) => {\n      should.throw(() => {\n        _ajv.compile(schema)\n      }, msg)\n    })\n  }\n\n  describe(\"addKeyword method\", () => {\n    const TEST_TYPES = [undefined, \"number\", \"string\", \"boolean\", [\"number\", \"string\"]]\n\n    it(\"should throw if defined keyword is passed\", () => {\n      testThrow([\"minimum\", \"maximum\", \"multipleOf\", \"minLength\", \"maxLength\"])\n      testThrowDuplicate(\"user-defined\")\n\n      function testThrow(keywords) {\n        TEST_TYPES.forEach((dataType, index) => {\n          should.throw(() => {\n            _addKeyword(keywords[index], dataType)\n          }, /already defined/)\n        })\n      }\n\n      function testThrowDuplicate(keywordPrefix) {\n        let index = 0\n        TEST_TYPES.forEach((dataType1) => {\n          TEST_TYPES.forEach((dataType2) => {\n            const keyword = keywordPrefix + index++\n            _addKeyword(keyword, dataType1)\n            should.throw(() => {\n              _addKeyword(keyword, dataType2)\n            }, /already defined/)\n          })\n        })\n      }\n    })\n\n    it(\"should throw if keyword is not a valid name\", () => {\n      should.not.throw(() => {\n        ajv.addKeyword(\"mykeyword\")\n      })\n\n      should.not.throw(() => {\n        ajv.addKeyword(\"hyphens-are-valid\")\n      })\n\n      should.not.throw(() => {\n        ajv.addKeyword(\"colons:are-valid\")\n      })\n\n      should.throw(() => {\n        ajv.addKeyword(\"single-'quote-not-valid\")\n      }, /invalid name/)\n\n      should.throw(() => {\n        ajv.addKeyword(\"3-start-with-number-not-valid\")\n      }, /invalid name/)\n\n      should.throw(() => {\n        ajv.addKeyword(\"-start-with-hyphen-not-valid\")\n      }, /invalid name/)\n\n      should.throw(() => {\n        ajv.addKeyword(\"spaces not valid\")\n      }, /invalid name/)\n    })\n\n    it(\"should return instance of itself\", () => {\n      const res = ajv.addKeyword(\"any\")\n      res.should.equal(ajv)\n    })\n\n    it(\"should throw if unknown type is passed\", () => {\n      should.throw(() => {\n        _addKeyword(\"user-defined1\", \"wrongtype\")\n      }, /type must be JSONType/)\n\n      should.throw(() => {\n        _addKeyword(\"user-defined2\", [\"number\", \"wrongtype\"])\n      }, /type must be JSONType/)\n\n      should.throw(() => {\n        _addKeyword(\"user-defined3\", [\"number\", undefined])\n      }, /type must be JSONType/)\n    })\n\n    it(\"should support old API addKeyword\", () => {\n      ajv = new _Ajv({logger: false})\n      //@ts-expect-error\n      ajv.addKeyword(\"min\", {\n        type: \"number\",\n        schemaType: \"number\",\n        validate: (schema, data) => data >= schema,\n      })\n      const validate = ajv.compile({\n        type: \"number\",\n        min: 0,\n      })\n      validate(1).should.equal(true)\n      validate(-1).should.equal(false)\n    })\n\n    function _addKeyword(keyword, dataType) {\n      ajv.addKeyword({\n        keyword,\n        type: dataType,\n        validate: () => true,\n      })\n    }\n  })\n\n  describe(\"getKeyword\", () => {\n    // TODO update this test\n    it(\"should return false for unknown keywords\", () => {\n      ajv.getKeyword(\"unknown\").should.equal(false)\n    })\n\n    // TODO change to account for pre-defined keywords with definitions\n    it(\"should return keyword definition\", () => {\n      const definition = {\n        keyword: \"mykeyword\",\n        validate: () => true,\n      }\n\n      ajv.addKeyword(definition)\n      const def = ajv.getKeyword(\"mykeyword\")\n      assert(typeof def == \"object\")\n      def.keyword.should.equal(\"mykeyword\")\n    })\n  })\n\n  describe(\"removeKeyword\", () => {\n    it(\"should remove and allow redefining keyword\", () => {\n      ajv = new _Ajv({strict: false})\n\n      ajv.addKeyword({\n        keyword: \"positive\",\n        type: \"number\",\n        validate: (_schema, data) => data > 0,\n      })\n\n      const schema = {type: \"number\", positive: true}\n\n      let validate = ajv.compile(schema)\n      validate(0).should.equal(false)\n      validate(1).should.equal(true)\n\n      should.throw(() => {\n        ajv.addKeyword({\n          keyword: \"positive\",\n          type: \"number\",\n          validate: function (_sch, data) {\n            return data >= 0\n          },\n        })\n      }, /already defined/)\n\n      ajv.removeKeyword(\"positive\")\n      ajv.removeSchema(schema)\n      validate = ajv.compile(schema)\n      validate(-1).should.equal(true)\n      ajv.removeSchema(schema)\n\n      ajv.addKeyword({\n        keyword: \"positive\",\n        type: \"number\",\n        validate: function (_sch, data) {\n          return data >= 0\n        },\n      })\n\n      validate = ajv.compile(schema)\n      validate(-1).should.equal(false)\n      validate(0).should.equal(true)\n      validate(1).should.equal(true)\n    })\n\n    it(\"should remove and allow redefining standard keyword\", () => {\n      ajv = new _Ajv({strict: false})\n\n      const schema = {minimum: 1}\n      let validate = ajv.compile(schema)\n      validate(0).should.equal(false)\n      validate(1).should.equal(true)\n      validate(2).should.equal(true)\n\n      ajv.removeKeyword(\"minimum\")\n      ajv.removeSchema(schema)\n\n      validate = ajv.compile(schema)\n      validate(0).should.equal(true)\n      validate(1).should.equal(true)\n      validate(2).should.equal(true)\n\n      ajv.addKeyword({\n        keyword: \"minimum\",\n        type: \"number\",\n        // make minimum exclusive\n        validate: (sch, data) => data > sch,\n      })\n      ajv.removeSchema(schema)\n\n      validate = ajv.compile(schema)\n      validate(0).should.equal(false)\n      validate(1).should.equal(false)\n      validate(2).should.equal(true)\n    })\n\n    it(\"should return instance of itself\", () => {\n      const res = ajv.addKeyword(\"any\").removeKeyword(\"any\")\n      res.should.equal(ajv)\n    })\n  })\n\n  describe(\"user-defined keywords mutating data\", () => {\n    it(\"should NOT update data without option modifying\", () => {\n      should.throw(() => {\n        testModifying(false)\n      }, /expected false to equal true/)\n    })\n\n    it(\"should update data with option modifying\", () => {\n      testModifying(true)\n    })\n\n    function testModifying(withOption) {\n      const collectionFormat = {\n        csv: function (data, {parentData, parentDataProperty}) {\n          parentData[parentDataProperty] = data.split(\",\")\n          return true\n        },\n      }\n\n      ajv.addKeyword({\n        keyword: \"collectionFormat\",\n        type: \"string\",\n        modifying: withOption,\n        compile: function (schema) {\n          return collectionFormat[schema]\n        },\n        metaSchema: {\n          enum: [\"csv\"],\n        },\n      })\n\n      const validate = ajv.compile({\n        type: \"object\",\n        properties: {\n          foo: {\n            allOf: [\n              {\n                type: \"string\",\n                collectionFormat: \"csv\",\n              },\n              {\n                type: \"array\",\n                items: {type: \"string\"},\n              },\n            ],\n          },\n        },\n        additionalProperties: false,\n      })\n\n      const obj: any = {foo: \"bar,baz,quux\"}\n\n      validate(obj).should.equal(true)\n      obj.should.eql({foo: [\"bar\", \"baz\", \"quux\"]})\n    }\n  })\n\n  describe('\"validate\" keywords with predefined validation result', () => {\n    it(\"should ignore result from validation function\", () => {\n      ajv.addKeyword({\n        keyword: \"pass\",\n        validate: () => false,\n        valid: true,\n      })\n\n      ajv.addKeyword({\n        keyword: \"fail\",\n        validate: () => true,\n        valid: false,\n      })\n\n      ajv.validate({pass: \"\"}, 1).should.equal(true)\n      ajv.validate({fail: \"\"}, 1).should.equal(false)\n    })\n  })\n\n  describe('\"dependencies\" in keyword definition', () => {\n    it(\"should require properties in the parent schema\", () => {\n      ajv.addKeyword({\n        keyword: \"allRequired\",\n        type: \"object\",\n        macro: (schema, parentSchema) =>\n          schema ? {required: Object.keys(parentSchema.properties)} : true,\n        schemaType: \"boolean\",\n        dependencies: [\"properties\"],\n      })\n\n      const invalidSchema = {\n        type: \"object\",\n        allRequired: true,\n      }\n\n      should.throw(() => {\n        ajv.compile(invalidSchema)\n      }, /parent schema must have dependencies of allRequired: properties/)\n\n      const schema = {\n        type: \"object\",\n        properties: {\n          foo: true,\n        },\n        allRequired: true,\n      }\n\n      const v = ajv.compile(schema)\n      v({foo: 1}).should.equal(true)\n      v({}).should.equal(false)\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/comment.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"$comment option\", () => {\n  describe(\"= true\", () => {\n    let logCalls: any[][]\n\n    function log(...args: any[]) {\n      logCalls.push(args)\n    }\n\n    const logger = {log, warn: log, error: log}\n\n    it(\"should log the text from $comment keyword\", () => {\n      const schema = {\n        $comment: \"object root\",\n        type: \"object\",\n        properties: {\n          foo: {$comment: \"property foo\"},\n          bar: {$comment: \"property bar\", type: \"integer\"},\n        },\n      }\n\n      const ajv = new _Ajv({$comment: true, logger})\n      const fullAjv = new _Ajv({allErrors: true, $comment: true, logger})\n\n      ;[ajv, fullAjv].forEach((_ajv) => {\n        const validate = _ajv.compile(schema)\n\n        test({}, true, [[\"object root\"]])\n        test({foo: 1}, true, [[\"object root\"], [\"property foo\"]])\n        test({foo: 1, bar: 2}, true, [[\"object root\"], [\"property foo\"], [\"property bar\"]])\n        test({foo: 1, bar: \"baz\"}, false, [[\"object root\"], [\"property foo\"], [\"property bar\"]])\n\n        function test(data, valid, expectedLogCalls) {\n          logCalls = []\n          validate(data).should.equal(valid)\n          logCalls.should.eql(expectedLogCalls)\n        }\n      })\n    })\n  })\n\n  describe(\"function hook\", () => {\n    let hookCalls\n\n    function hook(...args: any[]) {\n      hookCalls.push(Array.prototype.slice.call(args))\n    }\n\n    it(\"should pass the text from $comment keyword to the hook\", () => {\n      const schema = {\n        $comment: \"object root\",\n        type: \"object\",\n        properties: {\n          foo: {$comment: \"property foo\"},\n          bar: {$comment: \"property bar\", type: \"integer\"},\n        },\n      }\n\n      const ajv = new _Ajv({$comment: hook})\n      const fullAjv = new _Ajv({allErrors: true, $comment: hook})\n\n      ;[ajv, fullAjv].forEach((_ajv) => {\n        const validate = _ajv.compile(schema)\n\n        test({}, true, [[\"object root\", \"#/$comment\", schema]])\n        test({foo: 1}, true, [\n          [\"object root\", \"#/$comment\", schema],\n          [\"property foo\", \"#/properties/foo/$comment\", schema],\n        ])\n        test({foo: 1, bar: 2}, true, [\n          [\"object root\", \"#/$comment\", schema],\n          [\"property foo\", \"#/properties/foo/$comment\", schema],\n          [\"property bar\", \"#/properties/bar/$comment\", schema],\n        ])\n        test({foo: 1, bar: \"baz\"}, false, [\n          [\"object root\", \"#/$comment\", schema],\n          [\"property foo\", \"#/properties/foo/$comment\", schema],\n          [\"property bar\", \"#/properties/bar/$comment\", schema],\n        ])\n\n        function test(data, valid, expectedHookCalls) {\n          hookCalls = []\n          validate(data).should.equal(valid)\n          hookCalls.should.eql(expectedHookCalls)\n        }\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/int32range.spec.ts",
    "content": "import _AjvJTD from \"../ajv_jtd\"\nimport assert = require(\"assert\")\n\ndescribe(\"JTD int32range option\", function () {\n  this.timeout(10000)\n\n  describe(\"validation\", () => {\n    it(\"should limit range for int32 and uint32 types by default\", () => {\n      const ajv = new _AjvJTD()\n      const validateInt32 = ajv.compile({type: \"int32\"})\n      assert.strictEqual(validateInt32(-2147483648), true)\n      assert.strictEqual(validateInt32(-2147483649), false)\n      assert.strictEqual(validateInt32(2147483647), true)\n      assert.strictEqual(validateInt32(2147483648), false)\n      const validateUint32 = ajv.compile({type: \"uint32\"})\n      assert.strictEqual(validateUint32(0), true)\n      assert.strictEqual(validateUint32(-1), false)\n      assert.strictEqual(validateUint32(4294967295), true)\n      assert.strictEqual(validateUint32(4294967296), false)\n    })\n\n    it(\"should NOT limit range for int32 and uint32 types with int32range: false\", () => {\n      const ajv = new _AjvJTD({int32range: false})\n      const validateInt32 = ajv.compile({type: \"int32\"})\n      assert.strictEqual(validateInt32(-2147483648), true)\n      assert.strictEqual(validateInt32(-2147483649), true)\n      assert.strictEqual(validateInt32(Number.MIN_SAFE_INTEGER), true)\n      assert.strictEqual(validateInt32(2147483647), true)\n      assert.strictEqual(validateInt32(2147483648), true)\n      assert.strictEqual(validateInt32(Number.MAX_SAFE_INTEGER), true)\n      const validateUint32 = ajv.compile({type: \"uint32\"})\n      assert.strictEqual(validateUint32(0), true)\n      assert.strictEqual(validateUint32(-1), false)\n      assert.strictEqual(validateUint32(4294967295), true)\n      assert.strictEqual(validateUint32(4294967296), true)\n      assert.strictEqual(validateUint32(Number.MAX_SAFE_INTEGER), true)\n    })\n  })\n\n  describe(\"parsing\", () => {\n    it(\"should limit range for int32 and uint32 types by default\", () => {\n      const ajv = new _AjvJTD()\n      const parseInt32 = ajv.compileParser({type: \"int32\"})\n      assert.strictEqual(parseInt32(\"-2147483648\"), -2147483648)\n      assert.strictEqual(parseInt32(\"-2147483649\"), undefined)\n      assert.strictEqual(parseInt32(\"2147483647\"), 2147483647)\n      assert.strictEqual(parseInt32(\"2147483648\"), undefined)\n      const parseUint32 = ajv.compileParser({type: \"uint32\"})\n      assert.strictEqual(parseUint32(\"0\"), 0)\n      assert.strictEqual(parseUint32(\"-1\"), undefined)\n      assert.strictEqual(parseUint32(\"4294967295\"), 4294967295)\n      assert.strictEqual(parseUint32(\"4294967296\"), undefined)\n    })\n\n    it(\"should NOT limit range for int32 and uint32 types with int32range: false\", () => {\n      const ajv = new _AjvJTD({int32range: false})\n      const parseInt32 = ajv.compileParser({type: \"int32\"})\n      assert.strictEqual(parseInt32(\"-2147483648\"), -2147483648)\n      assert.strictEqual(parseInt32(\"-2147483649\"), -2147483649)\n      assert.strictEqual(parseInt32(\"\" + Number.MIN_SAFE_INTEGER), Number.MIN_SAFE_INTEGER)\n      assert.strictEqual(parseInt32(\"2147483647\"), 2147483647)\n      assert.strictEqual(parseInt32(\"2147483648\"), 2147483648)\n      assert.strictEqual(parseInt32(\"\" + Number.MAX_SAFE_INTEGER), Number.MAX_SAFE_INTEGER)\n      const parseUint32 = ajv.compileParser({type: \"uint32\"})\n      assert.strictEqual(parseUint32(\"0\"), 0)\n      assert.strictEqual(parseUint32(\"-1\"), undefined)\n      assert.strictEqual(parseUint32(\"4294967295\"), 4294967295)\n      assert.strictEqual(parseUint32(\"4294967296\"), 4294967296)\n      assert.strictEqual(parseUint32(\"\" + Number.MAX_SAFE_INTEGER), Number.MAX_SAFE_INTEGER)\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/meta_validateSchema.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"meta and validateSchema options\", () => {\n  it(\"should add draft-7 meta schema by default\", () => {\n    testOptionMeta(new _Ajv())\n    testOptionMeta(new _Ajv({meta: true}))\n\n    function testOptionMeta(ajv) {\n      ajv.getSchema(\"http://json-schema.org/draft-07/schema\").should.be.a(\"function\")\n      ajv.validateSchema({$id: \"ok\", type: \"integer\"}).should.equal(true)\n      ajv.validateSchema({$id: \"wrong\", type: 123}).should.equal(false)\n      should.not.throw(() => {\n        ajv.addSchema({$id: \"ok\", type: \"integer\"})\n      })\n      should.throw(() => {\n        ajv.addSchema({$id: \"wrong\", type: 123})\n      }, /schema is invalid/)\n    }\n  })\n\n  it(\"should throw if meta: false and validateSchema: true\", () => {\n    const ajv = new _Ajv({meta: false, logger: false})\n    should.not.exist(ajv.getSchema(\"http://json-schema.org/draft-07/schema\"))\n    should.not.throw(() => {\n      ajv.addSchema({type: \"wrong_type\"}, \"integer\")\n    })\n  })\n\n  it(\"should skip schema validation with validateSchema: false\", () => {\n    let ajv = new _Ajv()\n    should.throw(() => {\n      ajv.addSchema({type: 123}, \"integer\")\n    }, /schema is invalid/)\n\n    ajv = new _Ajv({validateSchema: false})\n    should.not.throw(() => {\n      ajv.addSchema({type: 123}, \"integer\")\n    })\n\n    ajv = new _Ajv({validateSchema: false, meta: false})\n    should.not.throw(() => {\n      ajv.addSchema({type: 123}, \"integer\")\n    })\n  })\n\n  describe('validateSchema: \"log\"', () => {\n    let loggedError, loggedWarning\n    const logger = {\n      log() {},\n      warn: () => (loggedWarning = true),\n      error: () => (loggedError = true),\n    }\n\n    beforeEach(() => {\n      loggedError = false\n      loggedWarning = false\n    })\n\n    it(\"should not throw on invalid schema\", () => {\n      const ajv = new _Ajv({validateSchema: \"log\", logger})\n      should.not.throw(() => {\n        ajv.addSchema({type: 123}, \"integer\")\n      })\n      loggedError.should.equal(true)\n      loggedWarning.should.equal(false)\n    })\n\n    it(\"should not throw on invalid schema with meta: false\", () => {\n      const ajv = new _Ajv({validateSchema: \"log\", meta: false, logger})\n      should.not.throw(() => {\n        ajv.addSchema({type: 123}, \"integer\")\n      })\n      loggedError.should.equal(false)\n      loggedWarning.should.equal(true)\n    })\n  })\n\n  it(\"should validate v6 schema\", () => {\n    const ajv = new _Ajv()\n    ajv.validateSchema({contains: {minimum: 2}}).should.equal(true)\n    ajv.validateSchema({contains: 2}).should.equal(false)\n  })\n\n  it(\"should use option meta as default meta schema\", () => {\n    const meta = {\n      $schema: \"http://json-schema.org/draft-07/schema\",\n      properties: {\n        myKeyword: {type: \"boolean\"},\n      },\n    }\n    let ajv = new _Ajv({meta: meta})\n    ajv.validateSchema({myKeyword: true}).should.equal(true)\n    ajv.validateSchema({myKeyword: 2}).should.equal(false)\n    ajv\n      .validateSchema({\n        $schema: \"http://json-schema.org/draft-07/schema\",\n        myKeyword: 2,\n      })\n      .should.equal(true)\n\n    ajv = new _Ajv()\n    ajv.validateSchema({myKeyword: true}).should.equal(true)\n    ajv.validateSchema({myKeyword: 2}).should.equal(true)\n  })\n})\n"
  },
  {
    "path": "spec/options/nullable.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"nullable keyword\", () => {\n  let ajv\n\n  beforeEach(() => {\n    ajv = new _Ajv()\n  })\n\n  it('should support keyword \"nullable\"', () => {\n    testNullable({\n      type: \"number\",\n      nullable: true,\n    })\n\n    testNullable({\n      type: [\"number\"],\n      nullable: true,\n    })\n\n    testNullable({\n      type: [\"number\", \"null\"],\n    })\n\n    testNullable({\n      type: [\"number\", \"null\"],\n      nullable: true,\n    })\n\n    testNotNullable({type: \"number\"})\n\n    testNotNullable({type: [\"number\"]})\n  })\n\n  it('should respect \"nullable\" == false', () => {\n    testNotNullable({\n      type: \"number\",\n      nullable: false,\n    })\n\n    testNotNullable({\n      type: [\"number\"],\n      nullable: false,\n    })\n  })\n\n  it(\"should throw if type includes null with nullable: false\", () => {\n    should.throw(() => {\n      ajv.compile({\n        type: [\"number\", \"null\"],\n        nullable: false,\n      })\n    }, \"type: null contradicts nullable: false\")\n  })\n\n  it(\"should throw if nullable is used without type\", () => {\n    should.throw(() => {\n      ajv.compile({\n        nullable: true,\n      })\n    }, '\"nullable\" cannot be used without \"type\"')\n  })\n\n  function testNullable(schema) {\n    const validate = ajv.compile(schema)\n    validate(1).should.equal(true)\n    validate(null).should.equal(true)\n    validate(\"1\").should.equal(false)\n  }\n\n  function testNotNullable(schema) {\n    const validate = ajv.compile(schema)\n    validate(1).should.equal(true)\n    validate(null).should.equal(false)\n    validate(\"1\").should.equal(false)\n  }\n})\n"
  },
  {
    "path": "spec/options/options_add_schemas.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"options to add schemas\", () => {\n  describe(\"schemas\", () => {\n    it(\"should add schemas from object\", () => {\n      const ajv = new _Ajv({\n        schemas: {\n          int: {type: \"integer\"},\n          str: {type: \"string\"},\n        },\n      })\n\n      ajv.validate(\"int\", 123).should.equal(true)\n      ajv.validate(\"int\", \"foo\").should.equal(false)\n      ajv.validate(\"str\", \"foo\").should.equal(true)\n      ajv.validate(\"str\", 123).should.equal(false)\n    })\n\n    it(\"should add schemas from array\", () => {\n      const ajv = new _Ajv({\n        schemas: [\n          {$id: \"int\", type: \"integer\"},\n          {$id: \"str\", type: \"string\"},\n          {\n            $id: \"obj\",\n            type: \"object\",\n            properties: {\n              int: {$ref: \"int\"},\n              str: {$ref: \"str\"},\n            },\n          },\n        ],\n      })\n\n      ajv.validate(\"obj\", {int: 123, str: \"foo\"}).should.equal(true)\n      ajv.validate(\"obj\", {int: \"foo\", str: \"bar\"}).should.equal(false)\n      ajv.validate(\"obj\", {int: 123, str: 456}).should.equal(false)\n    })\n  })\n\n  describe(\"addUsedSchema\", () => {\n    ;[true, undefined].forEach((optionValue) => {\n      describe(\"= \" + optionValue, () => {\n        let ajv\n\n        beforeEach(() => {\n          ajv = new _Ajv({addUsedSchema: optionValue})\n        })\n\n        describe(\"compile and validate\", () => {\n          it(\"should add schema\", () => {\n            let schema = {$id: \"str\", type: \"string\"}\n            const validate = ajv.compile(schema)\n            validate(\"abc\").should.equal(true)\n            validate(1).should.equal(false)\n            ajv.getSchema(\"str\").should.equal(validate)\n\n            schema = {$id: \"int\", type: \"integer\"}\n            ajv.validate(schema, 1).should.equal(true)\n            ajv.validate(schema, \"abc\").should.equal(false)\n            ajv.getSchema(\"int\").should.be.a(\"function\")\n          })\n\n          it(\"should throw with duplicate ID\", () => {\n            ajv.compile({$id: \"str\", type: \"string\"})\n            should.throw(() => {\n              ajv.compile({$id: \"str\", type: \"string\", minLength: 2})\n            }, /already exists/)\n\n            const schema = {$id: \"int\", type: \"integer\"}\n            const schema2 = {$id: \"int\", type: \"integer\", minimum: 0}\n            ajv.validate(schema, 1).should.equal(true)\n            should.throw(() => {\n              ajv.validate(schema2, 1)\n            }, /already exists/)\n          })\n        })\n      })\n    })\n\n    describe(\"= false\", () => {\n      let ajv\n\n      beforeEach(() => {\n        ajv = new _Ajv({addUsedSchema: false})\n      })\n\n      describe(\"compile and validate\", () => {\n        it(\"should NOT add schema\", () => {\n          let schema = {$id: \"str\", type: \"string\"}\n          const validate = ajv.compile(schema)\n          validate(\"abc\").should.equal(true)\n          validate(1).should.equal(false)\n          should.equal(ajv.getSchema(\"str\"), undefined)\n\n          schema = {$id: \"int\", type: \"integer\"}\n          ajv.validate(schema, 1).should.equal(true)\n          ajv.validate(schema, \"abc\").should.equal(false)\n          should.equal(ajv.getSchema(\"int\"), undefined)\n        })\n\n        it(\"should NOT throw with duplicate ID\", () => {\n          ajv.compile({$id: \"str\", type: \"string\"})\n          should.not.throw(() => {\n            ajv.compile({$id: \"str\", type: \"string\", minLength: 2})\n          })\n\n          const schema = {$id: \"int\", type: \"integer\"}\n          const schema2 = {$id: \"int\", type: \"integer\", minimum: 0}\n          ajv.validate(schema, 1).should.equal(true)\n          should.not.throw(() => {\n            ajv.validate(schema2, 1).should.equal(true)\n          })\n        })\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/options_code.spec.ts",
    "content": "import type Ajv from \"../..\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"code generation options\", () => {\n  describe(\"sourceCode\", () => {\n    describe(\"= true\", () => {\n      it(\"should add source.code property\", () => {\n        test(new _Ajv({code: {source: true}}))\n\n        function test(ajv) {\n          const validate = ajv.compile({type: \"number\"})\n          validate.source.validateCode.should.be.a(\"string\")\n        }\n      })\n    })\n\n    describe(\"= false and default\", () => {\n      it(\"should not add source property\", () => {\n        test(new _Ajv())\n        test(new _Ajv({code: {source: false}}))\n\n        function test(ajv: Ajv) {\n          const validate = ajv.compile({type: \"number\"})\n          should.not.exist(validate.source)\n        }\n      })\n    })\n  })\n\n  describe(\"processCode\", () => {\n    it(\"should process generated code\", () => {\n      const ajv = new _Ajv()\n      let validate = ajv.compile({type: \"string\"})\n      // TODO re-enable this test when option to strip whitespace is added\n      // validate.toString().split(\"\\n\").length.should.equal(1)\n      const unprocessedLines = validate.toString().split(\"\\n\").length\n\n      const beautify = require(\"js-beautify\").js_beautify\n      const ajvPC = new _Ajv({code: {process: beautify}})\n      validate = ajvPC.compile({type: \"string\"})\n      validate.toString().split(\"\\n\").length.should.be.above(unprocessedLines)\n      validate(\"foo\").should.equal(true)\n      validate(1).should.equal(false)\n    })\n  })\n\n  describe(\"passContext option\", () => {\n    let ajv: Ajv, contexts: any[]\n\n    beforeEach(() => {\n      contexts = []\n    })\n\n    describe(\"= true\", () => {\n      it(\"should pass this value as context to user-defined keyword validation function\", () => {\n        const validate = getValidate(true)\n        const self = {}\n        validate.call(self, {})\n        contexts.should.have.length(4)\n        contexts.forEach((ctx) => ctx.should.equal(self))\n      })\n    })\n\n    describe(\"= false\", () => {\n      it(\"should pass ajv instance as context to user-defined keyword validation function\", () => {\n        const validate = getValidate(false)\n        const self = {}\n        validate.call(self, {})\n        contexts.should.have.length(4)\n        contexts.forEach((ctx) => ctx.should.equal(ajv))\n      })\n    })\n\n    function getValidate(passContext) {\n      ajv = new _Ajv({passContext: passContext, inlineRefs: false})\n      ajv.addKeyword({keyword: \"testValidate\", validate: storeContext})\n      ajv.addKeyword({keyword: \"testCompile\", compile: compileTestValidate})\n\n      const schema = {\n        definitions: {\n          test1: {\n            testValidate: true,\n            testCompile: true,\n          },\n          test2: {\n            allOf: [{$ref: \"#/definitions/test1\"}],\n          },\n        },\n        allOf: [{$ref: \"#/definitions/test1\"}, {$ref: \"#/definitions/test2\"}],\n      }\n\n      return ajv.compile(schema)\n    }\n\n    function storeContext(this: any) {\n      contexts.push(this)\n      return true\n    }\n\n    function compileTestValidate() {\n      return storeContext\n    }\n  })\n\n  describe(\"loopEnum option\", () => {\n    it(\"should use loop if more values than specified\", () => {\n      const ajv1 = new _Ajv()\n      const ajv2 = new _Ajv({loopEnum: 2})\n      test(ajv1, {enum: [\"foo\", \"bar\"]})\n      test(ajv2, {enum: [\"foo\", \"bar\"]})\n      test(ajv1, {enum: [\"foo\", \"bar\", \"baz\"]})\n      test(ajv2, {enum: [\"foo\", \"bar\", \"baz\"]})\n\n      function test(ajv, schema) {\n        ajv.validate(schema, \"foo\").should.equal(true)\n        ajv.validate(schema, \"boo\").should.equal(false)\n        ajv.validate(schema, 1).should.equal(false)\n      }\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/options_refs.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport type {Options} from \"../..\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"referenced schema options\", () => {\n  describe(\"ignoreKeywordsWithRef\", () => {\n    describe(\"= undefined\", () => {\n      it(\"should allow extending $ref with other keywords\", () => {\n        test({}, true)\n      })\n\n      it(\"should NOT log warning\", () => {\n        testWarning()\n      })\n    })\n\n    describe(\"= true\", () => {\n      it(\"should ignore other keywords when $ref is used\", () => {\n        test({ignoreKeywordsWithRef: true, logger: false}, false)\n      })\n\n      it(\"should log warning when other keywords are used with $ref\", () => {\n        testWarning({ignoreKeywordsWithRef: true}, /keywords\\signored/)\n      })\n    })\n\n    function test(opts: Options, shouldExtendRef: boolean) {\n      const ajv = new _Ajv(opts)\n      const schema = {\n        definitions: {\n          int: {type: \"integer\"},\n        },\n        type: \"number\",\n        $ref: \"#/definitions/int\",\n        minimum: 10,\n      }\n\n      let validate = ajv.compile(schema)\n      validate(10).should.equal(true)\n      validate(1).should.equal(!shouldExtendRef)\n\n      const schema1 = {\n        definitions: {\n          int: {type: \"integer\"},\n        },\n        type: \"object\",\n        properties: {\n          foo: {\n            $ref: \"#/definitions/int\",\n            type: \"number\",\n            minimum: 10,\n          },\n          bar: {\n            type: \"number\",\n            allOf: [{$ref: \"#/definitions/int\"}, {minimum: 10}],\n          },\n        },\n      }\n\n      validate = ajv.compile(schema1)\n      validate({foo: 10, bar: 10}).should.equal(true)\n      validate({foo: 1, bar: 10}).should.equal(!shouldExtendRef)\n      validate({foo: 10, bar: 1}).should.equal(false)\n    }\n\n    function testWarning(opts: Options = {}, msgPattern?: RegExp) {\n      let oldConsole\n      try {\n        oldConsole = console.warn\n        let consoleMsg\n        console.warn = function (...args: any[]) {\n          consoleMsg = Array.prototype.join.call(args, \" \")\n        }\n\n        const ajv = new _Ajv(opts)\n\n        const schema = {\n          definitions: {\n            int: {type: \"integer\"},\n          },\n          type: \"number\",\n          $ref: \"#/definitions/int\",\n          minimum: 10,\n        }\n\n        ajv.compile(schema)\n        if (msgPattern) consoleMsg.should.match(msgPattern)\n        else should.not.exist(consoleMsg)\n      } finally {\n        console.warn = oldConsole\n      }\n    }\n  })\n\n  describe(\"missingRefs\", () => {\n    it(\"should throw if ref is missing without this option\", () => {\n      const ajv = new _Ajv()\n      should.throw(() => {\n        ajv.compile({$ref: \"missing_reference\"})\n      }, /can't resolve reference missing_reference/)\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/options_reporting.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"reporting options\", () => {\n  describe(\"verbose\", () => {\n    it(\"should add schema, parentSchema and data to errors with verbose option == true\", () => {\n      testVerbose(new _Ajv({verbose: true}))\n      testVerbose(new _Ajv({verbose: true, allErrors: true}))\n\n      function testVerbose(ajv) {\n        const schema = {\n          type: \"object\",\n          properties: {\n            foo: {type: \"number\", minimum: 5},\n          },\n        }\n        const validate = ajv.compile(schema)\n\n        const data = {foo: 3}\n        validate(data).should.equal(false)\n        validate.errors.should.have.length(1)\n        const err = validate.errors[0]\n\n        should.equal(err.schema, 5)\n        err.parentSchema.should.eql({type: \"number\", minimum: 5})\n        err.parentSchema.should.equal(schema.properties.foo) // by reference\n        should.equal(err.data, 3)\n      }\n    })\n  })\n\n  describe(\"allErrors\", () => {\n    it('should be disabled inside \"not\" keyword', () => {\n      test(new _Ajv(), false)\n      test(new _Ajv({allErrors: true}), true)\n\n      function test(ajv, allErrors) {\n        let format1called = false,\n          format2called = false\n\n        ajv.addFormat(\"format1\", () => {\n          format1called = true\n          return false\n        })\n\n        ajv.addFormat(\"format2\", () => {\n          format2called = true\n          return false\n        })\n\n        const schema1 = {\n          type: \"string\",\n          allOf: [{format: \"format1\"}, {format: \"format2\"}],\n        }\n\n        ajv.validate(schema1, \"abc\").should.equal(false)\n        ajv.errors.should.have.length(allErrors ? 2 : 1)\n        format1called.should.equal(true)\n        format2called.should.equal(allErrors)\n\n        const schema2 = {\n          not: schema1,\n        }\n\n        format1called = format2called = false\n        ajv.validate(schema2, \"abc\").should.equal(true)\n        should.equal(ajv.errors, null)\n        format1called.should.equal(true)\n        format2called.should.equal(false)\n      }\n    })\n  })\n\n  describe(\"logger\", () => {\n    /**\n     * The logger option tests are based on the meta scenario which writes into the logger.warn\n     */\n\n    const origConsoleWarn = console.warn\n    let consoleCalled\n\n    beforeEach(() => {\n      consoleCalled = false\n      console.warn = () => (consoleCalled = true)\n    })\n\n    afterEach(() => {\n      console.warn = origConsoleWarn\n    })\n\n    it(\"no user-defined logger is given - global console should be used\", () => {\n      const ajv = new _Ajv({meta: false})\n\n      ajv.compile({\n        type: \"number\",\n        minimum: 1,\n      })\n\n      should.equal(consoleCalled, true)\n    })\n\n    it(\"user-defined logger is an object - logs should only report to it\", () => {\n      let loggerCalled = false\n\n      const logger = {\n        warn: log,\n        log: log,\n        error: log,\n      }\n\n      const ajv = new _Ajv({\n        meta: false,\n        logger: logger,\n      })\n\n      ajv.compile({\n        type: \"number\",\n        minimum: 1,\n      })\n\n      should.equal(loggerCalled, true)\n      should.equal(consoleCalled, false)\n\n      function log() {\n        loggerCalled = true\n      }\n    })\n\n    it(\"logger option is false - no logs should be reported\", () => {\n      const ajv = new _Ajv({\n        meta: false,\n        logger: false,\n      })\n\n      ajv.compile({\n        type: \"number\",\n        minimum: 1,\n      })\n\n      should.equal(consoleCalled, false)\n    })\n\n    it(\"logger option is an object without required methods - an error should be thrown\", () => {\n      const opts: any = {\n        meta: false,\n        logger: {},\n      }\n      ;(() => new _Ajv(opts)).should.throw(\n        Error,\n        /logger must implement log, warn and error methods/\n      )\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/options_validation.spec.ts",
    "content": "import type Ajv from \"../..\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\nconst DATE_FORMAT = /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/\n\ndescribe(\"validation options\", () => {\n  describe(\"format\", () => {\n    it(\"should not validate formats if option format == false\", () => {\n      const ajv = new _Ajv({formats: {date: DATE_FORMAT}}),\n        ajvFF = new _Ajv({formats: {date: DATE_FORMAT}, validateFormats: false})\n\n      const schema = {type: \"string\", format: \"date\"}\n      const invalideDateTime = \"06/19/1963\" // expects hyphens\n\n      ajv.validate(schema, invalideDateTime).should.equal(false)\n      ajvFF.validate(schema, invalideDateTime).should.equal(true)\n    })\n  })\n\n  describe(\"formats\", () => {\n    it(\"should add formats from options\", () => {\n      const ajv = new _Ajv({\n        allowUnionTypes: true,\n        formats: {\n          identifier: /^[a-z_$][a-z0-9_$]*$/i,\n        },\n      })\n\n      const validate = ajv.compile({\n        type: [\"string\", \"number\"],\n        format: \"identifier\",\n      })\n\n      validate(\"Abc1\").should.equal(true)\n      validate(\"foo bar\").should.equal(false)\n      validate(\"123\").should.equal(false)\n      validate(123).should.equal(true)\n    })\n  })\n\n  describe(\"keywords\", () => {\n    it(\"should add keywords from options\", () => {\n      const ajv = new _Ajv({\n        allowUnionTypes: true,\n        keywords: [\n          {\n            keyword: \"identifier\",\n            type: \"string\",\n            validate: function (_schema, data) {\n              return /^[a-z_$][a-z0-9_$]*$/i.test(data)\n            },\n          },\n        ],\n      })\n\n      testKeyword(ajv)\n    })\n\n    it(\"should support old keywords option as map\", () => {\n      const ajv = new _Ajv({\n        allowUnionTypes: true,\n        keywords: {\n          //@ts-expect-error\n          identifier: {\n            type: \"string\",\n            schema: false,\n            validate: function (data: string) {\n              return /^[a-z_$][a-z0-9_$]*$/i.test(data)\n            },\n          },\n        },\n        logger: false,\n      })\n\n      testKeyword(ajv)\n    })\n\n    function testKeyword(ajv: Ajv) {\n      const validate = ajv.compile({\n        type: [\"string\", \"number\"],\n        identifier: true,\n      })\n\n      validate(\"Abc1\").should.equal(true)\n      validate(\"foo bar\").should.equal(false)\n      validate(\"123\").should.equal(false)\n      validate(123).should.equal(true)\n    }\n  })\n\n  describe(\"unicode\", () => {\n    it(\"should use String.prototype.length with deprecated unicode option == false\", () => {\n      const ajvUnicode = new _Ajv()\n      testUnicode(new _Ajv({unicode: false, logger: false}))\n      testUnicode(new _Ajv({unicode: false, allErrors: true, logger: false}))\n\n      function testUnicode(ajv: Ajv) {\n        let validateWithUnicode = ajvUnicode.compile({type: \"string\", minLength: 2})\n        let validate = ajv.compile({type: \"string\", minLength: 2})\n\n        validateWithUnicode(\"😀\").should.equal(false)\n        validate(\"😀\").should.equal(true)\n\n        validateWithUnicode = ajvUnicode.compile({type: \"string\", maxLength: 1})\n        validate = ajv.compile({type: \"string\", maxLength: 1})\n\n        validateWithUnicode(\"😀\").should.equal(true)\n        validate(\"😀\").should.equal(false)\n      }\n    })\n  })\n\n  describe(\"multipleOfPrecision\", () => {\n    it(\"should allow for some deviation from 0 when validating multipleOf with value < 1\", () => {\n      test(new _Ajv({multipleOfPrecision: 7}))\n      test(new _Ajv({multipleOfPrecision: 7, allErrors: true}))\n\n      function test(ajv) {\n        let schema = {type: \"number\", multipleOf: 0.01}\n        let validate = ajv.compile(schema)\n\n        validate(4.18).should.equal(true)\n        validate(4.181).should.equal(false)\n\n        schema = {type: \"number\", multipleOf: 0.0000001}\n        validate = ajv.compile(schema)\n\n        validate(53.198098).should.equal(true)\n        validate(53.1980981).should.equal(true)\n        validate(53.19809811).should.equal(false)\n      }\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/ownProperties.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport type Ajv from \"../..\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"ownProperties option\", () => {\n  let ajv: Ajv, ajvOP: Ajv, ajvOP1: Ajv\n\n  beforeEach(() => {\n    ajv = new _Ajv({allErrors: true})\n    ajvOP = new _Ajv({ownProperties: true, allErrors: true})\n    ajvOP1 = new _Ajv({ownProperties: true})\n  })\n\n  it(\"should only validate own properties with additionalProperties\", () => {\n    const schema = {\n      type: \"object\",\n      properties: {a: {type: \"number\"}},\n      additionalProperties: false,\n    }\n\n    const obj = {a: 1}\n    const proto = {b: 2}\n    test(schema, obj, proto)\n  })\n\n  it(\"should only validate own properties with properties keyword\", () => {\n    const schema = {\n      type: \"object\",\n      properties: {\n        a: {type: \"number\"},\n        b: {type: \"number\"},\n      },\n    }\n\n    const obj = {a: 1}\n    const proto = {b: \"not a number\"}\n    test(schema, obj, proto)\n  })\n\n  it(\"should only validate own properties with required keyword\", () => {\n    const schema = {\n      type: \"object\",\n      required: [\"a\", \"b\"],\n    }\n\n    const obj = {a: 1}\n    const proto = {b: 2}\n    test(schema, obj, proto, 1, true)\n  })\n\n  it(\"should only validate own properties with required keyword - many properties\", () => {\n    ajv = new _Ajv({allErrors: true, loopRequired: 1})\n    ajvOP = new _Ajv({ownProperties: true, allErrors: true, loopRequired: 1})\n    ajvOP1 = new _Ajv({ownProperties: true, loopRequired: 1})\n\n    const schema = {\n      type: \"object\",\n      required: [\"a\", \"b\", \"c\", \"d\"],\n    }\n\n    const obj = {a: 1, b: 2}\n    const proto = {c: 3, d: 4}\n    test(schema, obj, proto, 2, true)\n  })\n\n  it(\"should only validate own properties with required keyword as $data\", () => {\n    ajv = new _Ajv({allErrors: true, $data: true})\n    ajvOP = new _Ajv({ownProperties: true, allErrors: true, $data: true})\n    ajvOP1 = new _Ajv({ownProperties: true, $data: true})\n\n    const schema = {\n      type: \"object\",\n      required: {$data: \"0/req\"},\n      properties: {\n        req: {\n          type: \"array\",\n          items: {type: \"string\"},\n        },\n      },\n    }\n\n    const obj = {\n      req: [\"a\", \"b\"],\n      a: 1,\n    }\n    const proto = {b: 2}\n    test(schema, obj, proto, 1, true)\n  })\n\n  it(\"should only validate own properties with properties and required keyword\", () => {\n    const schema = {\n      type: \"object\",\n      properties: {\n        a: {type: \"number\"},\n        b: {type: \"number\"},\n      },\n      required: [\"a\", \"b\"],\n    }\n\n    const obj = {a: 1}\n    const proto = {b: 2}\n    test(schema, obj, proto, 1, true)\n  })\n\n  it(\"should only validate own properties with dependencies keyword\", () => {\n    const schema = {\n      type: \"object\",\n      dependencies: {\n        a: [\"c\"],\n        b: [\"d\"],\n      },\n    }\n\n    const obj = {a: 1, c: 3}\n    const proto = {b: 2}\n    test(schema, obj, proto)\n\n    const obj1 = {a: 1, b: 2, c: 3}\n    const proto1 = {d: 4}\n    test(schema, obj1, proto1, 1, true)\n  })\n\n  it(\"should only validate own properties with schema dependencies\", () => {\n    const schema = {\n      type: \"object\",\n      dependencies: {\n        a: {not: {required: [\"c\"]}},\n        b: {not: {required: [\"d\"]}},\n      },\n    }\n\n    const obj = {a: 1, d: 3}\n    const proto = {b: 2}\n    test(schema, obj, proto)\n\n    const obj1 = {a: 1, b: 2}\n    const proto1 = {d: 4}\n    test(schema, obj1, proto1)\n  })\n\n  it(\"should only validate own properties with patternProperties\", () => {\n    const schema = {\n      type: \"object\",\n      patternProperties: {\"f.*o\": {type: \"integer\"}},\n    }\n\n    const obj = {fooo: 1}\n    const proto = {foo: \"not a number\"}\n    test(schema, obj, proto)\n  })\n\n  it(\"should only validate own properties with propertyNames\", () => {\n    const schema = {\n      type: \"object\",\n      propertyNames: {\n        pattern: \"foo\",\n      },\n    }\n\n    const obj = {foo: 2}\n    const proto = {bar: 1}\n    test(schema, obj, proto, 2)\n  })\n\n  function test(schema, obj, proto, errors = 1, reverse?: boolean) {\n    const validate = ajv.compile(schema)\n    const validateOP = ajvOP.compile(schema)\n    const validateOP1 = ajvOP1.compile(schema)\n    const data = Object.create(proto)\n    for (const key in obj) data[key] = obj[key]\n\n    if (reverse) {\n      validate(data).should.equal(true)\n      validateOP(data).should.equal(false)\n      validateOP.errors?.should.have.length(errors)\n      validateOP1(data).should.equal(false)\n      validateOP1.errors?.should.have.length(1)\n    } else {\n      validate(data).should.equal(false)\n      validate.errors?.should.have.length(errors)\n      validateOP(data).should.equal(true)\n      validateOP1(data).should.equal(true)\n    }\n  }\n})\n"
  },
  {
    "path": "spec/options/removeAdditional.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"removeAdditional option\", () => {\n  it(\"should remove all additional properties\", () => {\n    const ajv = new _Ajv({removeAdditional: \"all\"})\n\n    ajv.addSchema({\n      $id: \"//test/fooBar\",\n      type: \"object\",\n      properties: {foo: {type: \"string\"}, bar: {type: \"string\"}},\n    })\n\n    const object = {\n      foo: \"foo\",\n      bar: \"bar\",\n      baz: \"baz-to-be-removed\",\n    }\n\n    ajv.validate(\"//test/fooBar\", object).should.equal(true)\n    object.should.have.property(\"foo\")\n    object.should.have.property(\"bar\")\n    object.should.not.have.property(\"baz\")\n  })\n\n  it(\"should remove properties that would error when `additionalProperties = false`\", () => {\n    const ajv = new _Ajv({removeAdditional: true})\n\n    ajv.addSchema({\n      $id: \"//test/fooBar\",\n      type: \"object\",\n      properties: {foo: {type: \"string\"}, bar: {type: \"string\"}},\n      additionalProperties: false,\n    })\n\n    const object = {\n      foo: \"foo\",\n      bar: \"bar\",\n      baz: \"baz-to-be-removed\",\n    }\n\n    ajv.validate(\"//test/fooBar\", object).should.equal(true)\n    object.should.have.property(\"foo\")\n    object.should.have.property(\"bar\")\n    object.should.not.have.property(\"baz\")\n  })\n\n  it(\"should remove properties that would error when `additionalProperties = false` (many properties, boolean schema)\", () => {\n    const ajv = new _Ajv({removeAdditional: true})\n\n    const schema = {\n      type: \"object\",\n      properties: {\n        obj: {\n          type: \"object\",\n          additionalProperties: false,\n          properties: {\n            a: {type: \"string\"},\n            b: false,\n            c: {type: \"string\"},\n            d: {type: \"string\"},\n            e: {type: \"string\"},\n            f: {type: \"string\"},\n            g: {type: \"string\"},\n            h: {type: \"string\"},\n            i: {type: \"string\"},\n          },\n        },\n      },\n    }\n\n    const data = {\n      obj: {\n        a: \"valid\",\n        b: \"should not be removed\",\n        additional: \"will be removed\",\n      },\n    }\n\n    ajv.validate(schema, data).should.equal(false)\n    data.should.eql({\n      obj: {\n        a: \"valid\",\n        b: \"should not be removed\",\n      },\n    })\n  })\n\n  it(\"should remove properties that would error when `additionalProperties` is a schema\", () => {\n    const ajv = new _Ajv({removeAdditional: \"failing\"})\n\n    ajv.addSchema({\n      $id: \"//test/fooBar\",\n      type: \"object\",\n      properties: {foo: {type: \"string\"}, bar: {type: \"string\"}},\n      additionalProperties: {type: \"string\"},\n    })\n\n    const object = {\n      foo: \"foo\",\n      bar: \"bar\",\n      baz: \"baz-to-be-kept\",\n      fizz: 1000,\n    }\n\n    ajv.validate(\"//test/fooBar\", object).should.equal(true)\n    object.should.have.property(\"foo\")\n    object.should.have.property(\"bar\")\n    object.should.have.property(\"baz\")\n    object.should.not.have.property(\"fizz\")\n\n    ajv.addSchema({\n      $id: \"//test/fooBar2\",\n      type: \"object\",\n      properties: {foo: {type: \"string\"}, bar: {type: \"string\"}},\n      additionalProperties: {type: \"string\", pattern: \"^to-be-\", maxLength: 10},\n    })\n\n    const object1 = {\n      foo: \"foo\",\n      bar: \"bar\",\n      baz: \"to-be-kept\",\n      quux: \"to-be-removed\",\n      fizz: 1000,\n    }\n\n    ajv.validate(\"//test/fooBar2\", object1).should.equal(true)\n    object1.should.have.property(\"foo\")\n    object1.should.have.property(\"bar\")\n    object1.should.have.property(\"baz\")\n    object1.should.not.have.property(\"fizz\")\n  })\n})\n"
  },
  {
    "path": "spec/options/schemaId.spec.ts",
    "content": "import type Ajv from \"../..\"\nimport _Ajv from \"../ajv\"\nimport assert = require(\"assert\")\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"removed schemaId option\", () => {\n  it(\"should use $id and throw exception when id is used\", () => {\n    test(new _Ajv({logger: false}))\n\n    function test(ajv) {\n      ajv.addSchema({$id: \"mySchema1\", type: \"string\"})\n      const validate = ajv.getSchema(\"mySchema1\")\n      validate(\"foo\").should.equal(true)\n      validate(1).should.equal(false)\n\n      should.throw(\n        () => ajv.compile({id: \"mySchema2\", type: \"string\"}),\n        /NOT SUPPORTED: keyword \"id\"/\n      )\n    }\n  })\n\n  it(\"should use $id and throw exception for id when strict: false\", () => {\n    test(new _Ajv({logger: false, strict: false}))\n\n    function test(ajv: Ajv) {\n      ajv.addSchema({$id: \"mySchema1\", type: \"string\"})\n      const validate = ajv.getSchema(\"mySchema1\")\n      assert(typeof validate == \"function\")\n      validate(\"foo\").should.equal(true)\n      validate(1).should.equal(false)\n\n      should.throw(\n        () => ajv.compile({id: \"mySchema2\", type: \"string\"}),\n        /NOT SUPPORTED: keyword \"id\"/\n      )\n      should.not.exist(ajv.getSchema(\"mySchema2\"))\n    }\n  })\n})\n"
  },
  {
    "path": "spec/options/strict.spec.ts",
    "content": "import type {JSONSchemaType} from \"../..\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"strict mode\", () => {\n  describe(\n    '\"additionalItems\" without \"items\"',\n    testStrictMode({type: \"array\", additionalItems: false}, /additionalItems/)\n  )\n\n  describe('\"if\" without \"then\" and \"else\"', testStrictMode({if: true}, /if.*then.*else/))\n\n  describe('\"then\" without \"if\"', testStrictMode({then: true}, /then.*if/))\n\n  describe('\"else\" without \"if\"', testStrictMode({else: true}, /else.*if/))\n\n  describe(\n    '\"properties\" matching \"patternProperties\"',\n    testStrictMode(\n      {\n        type: \"object\",\n        properties: {foo: false},\n        patternProperties: {foo: false},\n      },\n      /property.*pattern/\n    )\n  )\n\n  describe('option allowMatchingProperties to allow \"properties\" matching \"patternProperties\"', () => {\n    it(\"should NOT throw an error or log a warning\", () => {\n      const output: any = {}\n      const ajv = new _Ajv({\n        allowMatchingProperties: true,\n        logger: getLogger(output),\n      })\n      const schema = {\n        type: \"object\",\n        properties: {foo: false},\n        patternProperties: {foo: false},\n      }\n      ajv.compile(schema)\n      should.not.exist(output.warning)\n    })\n  })\n\n  describe(\"strictTypes option\", () => {\n    const ajv = new _Ajv({strictTypes: true})\n    const ajvUT = new _Ajv({strictTypes: true, allowUnionTypes: true})\n\n    describe(\"multiple/union types\", () => {\n      it(\"should prohibit multiple types\", () => {\n        should.throw(() => {\n          ajv.compile({type: [\"number\", \"string\"]})\n        }, /use allowUnionTypes to allow union type/)\n      })\n\n      it(\"should allow multiple types with option allowUnionTypes\", () => {\n        should.not.throw(() => {\n          ajvUT.compile({type: [\"number\", \"string\"]})\n        })\n      })\n\n      it(\"should allow nullable\", () => {\n        should.not.throw(() => {\n          ajv.compile({type: [\"number\", \"null\"]})\n          ajv.compile({type: [\"number\"], nullable: true})\n        })\n      })\n    })\n\n    describe(\"contradictory types\", () => {\n      it(\"should prohibit contradictory types\", () => {\n        should.throw(() => {\n          ajv.compile({\n            type: \"object\",\n            anyOf: [{type: \"object\"}, {type: \"array\"}],\n          })\n        }, /type \"array\" not allowed by context \"object\"/)\n      })\n\n      it(\"should allow narrowing types\", () => {\n        should.not.throw(() => {\n          ajvUT.compile({\n            type: [\"object\", \"array\"],\n            anyOf: [{type: \"object\"}, {type: \"array\"}],\n          })\n        })\n      })\n\n      it('should allow \"integer\" in \"number\" context', () => {\n        should.not.throw(() => {\n          ajv.compile({\n            type: \"number\",\n            anyOf: [{type: \"integer\"}],\n          })\n        })\n      })\n\n      it('should prohibit \"number\" in \"integer\" context', () => {\n        should.throw(() => {\n          ajv.compile({\n            type: \"integer\",\n            anyOf: [{type: \"number\"}],\n          })\n        }, /type \"number\" not allowed by context \"integer\"/)\n      })\n    })\n\n    describe(\"applicable types\", () => {\n      it(\"should prohibit keywords without applicable types\", () => {\n        should.throw(() => {\n          ajv.compile({\n            properties: {\n              foo: {type: \"number\", minimum: 0},\n            },\n          })\n        }, /missing type \"object\" for keyword \"properties\"/)\n\n        should.throw(() => {\n          ajv.compile({\n            type: \"object\",\n            properties: {\n              foo: {minimum: 0},\n            },\n          })\n        }, /missing type \"number\" for keyword \"minimum\"/)\n      })\n\n      it(\"should allow keywords with applicable types\", () => {\n        should.not.throw(() => {\n          ajv.compile({\n            type: \"object\",\n            properties: {\n              foo: {type: \"number\", minimum: 0},\n            },\n          })\n        })\n      })\n\n      it(\"should allow keywords with applicable type in parent schema\", () => {\n        should.not.throw(() => {\n          ajv.compile({\n            type: \"object\",\n            anyOf: [\n              {\n                properties: {\n                  foo: {type: \"number\"},\n                },\n              },\n              {\n                properties: {\n                  bar: {type: \"string\"},\n                },\n              },\n            ],\n          })\n        })\n      })\n    })\n\n    describe(\"propertyNames\", () => {\n      it('should set default data type \"string\"', () => {\n        ajv.compile({\n          type: \"object\",\n          propertyNames: {maxLength: 5},\n        })\n\n        ajv.compile({\n          type: \"object\",\n          propertyNames: {type: \"string\", maxLength: 5},\n        })\n\n        should.throw(() => {\n          ajv.compile({\n            type: \"object\",\n            propertyNames: {type: \"number\"},\n          })\n        }, /type \"number\" not allowed by context/)\n      })\n    })\n  })\n\n  describe(\"option strictTuples\", () => {\n    const ajv = new _Ajv({strictTuples: true})\n    type MyTuple = [string, number]\n\n    it(\"should prohibit unconstrained tuples\", () => {\n      const schema1: JSONSchemaType<MyTuple> = {\n        type: \"array\",\n        items: [{type: \"string\"}, {type: \"number\"}],\n        minItems: 2,\n        additionalItems: false,\n      }\n      should.not.throw(() => {\n        ajv.compile(schema1)\n      })\n\n      const schema2: JSONSchemaType<MyTuple> = {\n        type: \"array\",\n        items: [{type: \"string\"}, {type: \"number\"}],\n        minItems: 2,\n        maxItems: 2,\n      }\n      should.not.throw(() => {\n        ajv.compile(schema2)\n      })\n\n      //@ts-expect-error\n      const badSchema1: JSONSchemaType<MyTuple> = {\n        type: \"object\",\n        properties: {\n          test: {\n            type: \"array\",\n            items: [{type: \"string\"}, {type: \"number\"}],\n            additionalItems: false,\n          },\n        },\n      }\n      should.throw(() => {\n        ajv.compile(badSchema1)\n      }, / minItems or maxItems\\/additionalItems are not specified or different at path \"#\\/properties\\/test\"/)\n\n      //@ts-expect-error\n      const badSchema2: JSONSchemaType<MyTuple> = {\n        type: \"object\",\n        properties: {\n          test: {\n            type: \"array\",\n            items: [{type: \"string\"}, {type: \"number\"}],\n            minItems: 2,\n          },\n        },\n      }\n      should.throw(() => {\n        ajv.compile(badSchema2)\n      }, / minItems or maxItems\\/additionalItems are not specified or different at path \"#\\/properties\\/test\"/)\n\n      //@ts-expect-error\n      const badSchema3: JSONSchemaType<MyTuple> = {\n        type: \"object\",\n        properties: {\n          test: {\n            type: \"array\",\n            items: [{type: \"string\"}, {type: \"number\"}],\n            minItems: 2,\n            maxItems: 3,\n          },\n        },\n      }\n      should.throw(() => {\n        ajv.compile(badSchema3)\n      }, / minItems or maxItems\\/additionalItems are not specified or different at path \"#\\/properties\\/test\"/)\n    })\n  })\n\n  describe(\"strictRequired option\", () => {\n    const ajv = new _Ajv({strictRequired: true})\n\n    describe(\"base case\", () => {\n      const schema = {\n        type: \"object\",\n        properties: {\n          notTest: {\n            type: \"string\",\n          },\n        },\n        required: [\"test\"],\n      }\n\n      it(\"should prohibit with strictRequired: true\", () => {\n        should.throw(\n          () => ajv.compile(schema),\n          'strict mode: required property \"test\" is not defined at \"#\" (strictRequired)'\n        )\n      })\n\n      it(\"should NOT prohibit when strictRequired is not set\", () => {\n        should.not.throw(() => new _Ajv().compile(schema))\n      })\n    })\n\n    it(\"should prohibit in second level of a schema\", () => {\n      should.throw(() => {\n        ajv.compile({\n          type: \"object\",\n          properties: {\n            test: {\n              type: \"object\",\n              properties: {},\n              required: [\"keyname\"],\n            },\n          },\n        })\n      }, 'strict mode: required property \"keyname\" is not defined at \"#/properties/test\" (strictRequired)')\n    })\n\n    it.skip(\"should not throw with a same level if then\", () => {\n      should.not.throw(() => {\n        ajv.compile({\n          type: \"object\",\n          properties: {foo: {}},\n          if: {required: [\"foo\"]},\n          then: {properties: {bar: {type: \"boolean\"}}},\n        })\n      })\n    })\n\n    it(\"should throw if a required property exists in a parent object but not in the subschema that the require keyword references\", () => {\n      should.throw(() => {\n        ajv.compile({\n          type: \"object\",\n          properties: {\n            foo: {\n              type: \"object\",\n              required: \"foo\",\n              properties: {\n                test: {\n                  type: \"integer\",\n                },\n              },\n            },\n          },\n        })\n      })\n    })\n\n    it(\"should throw if property exists in parent but not in actual object required references\", () => {\n      should.throw(() => {\n        ajv.compile({\n          type: \"object\",\n          properties: {\n            foo: {\n              type: \"object\",\n              required: \"foo\",\n              properties: {\n                test: {\n                  type: \"number\",\n                },\n              },\n            },\n          },\n        })\n      })\n    })\n\n    it.skip(\"should not throw because all referenced properties are defined\", () => {\n      should.not.throw(() => {\n        ajv.compile({\n          type: \"object\",\n          properties: {foo: {}, bar: {}},\n          allOf: [\n            {\n              allOf: [\n                {\n                  if: {required: [\"foo\"]},\n                  then: {required: [\"bar\"]},\n                },\n              ],\n            },\n          ],\n        })\n      })\n    })\n\n    it(\"should throw because baz does not exist as a property\", () => {\n      should.throw(() => {\n        ajv.compile({\n          type: \"object\",\n          properties: {foo: {}, bar: {}},\n          allOf: [\n            {\n              allOf: [\n                {\n                  if: {required: [\"bar\"]},\n                  then: {required: [\"baz\"]},\n                },\n              ],\n            },\n          ],\n        })\n      })\n    })\n  })\n})\n\nfunction testStrictMode(schema, logPattern) {\n  return () => {\n    describe(\"strict = false\", () => {\n      it(\"should NOT throw an error or log a warning\", () => {\n        const output: any = {}\n        const ajv = new _Ajv({\n          strict: false,\n          logger: getLogger(output),\n        })\n        ajv.compile(schema)\n        should.not.exist(output.warning)\n      })\n    })\n\n    describe(\"strict = true or undefined\", () => {\n      it(\"should throw an error\", () => {\n        test(new _Ajv({strict: true}))\n        test(new _Ajv())\n\n        function test(ajv) {\n          should.throw(() => {\n            ajv.compile(schema)\n          }, logPattern)\n        }\n      })\n    })\n\n    describe('strict = \"log\"', () => {\n      it(\"should log a warning\", () => {\n        const output: any = {}\n        const ajv = new _Ajv({\n          strict: \"log\",\n          logger: getLogger(output),\n        })\n        ajv.compile(schema)\n        output.warning.should.match(logPattern)\n      })\n    })\n  }\n}\n\nfunction getLogger(output) {\n  return {\n    log() {\n      throw new Error(\"log should not be called\")\n    },\n    warn(msg) {\n      output.warning = msg\n    },\n    error() {\n      throw new Error(\"error should not be called\")\n    },\n  }\n}\n"
  },
  {
    "path": "spec/options/strictDefaults.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"strict option with defaults (replaced strictDefaults)\", () => {\n  describe(\"useDefaults = true\", () => {\n    describe(\"strict = false\", () => {\n      it(\"should NOT throw an error or log a warning given an ignored default\", () => {\n        const output: any = {}\n        const ajv = new _Ajv({\n          useDefaults: true,\n          strict: false,\n          logger: getLogger(output),\n        })\n        const schema = {\n          default: 5,\n          properties: {},\n        }\n\n        ajv.compile(schema)\n        should.not.exist(output.warning)\n      })\n\n      it(\"should NOT throw an error or log a warning given an ignored default #2\", () => {\n        const output: any = {}\n        const ajv = new _Ajv({\n          useDefaults: true,\n          strict: false,\n          logger: getLogger(output),\n        })\n        const schema = {\n          oneOf: [\n            {enum: [\"foo\", \"bar\"]},\n            {\n              properties: {\n                foo: {\n                  default: true,\n                },\n              },\n            },\n          ],\n        }\n\n        ajv.compile(schema)\n        should.not.exist(output.warning)\n      })\n    })\n\n    describe(\"strict = true\", () => {\n      it(\"should throw an error given an ignored default in the schema root when strict is true or undefined\", () => {\n        test(new _Ajv({useDefaults: true}))\n        test(new _Ajv({useDefaults: true, strict: true}))\n\n        function test(ajv) {\n          const schema = {\n            default: 5,\n            type: \"object\",\n            properties: {},\n          }\n          should.throw(() => ajv.compile(schema), /default is ignored in the schema root/)\n        }\n      })\n\n      it(\"should throw an error given an ignored default in oneOf when strict is true or undefined\", () => {\n        test(new _Ajv({useDefaults: true}))\n        test(new _Ajv({useDefaults: true, strict: true}))\n\n        function test(ajv) {\n          const schema = {\n            oneOf: [\n              {enum: [\"foo\", \"bar\"]},\n              {\n                type: \"object\",\n                properties: {\n                  foo: {\n                    default: true,\n                  },\n                },\n              },\n            ],\n          }\n          should.throw(() => {\n            ajv.compile(schema)\n          }, /default is ignored/)\n        }\n      })\n    })\n\n    describe('strict = \"log\"', () => {\n      it('should log a warning given an ignored default in the schema root when strict is \"log\"', () => {\n        const output: any = {}\n        const ajv = new _Ajv({\n          useDefaults: true,\n          strict: \"log\",\n          logger: getLogger(output),\n        })\n        const schema = {\n          type: \"object\",\n          default: 5,\n          properties: {},\n        }\n        ajv.compile(schema)\n        output.warning.should.match(/default is ignored in the schema root/)\n      })\n\n      it('should log a warning given an ignored default in oneOf when strict is \"log\"', () => {\n        const output: any = {}\n        const ajv = new _Ajv({\n          useDefaults: true,\n          strict: \"log\",\n          logger: getLogger(output),\n        })\n        const schema = {\n          oneOf: [\n            {enum: [\"foo\", \"bar\"]},\n            {\n              type: \"object\",\n              properties: {\n                foo: {\n                  default: true,\n                },\n              },\n            },\n          ],\n        }\n        ajv.compile(schema)\n        output.warning.should.match(/default is ignored for: data.foo/)\n      })\n    })\n  })\n\n  describe(\"useDefaults = false or undefined\", () => {\n    it(\"should NOT throw an error given an ignored default in the schema root when useDefaults is false\", () => {\n      test(new _Ajv({useDefaults: false}))\n      test(new _Ajv({useDefaults: false, strict: true}))\n      test(new _Ajv())\n      test(new _Ajv({strict: true}))\n\n      function test(ajv) {\n        const schema = {\n          type: \"object\",\n          default: 5,\n          properties: {},\n        }\n        should.not.throw(() => {\n          ajv.compile(schema)\n        })\n      }\n    })\n\n    it(\"should NOT throw an error given an ignored default in oneOf when useDefaults is false\", () => {\n      test(new _Ajv({useDefaults: false}))\n      test(new _Ajv({useDefaults: false, strict: true}))\n      test(new _Ajv())\n      test(new _Ajv({strict: true}))\n\n      function test(ajv) {\n        const schema = {\n          oneOf: [\n            {enum: [\"foo\", \"bar\"]},\n            {\n              type: \"object\",\n              properties: {\n                foo: {\n                  default: true,\n                },\n              },\n            },\n          ],\n        }\n        should.not.throw(() => {\n          ajv.compile(schema)\n        })\n      }\n    })\n  })\n\n  function getLogger(output) {\n    return {\n      log: () => {\n        throw new Error(\"log should not be called\")\n      },\n      warn: function (warning) {\n        output.warning = warning\n      },\n      error: () => {\n        throw new Error(\"error should not be called\")\n      },\n    }\n  }\n})\n"
  },
  {
    "path": "spec/options/strictKeywords.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"strict option with keywords (replaced strictKeywords)\", () => {\n  describe(\"strict = false\", () => {\n    it(\"should NOT throw an error or log a warning given an unknown keyword\", () => {\n      const output: any = {}\n      const ajv = new _Ajv({\n        strict: false,\n        logger: getLogger(output),\n      })\n      const schema = {\n        properties: {},\n        unknownKeyword: 1,\n      }\n\n      ajv.compile(schema)\n      should.not.exist(output.warning)\n    })\n  })\n\n  describe(\"strict = true or undefined\", () => {\n    it(\"should throw an error given an unknown keyword in the schema root when strict is true\", () => {\n      test(new _Ajv({strict: true}))\n      test(new _Ajv())\n\n      function test(ajv) {\n        const schema = {\n          type: \"object\",\n          properties: {},\n          unknownKeyword: 1,\n        }\n        should.throw(() => ajv.compile(schema), /unknown keyword/)\n      }\n    })\n  })\n\n  describe('strict = \"log\"', () => {\n    it(\"should log an error given an unknown keyword in the schema root\", () => {\n      const output: any = {}\n      const ajv = new _Ajv({\n        strict: \"log\",\n        logger: getLogger(output),\n      })\n      const schema = {\n        type: \"object\",\n        properties: {},\n        unknownKeyword: 1,\n      }\n      ajv.compile(schema)\n      output.warning.should.match(/unknown keyword: \"unknownKeyword\"/)\n    })\n  })\n\n  describe(\"unknown keyword inside schema that has no known keyword in compound keyword\", () => {\n    it(\"should throw an error given an unknown keyword when strict is true or undefined\", () => {\n      test(new _Ajv({strict: true}))\n      test(new _Ajv())\n\n      function test(ajv) {\n        const schema = {\n          anyOf: [{unknownKeyword: 1}],\n        }\n        should.throw(() => ajv.compile(schema), /unknown keyword/)\n      }\n    })\n  })\n\n  function getLogger(output) {\n    return {\n      log() {\n        throw new Error(\"log should not be called\")\n      },\n      warn(msg) {\n        output.warning = msg\n      },\n      error() {\n        throw new Error(\"warn should not be called\")\n      },\n    }\n  }\n})\n"
  },
  {
    "path": "spec/options/strictNumbers.spec.ts",
    "content": "import _Ajv from \"../ajv\"\n\ndescribe(\"strict option with keywords (replaced structNumbers)\", () => {\n  describe(\"strict default\", testStrict(new _Ajv()))\n  describe(\"strict = true\", testStrict(new _Ajv({strict: true})))\n  describe('strict = \"log\"', testStrict(new _Ajv({strict: \"log\"})))\n  describe(\"strict = false\", testNotStrict(new _Ajv({strict: false})))\n})\n\nfunction testStrict(ajv) {\n  return () => {\n    it(\"should fail validation for NaN/Infinity as type number\", () => {\n      const validate = ajv.compile({type: \"number\"})\n      validate(\"1.1\").should.equal(false)\n      validate(1.1).should.equal(true)\n      validate(1).should.equal(true)\n      validate(NaN).should.equal(false)\n      validate(Infinity).should.equal(false)\n    })\n\n    it(\"should fail validation for NaN as type integer\", () => {\n      const validate = ajv.compile({type: \"integer\"})\n      validate(\"1.1\").should.equal(false)\n      validate(1.1).should.equal(false)\n      validate(1).should.equal(true)\n      validate(NaN).should.equal(false)\n      validate(Infinity).should.equal(false)\n    })\n  }\n}\n\nfunction testNotStrict(_ajv) {\n  return () => {\n    it(\"should NOT fail validation for NaN/Infinity as type number\", () => {\n      const validate = _ajv.compile({type: \"number\"})\n      validate(\"1.1\").should.equal(false)\n      validate(1.1).should.equal(true)\n      validate(1).should.equal(true)\n      validate(NaN).should.equal(true)\n      validate(Infinity).should.equal(true)\n    })\n\n    it(\"should NOT fail validation for NaN/Infinity as type integer\", () => {\n      const validate = _ajv.compile({type: \"integer\"})\n      validate(\"1.1\").should.equal(false)\n      validate(1.1).should.equal(false)\n      validate(1).should.equal(true)\n      validate(NaN).should.equal(false)\n      validate(Infinity).should.equal(true)\n    })\n  }\n}\n"
  },
  {
    "path": "spec/options/unicodeRegExp.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"unicodeRegExp option\", () => {\n  const unicodeChar = \"\\uD83D\\uDC4D\"\n  const unicodeSchema = {\n    type: \"string\",\n    pattern: `^[${unicodeChar}]$`,\n  }\n\n  const schemaWithEscape = {\n    type: \"string\",\n    pattern: \"^[\\\\:]$\",\n  }\n\n  const patternPropertiesSchema = {\n    type: \"object\",\n    patternProperties: {\n      \"^\\\\:.*$\": {type: \"number\"},\n    },\n    additionalProperties: false,\n  }\n\n  describe(\"= true (default)\", () => {\n    const ajv = new _Ajv()\n    it(\"should fail schema compilation if used invalid (unnecessary) escape sequence for pattern\", () => {\n      should.throw(() => {\n        ajv.compile(schemaWithEscape)\n      }, /Invalid escape/)\n    })\n\n    it(\"should fail schema compilation if used invalid (unnecessary) escape sequence for patternProperties\", () => {\n      should.throw(() => {\n        ajv.compile(patternPropertiesSchema)\n      }, /Invalid escape/)\n    })\n\n    it(\"should validate unicode character\", () => {\n      const validate = ajv.compile(unicodeSchema)\n      validate(unicodeChar).should.equal(true)\n    })\n  })\n\n  describe(\"= false\", () => {\n    const ajv = new _Ajv({unicodeRegExp: false})\n    it(\"should pass schema compilation if used unnecessary escape sequence for pattern\", () => {\n      should.not.throw(() => {\n        const validate = ajv.compile(schemaWithEscape)\n        validate(\":\").should.equal(true)\n      })\n    })\n\n    it(\"should pass schema compilation if used unnecessary escape sequence for patternProperties\", () => {\n      should.not.throw(() => {\n        const validate = ajv.compile(patternPropertiesSchema)\n        validate({\":test\": 1}).should.equal(true)\n        validate({test: 1}).should.equal(false)\n      })\n    })\n\n    it(\"should not validate unicode character\", () => {\n      const validate = ajv.compile(unicodeSchema)\n      validate(unicodeChar).should.equal(false)\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/unknownFormats.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\nconst DATE_FORMAT = /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/\n\ndescribe(\"specifying allowed unknown formats with `formats` option\", () => {\n  describe(\"= true (default)\", () => {\n    it(\"should fail schema compilation if unknown format is used\", () => {\n      test(new _Ajv())\n\n      function test(ajv) {\n        should.throw(() => {\n          ajv.compile({type: \"string\", format: \"unknown\"})\n        }, /unknown format/)\n      }\n    })\n\n    it(\"should fail validation if unknown format is used via $data\", () => {\n      test(new _Ajv({$data: true}))\n\n      function test(ajv) {\n        ajv.addFormat(\"date\", DATE_FORMAT)\n        const validate = ajv.compile({\n          type: \"object\",\n          properties: {\n            foo: {type: \"string\", format: {$data: \"1/bar\"}},\n            bar: {type: \"string\"},\n          },\n        })\n\n        validate({foo: 1, bar: \"unknown\"}).should.equal(false)\n        validate({foo: \"2016-10-16\", bar: \"date\"}).should.equal(true)\n        validate({foo: \"20161016\", bar: \"date\"}).should.equal(false)\n        validate({foo: \"20161016\"}).should.equal(true)\n\n        validate({foo: \"2016-10-16\", bar: \"unknown\"}).should.equal(false)\n      }\n    })\n  })\n\n  describe('= \"ignore (default before 5.0.0)\"', () => {\n    it(\"should pass schema compilation and be valid if unknown format is used\", () => {\n      test(new _Ajv({strict: false, logger: false}))\n\n      function test(ajv) {\n        const validate = ajv.compile({format: \"unknown\"})\n        validate(\"anything\").should.equal(true)\n      }\n    })\n\n    it(\"should be valid if unknown format is used via $data\", () => {\n      test(new _Ajv({$data: true, strict: false}))\n\n      function test(ajv) {\n        ajv.addFormat(\"date\", DATE_FORMAT)\n        const validate = ajv.compile({\n          properties: {\n            foo: {format: {$data: \"1/bar\"}},\n            bar: {type: \"string\"},\n          },\n        })\n\n        validate({foo: 1, bar: \"unknown\"}).should.equal(true)\n        validate({foo: \"2016-10-16\", bar: \"date\"}).should.equal(true)\n        validate({foo: \"20161016\", bar: \"date\"}).should.equal(false)\n        validate({foo: \"20161016\"}).should.equal(true)\n        validate({foo: \"2016-10-16\", bar: \"unknown\"}).should.equal(true)\n      }\n    })\n  })\n\n  describe(\"= [String]\", () => {\n    it(\"should pass schema compilation and be valid if allowed unknown format is used\", () => {\n      test(new _Ajv({formats: {allowed: true}}))\n\n      function test(ajv) {\n        const validate = ajv.compile({type: \"string\", format: \"allowed\"})\n        validate(\"anything\").should.equal(true)\n\n        should.throw(() => {\n          ajv.compile({type: \"string\", format: \"unknown\"})\n        }, /unknown format/)\n      }\n    })\n\n    it(\"should be valid if allowed unknown format is used via $data\", () => {\n      test(new _Ajv({$data: true, formats: {allowed: true}, allowUnionTypes: true}))\n\n      function test(ajv) {\n        ajv.addFormat(\"date\", DATE_FORMAT)\n        const validate = ajv.compile({\n          type: \"object\",\n          properties: {\n            foo: {type: [\"string\", \"number\"], format: {$data: \"1/bar\"}},\n            bar: {type: \"string\"},\n          },\n        })\n\n        validate({foo: 1, bar: \"allowed\"}).should.equal(true)\n        validate({foo: 1, bar: \"unknown\"}).should.equal(false)\n        validate({foo: \"2016-10-16\", bar: \"date\"}).should.equal(true)\n        validate({foo: \"20161016\", bar: \"date\"}).should.equal(false)\n        validate({foo: \"20161016\"}).should.equal(true)\n\n        validate({foo: \"2016-10-16\", bar: \"allowed\"}).should.equal(true)\n        validate({foo: \"2016-10-16\", bar: \"unknown\"}).should.equal(false)\n      }\n    })\n  })\n})\n"
  },
  {
    "path": "spec/options/useDefaults.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport getAjvInstances from \"../ajv_instances\"\nimport chai from \"../chai\"\nchai.should()\n\ndescribe(\"useDefaults option\", () => {\n  it(\"should replace undefined property with default value\", () => {\n    const instances = getAjvInstances(\n      _Ajv,\n      {\n        allErrors: true,\n        loopRequired: 3,\n      },\n      {useDefaults: true}\n    )\n\n    instances.forEach(test)\n\n    function test(ajv) {\n      const schema = {\n        type: \"object\",\n        properties: {\n          foo: {type: \"string\", default: \"abc\"},\n          bar: {type: \"number\", default: 1},\n          baz: {type: \"boolean\", default: false},\n          nil: {type: \"null\", default: null},\n          obj: {type: \"object\", default: {}},\n          arr: {type: \"array\", default: []},\n        },\n        required: [\"foo\", \"bar\", \"baz\", \"nil\", \"obj\", \"arr\"],\n        minProperties: 6,\n      }\n\n      const validate = ajv.compile(schema)\n\n      let data = {}\n      validate(data).should.equal(true)\n      data.should.eql({\n        foo: \"abc\",\n        bar: 1,\n        baz: false,\n        nil: null,\n        obj: {},\n        arr: [],\n      })\n\n      data = {foo: \"foo\", bar: 2, obj: {test: true}}\n      validate(data).should.equal(true)\n      data.should.eql({\n        foo: \"foo\",\n        bar: 2,\n        baz: false,\n        nil: null,\n        obj: {test: true},\n        arr: [],\n      })\n    }\n  })\n\n  it(\"should replace undefined item with default value\", () => {\n    test(new _Ajv({useDefaults: true}))\n    test(new _Ajv({useDefaults: true, allErrors: true}))\n\n    function test(ajv) {\n      const schema = {\n        type: \"array\",\n        items: [\n          {type: \"string\", default: \"abc\"},\n          {type: \"number\", default: 1},\n          {type: \"boolean\", default: false},\n        ],\n        minItems: 3,\n        additionalItems: false,\n      }\n\n      const validate = ajv.compile(schema)\n\n      let data: any = []\n      validate(data).should.equal(true)\n      data.should.eql([\"abc\", 1, false])\n\n      data = [\"foo\"]\n      validate(data).should.equal(true)\n      data.should.eql([\"foo\", 1, false])\n\n      data = [\"foo\", 2, \"false\"]\n      validate(data).should.equal(false)\n      validate.errors.should.have.length(1)\n      data.should.eql([\"foo\", 2, \"false\"])\n    }\n  })\n\n  it('should apply default in \"then\" subschema (issue #635)', () => {\n    test(new _Ajv({useDefaults: true}))\n    test(new _Ajv({useDefaults: true, allErrors: true}))\n\n    function test(ajv) {\n      const schema = {\n        type: \"object\",\n        if: {required: [\"foo\"]},\n        then: {\n          properties: {\n            bar: {default: 2},\n          },\n        },\n        else: {\n          properties: {\n            foo: {default: 1},\n          },\n        },\n      }\n\n      const validate = ajv.compile(schema)\n\n      let data = {}\n      validate(data).should.equal(true)\n      data.should.eql({foo: 1})\n\n      data = {foo: 1}\n      validate(data).should.equal(true)\n      data.should.eql({foo: 1, bar: 2})\n    }\n  })\n\n  describe(\"useDefaults: defaults are always passed by value\", () => {\n    it(\"should NOT modify underlying defaults when modifying validated data\", () => {\n      test(new _Ajv({useDefaults: true}))\n      test(new _Ajv({useDefaults: true, allErrors: true}))\n    })\n\n    function test(ajv) {\n      const schema = {\n        type: \"object\",\n        properties: {\n          items: {\n            type: \"array\",\n            default: [\"a-default\"],\n          },\n        },\n      }\n\n      const validate = ajv.compile(schema)\n\n      const data: any = {}\n      validate(data).should.equal(true)\n      data.items.should.eql([\"a-default\"])\n\n      data.items.push(\"another-value\")\n      data.items.should.eql([\"a-default\", \"another-value\"])\n\n      const data2: any = {}\n      validate(data2).should.equal(true)\n\n      data2.items.should.eql([\"a-default\"])\n    }\n  })\n\n  describe('defaults with \"empty\" values', () => {\n    let schema, data\n\n    beforeEach(() => {\n      schema = {\n        type: \"object\",\n        properties: {\n          obj: {\n            type: \"object\",\n            properties: {\n              str: {default: \"foo\"},\n              n1: {default: 1},\n              n2: {default: 2},\n              n3: {default: 3},\n            },\n          },\n          arr: {\n            type: \"array\",\n            items: [{default: \"foo\"}, {default: 1}, {default: 2}, {default: 3}],\n            minItems: 4,\n            additionalItems: false,\n          },\n        },\n      }\n\n      data = {\n        obj: {\n          str: \"\",\n          n1: null,\n          n2: undefined,\n        },\n        arr: [\"\", null, undefined],\n      }\n    })\n\n    it('should NOT assign defaults when useDefaults is true/\"shared\"', () => {\n      test(new _Ajv({useDefaults: true}))\n\n      function test(ajv) {\n        const validate = ajv.compile(schema)\n        validate(data).should.equal(true)\n        data.should.eql({\n          obj: {\n            str: \"\",\n            n1: null,\n            n2: 2,\n            n3: 3,\n          },\n          arr: [\"\", null, 2, 3],\n        })\n      }\n    })\n\n    it('should assign defaults when useDefaults = \"empty\"', () => {\n      const ajv = new _Ajv({useDefaults: \"empty\"})\n      const validate = ajv.compile(schema)\n      validate(data).should.equal(true)\n      data.should.eql({\n        obj: {\n          str: \"foo\",\n          n1: 1,\n          n2: 2,\n          n3: 3,\n        },\n        arr: [\"foo\", 1, 2, 3],\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "spec/remotes/bar.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/bar.json\",\n  \"type\": \"string\"\n}\n"
  },
  {
    "path": "spec/remotes/buu.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/buu.json\",\n  \"definitions\": {\n    \"buu\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"bar\": {\"$ref\": \"bar.json\"}\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "spec/remotes/first.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/first.json\",\n  \"type\": \"string\"\n}\n"
  },
  {
    "path": "spec/remotes/foo.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/foo.json\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"bar\": {\"$ref\": \"bar.json\"}\n  }\n}\n"
  },
  {
    "path": "spec/remotes/hyper-schema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/hyper-schema#\",\n  \"$id\": \"http://json-schema.org/draft-07/hyper-schema#\",\n  \"title\": \"JSON Hyper-Schema\",\n  \"definitions\": {\n    \"schemaArray\": {\n      \"allOf\": [\n        {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/schemaArray\"\n        },\n        {\n          \"items\": {\"$ref\": \"#\"}\n        }\n      ]\n    }\n  },\n  \"allOf\": [{\"$ref\": \"http://json-schema.org/draft-07/schema#\"}],\n  \"properties\": {\n    \"additionalItems\": {\"$ref\": \"#\"},\n    \"additionalProperties\": {\"$ref\": \"#\"},\n    \"dependencies\": {\n      \"additionalProperties\": {\n        \"anyOf\": [{\"$ref\": \"#\"}, {\"type\": \"array\"}]\n      }\n    },\n    \"items\": {\n      \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/schemaArray\"}]\n    },\n    \"definitions\": {\n      \"additionalProperties\": {\"$ref\": \"#\"}\n    },\n    \"patternProperties\": {\n      \"additionalProperties\": {\"$ref\": \"#\"}\n    },\n    \"properties\": {\n      \"additionalProperties\": {\"$ref\": \"#\"}\n    },\n    \"if\": {\"$ref\": \"#\"},\n    \"then\": {\"$ref\": \"#\"},\n    \"else\": {\"$ref\": \"#\"},\n    \"allOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"anyOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"oneOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n    \"not\": {\"$ref\": \"#\"},\n    \"contains\": {\"$ref\": \"#\"},\n    \"propertyNames\": {\"$ref\": \"#\"},\n\n    \"base\": {\n      \"type\": \"string\",\n      \"format\": \"uri-template\"\n    },\n    \"links\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"$ref\": \"http://json-schema.org/draft-07/hyper-schema#/links\"\n      }\n    }\n  },\n  \"links\": [\n    {\n      \"rel\": \"self\",\n      \"href\": \"{+%24id}\"\n    }\n  ]\n}\n"
  },
  {
    "path": "spec/remotes/name.json",
    "content": "{\n  \"definitions\": {\n    \"orNull\": {\n      \"anyOf\": [{\"type\": \"null\"}, {\"$ref\": \"#\"}]\n    }\n  },\n  \"type\": \"string\"\n}\n"
  },
  {
    "path": "spec/remotes/node.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/node.json\",\n  \"description\": \"node\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"value\": {\"type\": \"number\"},\n    \"subtree\": {\"$ref\": \"tree.json\"}\n  },\n  \"required\": [\"value\"]\n}\n"
  },
  {
    "path": "spec/remotes/scope_change.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/scope_change.json\",\n  \"definitions\": {\n    \"foo\": {\n      \"$id\": \"http://localhost:1234/scope_foo.json\",\n      \"definitions\": {\n        \"bar\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"baz\": {\n      \"$id\": \"folder/\",\n      \"type\": \"array\",\n      \"items\": {\"$ref\": \"folderInteger.json\"},\n      \"bar\": {\n        \"items\": {\"$ref\": \"folderInteger.json\"}\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "spec/remotes/second.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/second.json\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"first\": {\"$ref\": \"first.json\"}\n  }\n}\n"
  },
  {
    "path": "spec/remotes/tree.json",
    "content": "{\n  \"$id\": \"http://localhost:1234/tree.json\",\n  \"description\": \"tree of nodes\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"meta\": {\"type\": \"string\"},\n    \"nodes\": {\n      \"type\": \"array\",\n      \"items\": {\"$ref\": \"node.json\"}\n    }\n  },\n  \"required\": [\"meta\", \"nodes\"]\n}\n"
  },
  {
    "path": "spec/resolve.spec.ts",
    "content": "import type AjvCore from \"../dist/core\"\nimport getAjvInstances from \"./ajv_instances\"\nimport _Ajv from \"./ajv\"\nimport type {AnyValidateFunction} from \"../dist/types\"\nimport type MissingRefError from \"../dist/compile/ref_error\"\nimport chai from \"./chai\"\nimport * as uriJs from \"uri-js\"\nconst should = chai.should()\n\nconst uriResolvers = [undefined, uriJs]\n\nuriResolvers.forEach((resolver) => {\n  let describeTitle: string\n  if (resolver !== undefined) {\n    describeTitle = \"uri-js resolver\"\n  } else {\n    describeTitle = \"fast-uri resolver\"\n  }\n  describe(describeTitle, () => {\n    describe(\"resolve\", () => {\n      let instances: AjvCore[]\n\n      beforeEach(() => {\n        instances = getAjvInstances(_Ajv, {\n          allErrors: true,\n          verbose: true,\n          inlineRefs: false,\n          allowUnionTypes: true,\n          uriResolver: resolver,\n        })\n      })\n\n      describe(\"resolve.ids method\", () => {\n        it(\"should resolve ids in schema\", () => {\n          // Example from http://json-schema.org/latest/json-schema-core.html#anchor29\n          const schema = {\n            $id: \"http://x.y.z/rootschema.json#\",\n            $defs: {\n              schema1: {\n                $id: \"#foo\",\n                description: \"schema1\",\n                type: \"integer\",\n              },\n              schema2: {\n                $id: \"otherschema.json\",\n                description: \"schema2\",\n                $defs: {\n                  nested: {\n                    $id: \"#bar\",\n                    description: \"nested\",\n                    type: \"string\",\n                  },\n                  alsonested: {\n                    $id: \"t/inner.json#a\",\n                    description: \"alsonested\",\n                    type: \"boolean\",\n                  },\n                },\n              },\n              schema3: {\n                $id: \"some://where.else/completely#\",\n                description: \"schema3\",\n                type: \"null\",\n              },\n            },\n            type: \"object\",\n            properties: {\n              foo: {$ref: \"#foo\"},\n              bar: {$ref: \"otherschema.json#bar\"},\n              baz: {$ref: \"t/inner.json#a\"},\n              bax: {$ref: \"some://where.else/completely#\"},\n            },\n            required: [\"foo\", \"bar\", \"baz\", \"bax\"],\n          }\n\n          instances.forEach((ajv) => {\n            const validate = ajv.compile(schema)\n            const data = {foo: 1, bar: \"abc\", baz: true, bax: null}\n            validate(data).should.equal(true)\n          })\n        })\n\n        it(\"should resolve fragment $id in schema refs when root $id not present\", () => {\n          const schema = {\n            $schema: \"http://json-schema.org/draft-07/schema#\",\n            definitions: {\n              SeeAlso: {$id: \"#SeeAlso\", type: \"number\"},\n              Engine: {\n                $id: \"#Engine\",\n                type: \"object\",\n                properties: {\n                  see_also: {$ref: \"#SeeAlso\"},\n                },\n              },\n            },\n          }\n\n          instances.forEach((ajv) => {\n            ajv.addSchema(schema, \"yaml.json\")\n            const data = {see_also: 1}\n            const validate = ajv.validate(\"yaml.json#/definitions/Engine\", data)\n            validate.should.equal(true)\n          })\n        })\n\n        it(\"should throw if the same id resolves to two different schemas\", () => {\n          instances.forEach((ajv) => {\n            ajv.compile({\n              $id: \"http://example.com/1.json\",\n              type: \"integer\",\n            })\n            should.throw(() => {\n              ajv.compile({\n                type: \"object\",\n                additionalProperties: {\n                  $id: \"http://example.com/1.json\",\n                  type: \"string\",\n                },\n              })\n            }, /resolves to more than one schema/)\n\n            should.throw(() => {\n              ajv.compile({\n                type: [\"object\", \"array\"],\n                items: {\n                  $id: \"#int\",\n                  type: \"integer\",\n                },\n                additionalProperties: {\n                  $id: \"#int\",\n                  type: \"string\",\n                },\n              })\n            }, /resolves to more than one schema/)\n          })\n        })\n\n        it(\"should resolve ids defined as urn's (issue #423)\", () => {\n          const schema = {\n            type: \"object\",\n            properties: {\n              ip1: {\n                $id: \"urn:some:ip:prop\",\n                type: \"string\",\n                pattern: \"^(\\\\d+\\\\.){3}\\\\d+$\",\n              },\n              ip2: {\n                $ref: \"urn:some:ip:prop\",\n              },\n            },\n            required: [\"ip1\", \"ip2\"],\n          }\n\n          const data = {\n            ip1: \"0.0.0.0\",\n            ip2: \"0.0.0.0\",\n          }\n          instances.forEach((ajv) => {\n            const validate = ajv.compile(schema)\n            validate(data).should.equal(true)\n          })\n        })\n      })\n\n      describe(\"protocol-relative URIs\", () => {\n        it(\"should resolve fragment\", () => {\n          instances.forEach((ajv) => {\n            const schema = {\n              $id: \"//e.com/types\",\n              definitions: {\n                int: {type: \"integer\"},\n              },\n            }\n\n            ajv.addSchema(schema)\n            const validate = ajv.compile({$ref: \"//e.com/types#/definitions/int\"})\n            validate(1).should.equal(true)\n            validate(\"foo\").should.equal(false)\n          })\n        })\n      })\n\n      describe(\"URIs with encoded characters (issue #2447)\", () => {\n        it(\"should resolve the ref\", () => {\n          const schema = {\n            $ref: \"#/definitions/Record%3Cstring%2CPerson%3E\",\n            $schema: \"http://json-schema.org/draft-07/schema#\",\n            definitions: {\n              Person: {\n                type: \"object\",\n                properties: {\n                  firstName: {\n                    type: \"string\",\n                    description: \"The person's first name.\",\n                  },\n                },\n              },\n              \"Record<string,Person>\": {\n                type: \"object\",\n                additionalProperties: {\n                  $ref: \"#/definitions/Person\",\n                },\n              },\n            },\n          }\n          const data = {\n            joe: {\n              firstName: \"Joe\",\n            },\n          }\n          instances.forEach((ajv) => {\n            const validate = ajv.compile(schema)\n            validate(data).should.equal(true)\n          })\n        })\n      })\n\n      describe(\"missing schema error\", function () {\n        this.timeout(4000)\n\n        it(\"should contain missingRef and missingSchema\", () => {\n          testMissingSchemaError({\n            baseId: \"http://example.com/1.json\",\n            ref: \"http://another.com/int.json\",\n            expectedMissingRef: \"http://another.com/int.json\",\n            expectedMissingSchema: \"http://another.com/int.json\",\n          })\n        })\n\n        it(\"should resolve missingRef and missingSchema relative to base id\", () => {\n          testMissingSchemaError({\n            baseId: \"http://example.com/folder/1.json\",\n            ref: \"int.json\",\n            expectedMissingRef: \"http://example.com/folder/int.json\",\n            expectedMissingSchema: \"http://example.com/folder/int.json\",\n          })\n        })\n\n        it(\"should resolve missingRef and missingSchema relative to base id from root\", () => {\n          testMissingSchemaError({\n            baseId: \"http://example.com/folder/1.json\",\n            ref: \"/int.json\",\n            expectedMissingRef: \"http://example.com/int.json\",\n            expectedMissingSchema: \"http://example.com/int.json\",\n          })\n        })\n\n        it(\"missingRef should and missingSchema should NOT include JSON path (hash fragment)\", () => {\n          testMissingSchemaError({\n            baseId: \"http://example.com/1.json\",\n            ref: \"int.json#/definitions/positive\",\n            expectedMissingRef: \"http://example.com/int.json#/definitions/positive\",\n            expectedMissingSchema: \"http://example.com/int.json\",\n          })\n        })\n\n        it(\"should throw missing schema error if same path exist in the current schema but id is different (issue #220)\", () => {\n          testMissingSchemaError({\n            baseId: \"http://example.com/parent.json\",\n            ref: \"object.json#/properties/a\",\n            expectedMissingRef: \"http://example.com/object.json#/properties/a\",\n            expectedMissingSchema: \"http://example.com/object.json\",\n          })\n        })\n\n        function testMissingSchemaError(opts) {\n          instances.forEach((ajv) => {\n            try {\n              ajv.compile({\n                $id: opts.baseId,\n                type: \"object\",\n                properties: {a: {$ref: opts.ref}},\n              })\n            } catch (err) {\n              const e = err as MissingRefError\n              e.missingRef.should.equal(opts.expectedMissingRef)\n              e.missingSchema.should.equal(opts.expectedMissingSchema)\n            }\n          })\n        }\n      })\n\n      describe(\"inline referenced schemas without refs in them\", () => {\n        const schemas = [\n          {$id: \"http://e.com/obj.json#\", type: \"object\", properties: {a: {$ref: \"int.json#\"}}},\n          {$id: \"http://e.com/int.json#\", type: \"integer\", minimum: 2, maximum: 4},\n          {\n            $id: \"http://e.com/obj1.json#\",\n            type: \"object\",\n            definitions: {int: {type: \"integer\", minimum: 2, maximum: 4}},\n            properties: {a: {$ref: \"#/definitions/int\"}},\n          },\n          {$id: \"http://e.com/list.json#\", type: \"array\", items: {$ref: \"obj.json#\"}},\n        ]\n\n        it(\"by default should inline schema if it doesn't contain refs\", () => {\n          const ajv = new _Ajv({schemas, code: {source: true}})\n          testSchemas(ajv, true)\n        })\n\n        it(\"should NOT inline schema if option inlineRefs == false\", () => {\n          const ajv = new _Ajv({schemas, inlineRefs: false, code: {source: true}})\n          testSchemas(ajv, false)\n        })\n\n        it(\"should inline schema if option inlineRefs is bigger than number of keys in referenced schema\", () => {\n          const ajv = new _Ajv({schemas, inlineRefs: 4, code: {source: true}})\n          testSchemas(ajv, true)\n        })\n\n        it(\"should NOT inline schema if option inlineRefs is less than number of keys in referenced schema\", () => {\n          const ajv = new _Ajv({schemas, inlineRefs: 2, code: {source: true}})\n          testSchemas(ajv, false)\n        })\n\n        it(\"should avoid schema substitution when refs are inlined (issue #77)\", () => {\n          const ajv = new _Ajv({verbose: true})\n\n          const schemaMessage = {\n            $schema: \"http://json-schema.org/draft-07/schema#\",\n            $id: \"http://e.com/message.json#\",\n            type: \"object\",\n            required: [\"header\"],\n            properties: {\n              header: {\n                type: \"object\",\n                allOf: [{$ref: \"header.json\"}, {properties: {msgType: {enum: [0]}}}],\n              },\n            },\n          }\n\n          // header schema\n          const schemaHeader = {\n            $schema: \"http://json-schema.org/draft-07/schema#\",\n            $id: \"http://e.com/header.json#\",\n            type: \"object\",\n            properties: {\n              version: {\n                type: \"integer\",\n                maximum: 5,\n              },\n              msgType: {type: \"integer\"},\n            },\n            required: [\"version\", \"msgType\"],\n          }\n\n          // a good message\n          const validMessage = {\n            header: {\n              version: 4,\n              msgType: 0,\n            },\n          }\n\n          // a bad message\n          const invalidMessage = {\n            header: {\n              version: 6,\n              msgType: 0,\n            },\n          }\n\n          // add schemas and get validator function\n          ajv.addSchema(schemaHeader)\n          ajv.addSchema(schemaMessage)\n          const v: any = ajv.getSchema(\"http://e.com/message.json#\")\n\n          v(validMessage).should.equal(true)\n          v.schema.$id.should.equal(\"http://e.com/message.json#\")\n\n          v(invalidMessage).should.equal(false)\n          v.errors.should.have.length(1)\n          v.schema.$id.should.equal(\"http://e.com/message.json#\")\n\n          v(validMessage).should.equal(true)\n          v.schema.$id.should.equal(\"http://e.com/message.json#\")\n        })\n\n        function testSchemas(ajv, expectedInlined) {\n          const v1 = ajv.getSchema(\"http://e.com/obj.json\"),\n            v2 = ajv.getSchema(\"http://e.com/obj1.json\"),\n            v3 = ajv.getSchema(\"http://e.com/list.json\")\n          testObjSchema(v1)\n          testObjSchema(v2)\n          testListSchema(v3)\n          testInlined(v1, expectedInlined)\n          testInlined(v2, expectedInlined)\n          testInlined(v3, false)\n        }\n\n        function testObjSchema(validate) {\n          validate({a: 3}).should.equal(true)\n          validate({a: 1}).should.equal(false)\n          validate({a: 5}).should.equal(false)\n        }\n\n        function testListSchema(validate) {\n          validate([{a: 3}]).should.equal(true)\n          validate([{a: 1}]).should.equal(false)\n          validate([{a: 5}]).should.equal(false)\n        }\n\n        function testInlined(validate: AnyValidateFunction, expectedInlined) {\n          const inlined: any = !validate.source?.scopeValues.validate\n          inlined.should.equal(expectedInlined)\n        }\n      })\n\n      describe(\"duplicate internal $id\", () => {\n        it(\"should throw error with duplicate IDs in definitions\", () => {\n          const schema = {\n            $id: \"http://example.com/example.json\",\n            $defs: {\n              foo: {\n                $id: \"#nope\",\n                type: \"integer\",\n              },\n              bar: {\n                $id: \"#nope\",\n                type: \"string\",\n              },\n            },\n            type: \"object\",\n            properties: {\n              foo: {$ref: \"#/$defs/foo\"},\n              bar: {$ref: \"#/$defs/bar\"},\n            },\n          }\n\n          instances.forEach((ajv) =>\n            should.throw(() => ajv.compile(schema), /nope.*resolves to more than one schema/)\n          )\n        })\n\n        it(\"should throw error with duplicate IDs in properties\", () => {\n          const schema = {\n            $id: \"http://example.com/example.json\",\n            type: \"object\",\n            properties: {\n              foo: {\n                $id: \"#nope\",\n                type: \"integer\",\n              },\n              bar: {\n                $id: \"#nope\",\n                type: \"string\",\n              },\n            },\n          }\n\n          instances.forEach((ajv) =>\n            should.throw(() => ajv.compile(schema), /nope.*resolves to more than one schema/)\n          )\n        })\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "spec/schema-tests.spec.ts",
    "content": "import type AjvCore from \"../dist/core\"\nimport _Ajv from \"./ajv\"\nimport getAjvInstances from \"./ajv_instances\"\nimport {withStandalone} from \"./ajv_standalone\"\nimport jsonSchemaTest = require(\"json-schema-test\")\nimport options from \"./ajv_options\"\nimport {afterError, afterEach} from \"./after_test\"\nimport ajvFormats from \"ajv-formats\"\n\nconst instances = getAjvInstances(_Ajv, options, {strict: false, formats: {allowedUnknown: true}})\n\nconst remoteRefs = {\n  \"http://localhost:1234/integer.json\": require(\"./JSON-Schema-Test-Suite/remotes/integer.json\"),\n  \"http://localhost:1234/folder/folderInteger.json\": require(\"./JSON-Schema-Test-Suite/remotes/baseUriChange/folderInteger.json\"),\n  \"http://localhost:1234/name.json\": require(\"./remotes/name.json\"),\n}\n\nconst remoteRefsWithIds = [\n  require(\"./remotes/bar.json\"),\n  require(\"./remotes/foo.json\"),\n  require(\"./remotes/buu.json\"),\n  require(\"./remotes/tree.json\"),\n  require(\"./remotes/node.json\"),\n  require(\"./remotes/second.json\"),\n  require(\"./remotes/first.json\"),\n  require(\"./remotes/scope_change.json\"),\n]\n\ninstances.forEach(addRemoteRefsAndFormats)\n\njsonSchemaTest(withStandalone(instances), {\n  description: `Schema tests of ${instances.length} ajv instances with different options`,\n  suites: {\"Schema tests\": require(\"./_json/tests\")},\n  only: [],\n  assert: require(\"./chai\").assert,\n  afterError,\n  afterEach,\n  cwd: __dirname,\n  timeout: 10000,\n})\n\nfunction addRemoteRefsAndFormats(ajv: AjvCore) {\n  ajv.opts.code.source = true\n  for (const id in remoteRefs) ajv.addSchema(remoteRefs[id], id)\n  ajv.addSchema(remoteRefsWithIds)\n  ajvFormats(ajv)\n}\n"
  },
  {
    "path": "spec/security/array.json",
    "content": "[\n  {\n    \"description\": \"uniqueItems without type keyword should be used together with maxItems\",\n    \"schema\": {\n      \"$ref\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"uniqueItems keyword used without maxItems is invalid\",\n        \"data\": {\n          \"uniqueItems\": true\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"uniqueItems keyword used with maxItems is valid\",\n        \"data\": {\n          \"uniqueItems\": true,\n          \"maxItems\": \"10\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"uniqueItems: false is ignored (and valid)\",\n        \"data\": {\n          \"uniqueItems\": false\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"uniqueItems with scalar type(s) is valid to use without maxItems\",\n    \"schema\": {\n      \"$ref\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"uniqueItems keyword with a single scalar type is valid\",\n        \"data\": {\n          \"uniqueItems\": true,\n          \"items\": {\n            \"type\": \"number\"\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"uniqueItems keyword with multiple scalar types is valid\",\n        \"data\": {\n          \"uniqueItems\": true,\n          \"items\": {\n            \"type\": [\"number\", \"string\"]\n          }\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"uniqueItems with compound type(s) should be used together with maxItems\",\n    \"schema\": {\n      \"$ref\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"uniqueItems keyword with a single compound type and without maxItems is invalid\",\n        \"data\": {\n          \"uniqueItems\": true,\n          \"items\": {\n            \"type\": \"object\"\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"uniqueItems keyword with a single compound type and with maxItems is valid\",\n        \"data\": {\n          \"uniqueItems\": true,\n          \"maxItems\": \"10\",\n          \"items\": {\n            \"type\": \"object\"\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"uniqueItems keyword with multiple types including compound type and without maxItems is invalid\",\n        \"data\": {\n          \"uniqueItems\": true,\n          \"items\": {\n            \"type\": [\"array\", \"number\"]\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"uniqueItems keyword with multiple types including compound type and with maxItems is valid\",\n        \"data\": {\n          \"uniqueItems\": true,\n          \"maxItems\": \"10\",\n          \"items\": {\n            \"type\": [\"array\", \"number\"]\n          }\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/security/object.json",
    "content": "[\n  {\n    \"description\": \"patternProperties keyword should be used together with propertyNames\",\n    \"schema\": {\n      \"$ref\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"patternProperties keyword used without propertyNames is invalid\",\n        \"data\": {\n          \"patternProperties\": {\n            \".*\": {}\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"patternProperties keyword used with propertyNames is valid\",\n        \"data\": {\n          \"patternProperties\": {\n            \".*\": {}\n          },\n          \"propertyNames\": {\n            \"maxLength\": \"256\"\n          }\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/security/string.json",
    "content": "[\n  {\n    \"description\": \"pattern keyword should be used together with maxLength\",\n    \"schema\": {\n      \"$ref\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"pattern keyword used without maxLength is invalid\",\n        \"data\": {\n          \"pattern\": \".*\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"pattern keyword used with maxLength is valid\",\n        \"data\": {\n          \"pattern\": \".*\",\n          \"maxLength\": \"256\"\n        },\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"format keyword should be used together with maxLength\",\n    \"schema\": {\n      \"$ref\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"format keyword used without maxLength is invalid\",\n        \"data\": {\n          \"format\": \"email\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"format keyword used with maxLength is valid\",\n        \"data\": {\n          \"format\": \"email\",\n          \"maxLength\": \"256\"\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/security.spec.ts",
    "content": "import _Ajv from \"./ajv\"\nimport getAjvInstances from \"./ajv_instances\"\nimport {withStandalone} from \"./ajv_standalone\"\nimport jsonSchemaTest = require(\"json-schema-test\")\nimport options from \"./ajv_options\"\nimport {afterError, afterEach} from \"./after_test\"\nimport chai from \"./chai\"\n\nconst instances = getAjvInstances(_Ajv, options, {\n  schemas: [require(\"../dist/refs/json-schema-secure.json\")],\n  strictTypes: false,\n})\n\ninstances.forEach((ajv) => (ajv.opts.code.source = true))\n\njsonSchemaTest(withStandalone(instances), {\n  description:\n    \"Secure schemas tests of \" + instances.length + \" ajv instances with different options\",\n  suites: {security: require(\"./_json/security\")},\n  assert: chai.assert,\n  afterError,\n  afterEach,\n  cwd: __dirname,\n  hideFolder: \"security/\",\n})\n"
  },
  {
    "path": "spec/standalone.spec.ts",
    "content": "import type Ajv from \"../dist/core\"\nimport type {AnyValidateFunction} from \"../dist/core\"\nimport _Ajv from \"./ajv\"\nimport standaloneCode from \"../dist/standalone\"\nimport ajvFormats from \"ajv-formats\"\nimport requireFromString = require(\"require-from-string\")\nimport {importFromStringSync} from \"module-from-string\"\nimport assert = require(\"assert\")\n\nfunction testExportTypeEsm(moduleCode: string, singleExport: boolean) {\n  //Must have\n  assert.strictEqual(moduleCode.includes(\"export const\"), true)\n  if (singleExport) {\n    assert.strictEqual(moduleCode.includes(\"export default\"), true)\n  }\n  //Must not have\n  assert.strictEqual(moduleCode.includes(\"module.exports\"), false)\n}\nfunction testExportTypeCjs(moduleCode: string, singleExport: boolean) {\n  //Must have\n  if (singleExport) {\n    assert.strictEqual(moduleCode.includes(\"module.exports\"), true)\n  } else {\n    assert.strictEqual(moduleCode.includes(\"exports.\") || moduleCode.includes(\"exports[\"), true)\n  }\n  //Must not have\n  assert.strictEqual(moduleCode.includes(\"export const\"), false)\n}\n\ndescribe(\"standalone code generation\", () => {\n  describe(\"multiple exports\", () => {\n    let ajv: Ajv\n    const numSchema = {\n      $id: \"https://example.com/number.json\",\n      type: \"number\",\n      minimum: 0,\n    }\n    const strSchema = {\n      $id: \"https://example.com/string.json\",\n      type: \"string\",\n      minLength: 2,\n    }\n\n    describe(\"without schema keys\", () => {\n      it(\"should generate module code with named export - CJS\", () => {\n        ajv = new _Ajv({code: {source: true}})\n        ajv.addSchema(numSchema)\n        ajv.addSchema(strSchema)\n        const moduleCode = standaloneCode(ajv, {\n          validateNumber: \"https://example.com/number.json\",\n          validateString: \"https://example.com/string.json\",\n        })\n        testExportTypeCjs(moduleCode, false)\n        const m = requireFromString(moduleCode)\n        assert.strictEqual(Object.keys(m).length, 2)\n        testExports(m)\n      })\n\n      it(\"should generate module code with named export - ESM\", () => {\n        ajv = new _Ajv({code: {source: true, esm: true}})\n        ajv.addSchema(numSchema)\n        ajv.addSchema(strSchema)\n        const moduleCode = standaloneCode(ajv, {\n          validateNumber: \"https://example.com/number.json\",\n          validateString: \"https://example.com/string.json\",\n        })\n        testExportTypeEsm(moduleCode, false)\n        const m = importFromStringSync(moduleCode)\n        assert.strictEqual(Object.keys(m).length, 2)\n        testExports(m)\n      })\n\n      it(\"should generate module code with all exports - CJS\", () => {\n        ajv = new _Ajv({code: {source: true}})\n        ajv.addSchema(numSchema)\n        ajv.addSchema(strSchema)\n        const moduleCode = standaloneCode(ajv)\n        testExportTypeCjs(moduleCode, false)\n        const m = requireFromString(moduleCode)\n        assert.strictEqual(Object.keys(m).length, 2)\n        testExports({\n          validateNumber: m[\"https://example.com/number.json\"],\n          validateString: m[\"https://example.com/string.json\"],\n        })\n      })\n\n      it(\"should generate module code with all exports - ESM\", () => {\n        ajv = new _Ajv({code: {source: true, esm: true}})\n        ajv.addSchema(numSchema)\n        ajv.addSchema(strSchema)\n\n        try {\n          standaloneCode(ajv)\n        } catch (err) {\n          if (err instanceof Error) {\n            const isMappingErr =\n              `CodeGen: invalid export name: ${numSchema.$id}, use explicit $id name mapping` ===\n                err.message ||\n              `CodeGen: invalid export name: ${strSchema.$id}, use explicit $id name mapping` ===\n                err.message\n            assert.strictEqual(isMappingErr, true)\n          } else {\n            throw err\n          }\n        }\n      })\n    })\n\n    describe(\"with schema keys\", () => {\n      beforeEach(() => {\n        ajv = new _Ajv({code: {source: true}})\n        ajv.addSchema(numSchema, \"validateNumber\")\n        ajv.addSchema(strSchema, \"validateString\")\n      })\n\n      it(\"should generate module code with named exports\", () => {\n        const moduleCode = standaloneCode(ajv, {\n          validateNumber: \"validateNumber\",\n          validateString: \"validateString\",\n        })\n        const m = requireFromString(moduleCode)\n        assert.strictEqual(Object.keys(m).length, 2)\n        testExports(m)\n      })\n\n      it(\"should generate module code with all exports\", () => {\n        const moduleCode = standaloneCode(ajv)\n        const m = requireFromString(moduleCode)\n        assert.strictEqual(Object.keys(m).length, 2)\n        testExports(m)\n      })\n    })\n\n    function testExports(m: {[n: string]: AnyValidateFunction<unknown>}) {\n      assert.strictEqual(m.validateNumber(1), true)\n      assert.strictEqual(m.validateNumber(0), true)\n      assert.strictEqual(m.validateNumber(-1), false)\n      assert.strictEqual(m.validateNumber(\"1\"), false)\n\n      assert.strictEqual(m.validateString(\"123\"), true)\n      assert.strictEqual(m.validateString(\"12\"), true)\n      assert.strictEqual(m.validateString(\"1\"), false)\n      assert.strictEqual(m.validateString(12), false)\n    }\n  })\n\n  describe(\"issue #1361\", () => {\n    describe(\"two refs to the same schema\", () => {\n      const userSchema = {\n        $id: \"user.json\",\n        type: \"object\",\n        properties: {\n          name: {type: \"string\"},\n        },\n        required: [\"name\"],\n      }\n\n      const infoSchema = {\n        $id: \"info.json\",\n        type: \"object\",\n        properties: {\n          author: {$ref: \"user.json\"},\n          contributors: {\n            type: \"array\",\n            items: {$ref: \"user.json\"},\n          },\n        },\n        required: [\"author\", \"contributors\"],\n      }\n\n      describe(\"all exports\", () => {\n        it(\"should not have duplicate functions\", () => {\n          const ajv = new _Ajv({\n            allErrors: true,\n            code: {optimize: false, source: true},\n            inlineRefs: false, // it is needed to show the issue, schemas with refs won't be inlined anyway\n            schemas: [userSchema, infoSchema],\n          })\n\n          const moduleCode = standaloneCode(ajv)\n          assertNoDuplicateFunctions(moduleCode)\n          const {\"user.json\": user, \"info.json\": info} = requireFromString(moduleCode)\n          testExports({user, info})\n        })\n      })\n\n      describe(\"named exports\", () => {\n        it(\"should not have duplicate functions\", () => {\n          const ajv = new _Ajv({\n            allErrors: true,\n            code: {optimize: false, source: true},\n            inlineRefs: false, // it is needed to show the issue, schemas with refs won't be inlined anyway\n            schemas: [userSchema, infoSchema],\n          })\n\n          const moduleCode = standaloneCode(ajv, {user: \"user.json\", info: \"info.json\"})\n          assertNoDuplicateFunctions(moduleCode)\n          testExports(requireFromString(moduleCode))\n        })\n      })\n    })\n\n    describe(\"mutually recursive schemas\", () => {\n      const userSchema = {\n        $id: \"user.json\",\n        type: \"object\",\n        properties: {\n          name: {type: \"string\"},\n          infos: {\n            type: \"array\",\n            items: {$ref: \"info.json\"},\n          },\n        },\n        required: [\"name\"],\n      }\n\n      const infoSchema = {\n        $id: \"info.json\",\n        type: \"object\",\n        properties: {\n          author: {$ref: \"user.json\"},\n          contributors: {\n            type: \"array\",\n            items: {$ref: \"user.json\"},\n          },\n        },\n        required: [\"author\", \"contributors\"],\n      }\n\n      describe(\"all exports\", () => {\n        it(\"should not have duplicate functions\", () => {\n          const ajv = new _Ajv({\n            allErrors: true,\n            code: {optimize: false, source: true},\n            inlineRefs: false, // it is needed to show the issue, schemas with refs won't be inlined anyway\n            schemas: [userSchema, infoSchema],\n          })\n\n          const moduleCode = standaloneCode(ajv)\n          assertNoDuplicateFunctions(moduleCode)\n          const {\"user.json\": user, \"info.json\": info} = requireFromString(moduleCode)\n          testExports({user, info})\n        })\n      })\n\n      describe(\"named exports\", () => {\n        it(\"should not have duplicate functions\", () => {\n          const ajv = new _Ajv({\n            allErrors: true,\n            code: {optimize: false, source: true},\n            inlineRefs: false, // it is needed to show the issue, schemas with refs won't be inlined anyway\n            schemas: [userSchema, infoSchema],\n          })\n\n          const moduleCode = standaloneCode(ajv, {user: \"user.json\", info: \"info.json\"})\n          assertNoDuplicateFunctions(moduleCode)\n          testExports(requireFromString(moduleCode))\n        })\n      })\n    })\n\n    function assertNoDuplicateFunctions(code: string): void {\n      const funcs = code.match(/function\\s+([a-z0-9_$]+)/gi)\n      assert(Array.isArray(funcs))\n      assert(funcs.length > 0)\n      assert.strictEqual(funcs.length, new Set(funcs).size, \"should have no duplicates\")\n    }\n\n    function testExports(validate: {[n: string]: AnyValidateFunction<unknown>}): void {\n      assert.strictEqual(validate.user({}), false)\n      assert.strictEqual(validate.user({name: \"usr1\"}), true)\n\n      assert.strictEqual(validate.info({}), false)\n      assert.strictEqual(\n        validate.info({\n          author: {name: \"usr1\"},\n          contributors: [{name: \"usr2\"}],\n        }),\n        true\n      )\n    }\n  })\n\n  it(\"should generate module code with a single export - CJS\", () => {\n    const ajv = new _Ajv({code: {source: true}})\n    const v = ajv.compile({\n      type: \"number\",\n      minimum: 0,\n    })\n    const moduleCode = standaloneCode(ajv, v)\n    testExportTypeCjs(moduleCode, true)\n    const m = requireFromString(moduleCode)\n    testExport(m)\n    testExport(m.default)\n\n    function testExport(validate: AnyValidateFunction<unknown>) {\n      assert.strictEqual(validate(1), true)\n      assert.strictEqual(validate(0), true)\n      assert.strictEqual(validate(-1), false)\n      assert.strictEqual(validate(\"1\"), false)\n    }\n  })\n\n  it(\"should generate module code with a single export - ESM\", () => {\n    const ajv = new _Ajv({code: {source: true, esm: true}})\n    const v = ajv.compile({\n      type: \"number\",\n      minimum: 0,\n    })\n    const moduleCode = standaloneCode(ajv, v)\n    testExportTypeEsm(moduleCode, true)\n    const m = importFromStringSync(moduleCode)\n    testExport(m.validate)\n    testExport(m.default)\n\n    function testExport(validate: AnyValidateFunction<unknown>) {\n      assert.strictEqual(validate(1), true)\n      assert.strictEqual(validate(0), true)\n      assert.strictEqual(validate(-1), false)\n      assert.strictEqual(validate(\"1\"), false)\n    }\n  })\n\n  describe(\"standalone code with ajv-formats\", () => {\n    const schema = {\n      $schema: \"http://json-schema.org/draft-07/schema#\",\n      definitions: {\n        User: {\n          type: \"object\",\n          properties: {\n            email: {\n              type: \"string\",\n              format: \"email\",\n            },\n          },\n          required: [\"email\"],\n          additionalProperties: false,\n        },\n      },\n    }\n\n    it(\"should support formats with standalone code\", () => {\n      const ajv = new _Ajv({code: {source: true}})\n      ajvFormats(ajv)\n      ajv.addSchema(schema)\n      const moduleCode = standaloneCode(ajv, {validateUser: \"#/definitions/User\"})\n      const {validateUser} = requireFromString(moduleCode)\n\n      assert(typeof validateUser == \"function\")\n      assert.strictEqual(validateUser({}), false)\n      assert.strictEqual(validateUser({email: \"foo\"}), false)\n      assert.strictEqual(validateUser({email: \"foo@bar.com\"}), true)\n    })\n  })\n\n  describe(\"standalone code with RegExp format\", () => {\n    const schema = {\n      $schema: \"http://json-schema.org/draft-07/schema#\",\n      definitions: {\n        User: {\n          type: \"object\",\n          properties: {\n            username: {\n              type: \"string\",\n              format: \"username\",\n            },\n          },\n          required: [\"username\"],\n          additionalProperties: false,\n        },\n      },\n    }\n\n    it(\"should support RegExp format with standalone code\", () => {\n      const ajv = new _Ajv({code: {source: true}})\n      ajv.addFormat(\"username\", /[a-z][a-z0-9_]*/i)\n      ajv.addSchema(schema)\n      const moduleCode = standaloneCode(ajv, {validateUser: \"#/definitions/User\"})\n      const {validateUser} = requireFromString(moduleCode)\n\n      assert(typeof validateUser == \"function\")\n      assert.strictEqual(validateUser({}), false)\n      assert.strictEqual(validateUser({username: \"foo_bar\"}), true)\n      assert.strictEqual(validateUser({email: \"foo bar\"}), false)\n    })\n  })\n})\n"
  },
  {
    "path": "spec/tests/issues/12_restoring_root_after_resolve.json",
    "content": "[\n  {\n    \"description\": \"restoring root after ref resolution (#12)\",\n    \"schema\": {\n      \"definitions\": {\n        \"int\": {\"$ref\": \"http://localhost:1234/integer.json\"},\n        \"str\": {\"type\": \"string\"}\n      },\n      \"anyOf\": [{\"$ref\": \"#/definitions/int\"}, {\"$ref\": \"#/definitions/str\"}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid string\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid number\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"all refs are in the same place\",\n    \"schema\": {\n      \"definitions\": {\n        \"int\": {\"type\": \"integer\"},\n        \"str\": {\"type\": \"string\"}\n      },\n      \"anyOf\": [{\"$ref\": \"#/definitions/int\"}, {\"$ref\": \"#/definitions/str\"}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid string\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid number\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/13_root_ref_in_ref_in_remote_ref.json",
    "content": "[\n  {\n    \"description\": \"root ref in remote ref (#13)\",\n    \"schema\": {\n      \"$id\": \"http://localhost:1234/issue13\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\"$ref\": \"name.json#/definitions/orNull\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"string is valid\",\n        \"data\": {\n          \"name\": \"foo\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"null is valid\",\n        \"data\": {\n          \"name\": null\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"object is invalid\",\n        \"data\": {\n          \"name\": {\n            \"name\": null\n          }\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/14_ref_in_remote_ref_with_id.json",
    "content": "[\n  {\n    \"description\": \"ref in remote ref with ids\",\n    \"schema\": {\n      \"$id\": \"http://localhost:1234/issue14a.json\",\n      \"type\": \"array\",\n      \"items\": {\"$ref\": \"foo.json\"}\n    },\n    \"tests\": [\n      {\n        \"description\": \"string is valid\",\n        \"data\": [\n          {\n            \"bar\": \"any string\"\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"not string is invalid\",\n        \"data\": [\n          {\n            \"bar\": 1\n          }\n        ],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"remote ref in definitions in remote ref with ids (#14)\",\n    \"schema\": {\n      \"$id\": \"http://localhost:1234/issue14b.json\",\n      \"type\": \"array\",\n      \"items\": {\"$ref\": \"buu.json#/definitions/buu\"}\n    },\n    \"tests\": [\n      {\n        \"description\": \"string is valid\",\n        \"data\": [\n          {\n            \"bar\": \"any string\"\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"not string is invalid\",\n        \"data\": [\n          {\n            \"bar\": 1\n          }\n        ],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/1668_not_with_other_keywords.json",
    "content": "[\n  {\n    \"description\": \"not with allOf\",\n    \"schema\": {\n      \"allOf\": [{\"const\": 1}],\n      \"not\": {\"const\": true}\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid (const)\",\n        \"data\": 3,\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid (not)\",\n        \"data\": true,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"not with anyOf\",\n    \"schema\": {\n      \"anyOf\": [{\"const\": 1}],\n      \"not\": {\"const\": true}\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid (const)\",\n        \"data\": 3,\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid (not)\",\n        \"data\": true,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"not with oneOf\",\n    \"schema\": {\n      \"oneOf\": [{\"const\": 1}],\n      \"not\": {\"const\": true}\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid (const)\",\n        \"data\": 3,\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid (not)\",\n        \"data\": true,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"not with properties\",\n    \"schema\": {\n      \"not\": {\n        \"properties\": {\n          \"foo\": {\"const\": true}\n        }\n      },\n      \"properties\": {\n        \"foo\": {\"const\": 1}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid (const)\",\n        \"data\": {\"foo\": 3},\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid (not)\",\n        \"data\": {\"foo\": true},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/170_ref_and_id_in_sibling.json",
    "content": "[\n  {\n    \"description\": \"sibling property has id (#170)\",\n    \"schemas\": [\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_object_1\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"$id\": \"http://example.com/title\",\n            \"type\": \"string\"\n          },\n          \"file\": {\"$ref\": \"#/definitions/file-entry\"}\n        },\n        \"definitions\": {\n          \"file-entry\": {\"type\": \"string\"}\n        }\n      },\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_object_2\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"$id\": \"http://example.com/title\",\n            \"type\": \"string\"\n          },\n          \"file\": {\"$ref\": \"#/definitions/file-entry\"}\n        },\n        \"definitions\": {\n          \"file-entry\": {\"type\": \"string\"}\n        }\n      }\n    ],\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\n          \"title\": \"foo\",\n          \"file\": \"bar\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {\n          \"title\": \"foo\",\n          \"file\": 2\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"sibling item has id\",\n    \"schemas\": [\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_array_1\",\n        \"type\": \"array\",\n        \"items\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"string\"\n          },\n          {\"$ref\": \"#/definitions/file-entry\"}\n        ],\n        \"definitions\": {\n          \"file-entry\": {\"type\": \"string\"}\n        }\n      },\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_array_2\",\n        \"type\": \"array\",\n        \"items\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"string\"\n          },\n          {\"$ref\": \"#/definitions/file-entry\"}\n        ],\n        \"definitions\": {\n          \"file-entry\": {\"type\": \"string\"}\n        }\n      }\n    ],\n    \"tests\": [\n      {\n        \"description\": \"valid array\",\n        \"data\": [\"foo\", \"bar\"],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid array\",\n        \"data\": [\"foo\", 2],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"sibling schema in anyOf has id\",\n    \"schemas\": [\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_anyof_1\",\n        \"anyOf\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"number\"\n          },\n          {\"$ref\": \"#/definitions/def\"}\n        ],\n        \"definitions\": {\n          \"def\": {\"type\": \"string\"}\n        }\n      },\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_anyof_2\",\n        \"anyOf\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"number\"\n          },\n          {\"$ref\": \"#/definitions/def\"}\n        ],\n        \"definitions\": {\n          \"def\": {\"type\": \"string\"}\n        }\n      }\n    ],\n    \"tests\": [\n      {\n        \"description\": \"valid string\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid number\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"sibling schema in oneOf has id\",\n    \"schemas\": [\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_oneof_1\",\n        \"oneOf\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"number\"\n          },\n          {\"$ref\": \"#/definitions/def\"}\n        ],\n        \"definitions\": {\n          \"def\": {\"type\": \"string\"}\n        }\n      },\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_oneof_2\",\n        \"oneOf\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"number\"\n          },\n          {\"$ref\": \"#/definitions/def\"}\n        ],\n        \"definitions\": {\n          \"def\": {\"type\": \"string\"}\n        }\n      }\n    ],\n    \"tests\": [\n      {\n        \"description\": \"valid string\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid number\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"sibling schema in allOf has id\",\n    \"schemas\": [\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_allof_1\",\n        \"allOf\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"string\",\n            \"maxLength\": 3\n          },\n          {\"$ref\": \"#/definitions/def\"}\n        ],\n        \"definitions\": {\n          \"def\": {\"type\": \"string\"}\n        }\n      },\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_allof_2\",\n        \"allOf\": [\n          {\n            \"$id\": \"http://example.com/0\",\n            \"type\": \"string\",\n            \"maxLength\": 3\n          },\n          {\"$ref\": \"#/definitions/def\"}\n        ],\n        \"definitions\": {\n          \"def\": {\"type\": \"string\"}\n        }\n      }\n    ],\n    \"tests\": [\n      {\n        \"description\": \"valid string\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid string\",\n        \"data\": \"quux\",\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"sibling schema in dependencies has id\",\n    \"schemas\": [\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_dependencies_1\",\n        \"type\": \"object\",\n        \"dependencies\": {\n          \"foo\": {\n            \"$id\": \"http://example.com/foo\",\n            \"required\": [\"bar\"]\n          },\n          \"bar\": {\"$ref\": \"#/definitions/def\"}\n        },\n        \"definitions\": {\n          \"def\": {\"required\": [\"baz\"]}\n        }\n      },\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"http://example.com/base_dependencies_2\",\n        \"type\": \"object\",\n        \"dependencies\": {\n          \"foo\": {\n            \"$id\": \"http://example.com/foo\",\n            \"required\": [\"bar\"]\n          },\n          \"bar\": {\"$ref\": \"#/definitions/def\"}\n        },\n        \"definitions\": {\n          \"def\": {\"required\": [\"baz\"]}\n        }\n      }\n    ],\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"foo\": 1, \"bar\": 2, \"baz\": 3},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object 2\",\n        \"data\": {\"foo\": 1},\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid object 2\",\n        \"data\": {\"foo\": 1, \"bar\": 2},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/17_escaping_pattern_property.json",
    "content": "[\n  {\n    \"description\": \"escaping pattern property (#17)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"patternProperties\": {\n        \"^.+$\": {\n          \"type\": \"object\",\n          \"required\": [\"unit\"]\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"tests\": [\n      {\n        \"description\": \"empty object\",\n        \"data\": {},\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/19_required_many_properties.json",
    "content": "[\n  {\n    \"description\": \"Required for many properties in inner level (#19)\",\n    \"schema\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"p1\",\n          \"p2\",\n          \"p3\",\n          \"p4\",\n          \"p5\",\n          \"p6\",\n          \"p7\",\n          \"p8\",\n          \"p9\",\n          \"p10\",\n          \"p11\",\n          \"p12\",\n          \"p13\",\n          \"p14\",\n          \"p15\",\n          \"p16\",\n          \"p17\",\n          \"p18\",\n          \"p19\",\n          \"p20\",\n          \"p21\",\n          \"p22\"\n        ]\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": [\n          {\n            \"p1\": \"test\",\n            \"p2\": \"test\",\n            \"p3\": \"test\",\n            \"p4\": \"test\",\n            \"p5\": \"test\",\n            \"p6\": \"test\",\n            \"p7\": \"test\",\n            \"p8\": \"test\",\n            \"p9\": \"test\",\n            \"p10\": \"test\",\n            \"p11\": \"test\",\n            \"p12\": \"test\",\n            \"p13\": \"test\",\n            \"p14\": \"test\",\n            \"p15\": \"test\",\n            \"p16\": \"test\",\n            \"p17\": \"test\",\n            \"p18\": \"test\",\n            \"p19\": \"test\",\n            \"p20\": \"test\",\n            \"p21\": \"test\",\n            \"p22\": \"test\"\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid\",\n        \"data\": [\n          {\n            \"p2\": \"test\",\n            \"p3\": \"test\",\n            \"p4\": \"test\",\n            \"p5\": \"test\",\n            \"p6\": \"test\",\n            \"p7\": \"test\",\n            \"p8\": \"test\",\n            \"p9\": \"test\",\n            \"p10\": \"test\",\n            \"p11\": \"test\",\n            \"p12\": \"test\",\n            \"p13\": \"test\",\n            \"p14\": \"test\",\n            \"p15\": \"test\",\n            \"p16\": \"test\",\n            \"p17\": \"test\",\n            \"p18\": \"test\",\n            \"p19\": \"test\",\n            \"p20\": \"test\",\n            \"p21\": \"test\",\n            \"p22\": \"test\"\n          }\n        ],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/1_ids_in_refs.json",
    "content": "[\n  {\n    \"description\": \"IDs in refs without root id (#1)\",\n    \"schemas\": [\n      {\n        \"definitions\": {\n          \"int\": {\n            \"$id\": \"#int\",\n            \"type\": \"integer\"\n          }\n        },\n        \"$ref\": \"#int\"\n      },\n      {\n        \"definitions\": {\n          \"int\": {\n            \"$id\": \"#int\",\n            \"type\": \"integer\"\n          }\n        },\n        \"$ref\": \"#int\"\n      }\n    ],\n    \"tests\": [\n      {\"description\": \"valid\", \"data\": 1, \"valid\": true},\n      {\"description\": \"invalid\", \"data\": \"foo\", \"valid\": false}\n    ]\n  },\n  {\n    \"description\": \"IDs in refs with root id\",\n    \"schemas\": [\n      {\n        \"$id\": \"http://example.com/int_1.json\",\n        \"definitions\": {\n          \"int\": {\n            \"$id\": \"#int\",\n            \"type\": \"integer\"\n          }\n        },\n        \"$ref\": \"#int\"\n      },\n      {\n        \"$id\": \"http://example.com/int_2.json\",\n        \"definitions\": {\n          \"int\": {\n            \"$id\": \"#int\",\n            \"type\": \"integer\"\n          }\n        },\n        \"$ref\": \"#int\"\n      }\n    ],\n    \"tests\": [\n      {\"description\": \"valid\", \"data\": 1, \"valid\": true},\n      {\"description\": \"invalid\", \"data\": \"foo\", \"valid\": false}\n    ]\n  },\n  {\n    \"description\": \"Definitions instead of IDs\",\n    \"schema\": {\n      \"definitions\": {\n        \"int\": {\n          \"type\": \"integer\"\n        }\n      },\n      \"$ref\": \"#/definitions/int\"\n    },\n    \"tests\": [\n      {\"description\": \"valid\", \"data\": 1, \"valid\": true},\n      {\"description\": \"invalid\", \"data\": \"foo\", \"valid\": false}\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/20_failing_to_parse_schema.json",
    "content": "[\n  {\n    \"description\": \"Failing to parse schema with required property that is not an identifier (#20)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"required\": [\"a-b\", \"a'\", \"a\\\"\"]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": {\n          \"a-b\": \"test\",\n          \"a'\": \"test\",\n          \"a\\\"\": \"test\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid\",\n        \"data\": {},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"Failing to parse schema with required property that is not an identifier for many properties (#20)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"a-1\",\n        \"a-2\",\n        \"a-3\",\n        \"a-4\",\n        \"a-5\",\n        \"a-6\",\n        \"a-7\",\n        \"a-8\",\n        \"a-9\",\n        \"a-10\",\n        \"a-11\",\n        \"a-12\",\n        \"a-13\",\n        \"a-14\",\n        \"a-15\",\n        \"a-16\",\n        \"a-17\",\n        \"a-18\",\n        \"a-19\",\n        \"a-20\",\n        \"a-21\",\n        \"a-22\",\n        \"'\",\n        \"\\\"\"\n      ]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": {\n          \"a-1\": \"test\",\n          \"a-2\": \"test\",\n          \"a-3\": \"test\",\n          \"a-4\": \"test\",\n          \"a-5\": \"test\",\n          \"a-6\": \"test\",\n          \"a-7\": \"test\",\n          \"a-8\": \"test\",\n          \"a-9\": \"test\",\n          \"a-10\": \"test\",\n          \"a-11\": \"test\",\n          \"a-12\": \"test\",\n          \"a-13\": \"test\",\n          \"a-14\": \"test\",\n          \"a-15\": \"test\",\n          \"a-16\": \"test\",\n          \"a-17\": \"test\",\n          \"a-18\": \"test\",\n          \"a-19\": \"test\",\n          \"a-20\": \"test\",\n          \"a-21\": \"test\",\n          \"a-22\": \"test\",\n          \"'\": \"test\",\n          \"\\\"\": \"test\"\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid\",\n        \"data\": {},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/226_json_with_control_chars.json",
    "content": "[\n  {\n    \"description\": \"JSON with control characters - 'properties' (#226)\",\n    \"schema\": {\n      \"properties\": {\n        \"foo\\nbar\": {\"type\": \"number\"},\n        \"foo\\\"bar\": {\"type\": \"number\"},\n        \"foo\\\\bar\": {\"type\": \"number\"},\n        \"foo\\rbar\": {\"type\": \"number\"},\n        \"foo\\tbar\": {\"type\": \"number\"},\n        \"foo\\fbar\": {\"type\": \"number\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with all numbers is valid\",\n        \"data\": {\n          \"foo\\nbar\": 1,\n          \"foo\\\"bar\": 1,\n          \"foo\\\\bar\": 1,\n          \"foo\\rbar\": 1,\n          \"foo\\tbar\": 1,\n          \"foo\\fbar\": 1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"object with strings is invalid\",\n        \"data\": {\n          \"foo\\nbar\": \"1\",\n          \"foo\\\"bar\": \"1\",\n          \"foo\\\\bar\": \"1\",\n          \"foo\\rbar\": \"1\",\n          \"foo\\tbar\": \"1\",\n          \"foo\\fbar\": \"1\"\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"JSON with control characters - 'required' (#226)\",\n    \"schema\": {\n      \"required\": [\"foo\\nbar\", \"foo\\\"bar\", \"foo\\\\bar\", \"foo\\rbar\", \"foo\\tbar\", \"foo\\fbar\"]\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with all properties present is valid\",\n        \"data\": {\n          \"foo\\nbar\": 1,\n          \"foo\\\"bar\": 1,\n          \"foo\\\\bar\": 1,\n          \"foo\\rbar\": 1,\n          \"foo\\tbar\": 1,\n          \"foo\\fbar\": 1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"object with some properties missing is invalid\",\n        \"data\": {\n          \"foo\\nbar\": \"1\",\n          \"foo\\\"bar\": \"1\"\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"JSON with control characters - 'enum'\",\n    \"schema\": {\n      \"enum\": [\"foo\\nbar\", \"foo\\rbar\"]\n    },\n    \"tests\": [\n      {\n        \"description\": \"member 1 is valid\",\n        \"data\": \"foo\\nbar\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"member 2 is valid\",\n        \"data\": \"foo\\rbar\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"another string is invalid\",\n        \"data\": \"abc\",\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"JSON with control characters - 'dependencies'\",\n    \"schema\": {\n      \"dependencies\": {\n        \"foo\\nbar\": [\"foo\\rbar\"],\n        \"foo\\tbar\": {\n          \"minProperties\": 4\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object 1\",\n        \"data\": {\n          \"foo\\nbar\": 1,\n          \"foo\\rbar\": 2\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid object 2\",\n        \"data\": {\n          \"foo\\tbar\": 1,\n          \"a\": 2,\n          \"b\": 3,\n          \"c\": 4\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object 1\",\n        \"data\": {\n          \"foo\\nbar\": 1,\n          \"foo\": 2\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid object 2\",\n        \"data\": {\n          \"foo\\tbar\": 1,\n          \"a\": 2\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/27_1_recursive_raml_schema.json",
    "content": "[\n  {\n    \"description\": \"JSON Schema for a standard RAML object (#27)\",\n    \"schema\": {\n      \"title\": \"A JSON Schema for a standard RAML object\",\n      \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n      \"type\": \"object\",\n      \"required\": [\"title\"],\n      \"properties\": {\n        \"title\": {\n          \"type\": \"string\",\n          \"description\": \"The title property is a short plain text description of the RESTful API. The title property's value SHOULD be suitable for use as a title for the contained user documentation.\"\n        },\n        \"version\": {\n          \"type\": \"string\",\n          \"description\": \"If the RAML API definition is targeted to a specific API version, the API definition MUST contain a version property.\"\n        },\n        \"baseUri\": {\n          \"type\": \"string\",\n          \"format\": \"uri\",\n          \"description\": \"A RESTful API's resources are defined relative to the API's base URI. The use of the baseUri field is OPTIONAL to allow describing APIs that have not yet been implemented.\"\n        },\n        \"baseUriParameters\": {\n          \"$ref\": \"#/definitions/namedParameters\"\n        },\n        \"mediaType\": {\n          \"$ref\": \"#/definitions/mediaType\"\n        },\n        \"protocols\": {\n          \"$ref\": \"#/definitions/protocols\"\n        },\n        \"securitySchemes\": {\n          \"$ref\": \"#/definitions/securitySchemes\"\n        },\n        \"securedBy\": {\n          \"$ref\": \"#/definitions/securedBy\"\n        },\n        \"documentation\": {\n          \"$ref\": \"#/definitions/documentation\"\n        },\n        \"resources\": {\n          \"$ref\": \"#/definitions/rootResource\"\n        },\n        \"traits\": {\n          \"$ref\": \"#/definitions/traits\"\n        },\n        \"resourceTypes\": {\n          \"$ref\": \"#/definitions/resourceTypes\"\n        }\n      },\n      \"definitions\": {\n        \"namedParameters\": {\n          \"patternProperties\": {\n            \"^[\\\\w-]+$\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/definitions/namedParameter\"\n                },\n                {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/definitions/namedParameter\"\n                  }\n                }\n              ]\n            }\n          },\n          \"description\": \"This RAML Specification describes collections of named parameters for the following properties: URI parameters, query string parameters, form parameters, request bodies (depending on the media type), and request and response headers. Read more: https://github.com/raml-org/raml-spec/blob/master/raml-0.8.md#named-parameters\"\n        },\n        \"namedParameter\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"displayName\": {\n              \"type\": \"string\",\n              \"description\": \"The displayName attribute specifies the parameter's display name. It is a friendly name used only for display or documentation purposes. If displayName is not specified, it defaults to the property's key (the name of the property itself).\"\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"The description attribute describes the intended use or meaning of the parameter. This value MAY be formatted using Markdown.\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"string\", \"number\", \"integer\", \"date\", \"boolean\", \"file\"],\n              \"default\": \"string\",\n              \"description\": \"The type attribute specifies the primitive type of the parameter's resolved value. If the type is not specified, it defaults to string. API clients MUST return/throw an error if the parameter's resolved value does not match the specified type.\"\n            },\n            \"enum\": {\n              \"$ref\": \"#/definitions/enum\",\n              \"description\": \"The enum attribute provides an enumeration of the parameter's valid values. This MUST be an array. If the enum attribute is defined, API clients and servers MUST verify that a parameter's value matches a value in the enum array. If there is no matching value, the clients and servers MUST treat this as an error.\"\n            },\n            \"pattern\": {\n              \"type\": \"string\",\n              \"format\": \"regex\",\n              \"description\": \"The pattern attribute is a regular expression that a parameter of type string MUST match. Regular expressions MUST follow the regular expression specification from ECMA 262/Perl 5.\"\n            },\n            \"minLength\": {\n              \"$ref\": \"#/definitions/minIntegerDefault0\",\n              \"description\": \"The minLength attribute specifies the parameter value's minimum number of characters.\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"#/definitions/minInteger\",\n              \"description\": \"The maxLength attribute specifies the parameter value's maximum number of characters.\"\n            },\n            \"minimum\": {\n              \"type\": \"number\",\n              \"description\": \"The minimum attribute specifies the parameter's minimum value.\"\n            },\n            \"maximum\": {\n              \"type\": \"number\",\n              \"description\": \"The maximum attribute specifies the parameter's maximum value.\"\n            },\n            \"example\": {\n              \"$ref\": \"#/definitions/primitiveType\",\n              \"description\": \"The example attribute shows an example value for the property. This can be used, e.g., by documentation generators to generate sample values for the property.\"\n            },\n            \"repeat\": {\n              \"$ref\": \"#/definitions/booleanDefaultFalse\",\n              \"description\": \"The repeat attribute specifies that the parameter can be repeated. If the parameter can be used multiple times, the repeat parameter value MUST be set to true. Otherwise, the default value is false and the parameter may not be repeated.\"\n            },\n            \"required\": {\n              \"$ref\": \"#/definitions/booleanDefaultFalse\",\n              \"description\": \"The required attribute specifies whether the parameter and its value MUST be present in the API definition. It must be either 'true' if the value MUST be present or false otherwise. arameters are optional unless the required attribute is included and its value set to true. For a URI parameter, the required attribute MAY be omitted, but its default value is true.\"\n            },\n            \"default\": {\n              \"$ref\": \"#/definitions/primitiveType\",\n              \"default\": \"The default attribute specifies the default value to use for the property if the property is omitted or its value is not specified. This SHOULD NOT be interpreted as a requirement for the client to send the default attribute's value if there is no other value to send. Instead, the default attribute's value is the value the server uses if the client does not send a value.\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"mediaType\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[a-zA-Z0-9!#$%^&*_\\\\-+{}|'.`~]+/[a-zA-Z0-9!#$%^&*_\\\\-+{}|'.`~]+$\",\n          \"description\": \"The media types returned by API responses, and expected from API requests that accept a body, MAY be defaulted by specifying the mediaType property.\"\n        },\n        \"protocols\": {\n          \"type\": \"array\",\n          \"minItems\": 1,\n          \"items\": {\n            \"type\": \"string\",\n            \"enum\": [\"HTTP\", \"HTTPS\"]\n          },\n          \"uniqueItems\": true,\n          \"description\": \"A RESTful API can be reached via HTTP, HTTPS, or both. The protocols property MAY be used to specify the protocols that an API supports. If the protocols property is not specified, the protocol specified at the baseUri property is used.\"\n        },\n        \"securitySchemes\": {\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^[\\\\w-]+$\": {\n              \"$ref\": \"#/definitions/securityScheme\"\n            }\n          },\n          \"additionalProperties\": false,\n          \"description\": \"The securitySchemes property MUST be used to specify an API's security mechanisms, including the required settings and the authentication methods that the API supports. one authentication method is allowed if the API supports them.\"\n        },\n        \"securityScheme\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"description\": \"The type attribute MAY be used to convey information about authentication flows and mechanisms to processing applications such as Documentation Generators and Client generators.\"\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"The description attribute MAY be used to describe a securitySchemes property.\"\n            },\n            \"describedBy\": {\n              \"$ref\": \"#/definitions/describedBy\"\n            },\n            \"settings\": {\n              \"type\": \"object\",\n              \"description\": \"The settings attribute MAY be used to provide security schema-specific information. Depending on the value of the type parameter, its attributes can vary.\"\n            }\n          },\n          \"oneOf\": [\n            {\n              \"type\": \"object\",\n              \"required\": [\"type\"],\n              \"properties\": {\n                \"type\": {\n                  \"enum\": [\"OAuth 1.0\"]\n                },\n                \"settings\": {\n                  \"type\": \"object\",\n                  \"required\": [\"requestTokenUri\", \"authorizationUri\", \"tokenCredentialsUri\"],\n                  \"properties\": {\n                    \"requestTokenUri\": {\n                      \"type\": \"string\",\n                      \"format\": \"uri\"\n                    },\n                    \"authorizationUri\": {\n                      \"type\": \"string\",\n                      \"format\": \"uri\"\n                    },\n                    \"tokenCredentialsUri\": {\n                      \"type\": \"string\",\n                      \"format\": \"uri\"\n                    }\n                  }\n                }\n              }\n            },\n            {\n              \"type\": \"object\",\n              \"required\": [\"type\"],\n              \"properties\": {\n                \"type\": {\n                  \"enum\": [\"OAuth 2.0\"]\n                },\n                \"settings\": {\n                  \"type\": \"object\",\n                  \"required\": [\"authorizationUri\", \"accessTokenUri\", \"authorizationGrants\"],\n                  \"properties\": {\n                    \"authorizationUri\": {\n                      \"type\": \"string\",\n                      \"format\": \"uri\"\n                    },\n                    \"accessTokenUri\": {\n                      \"type\": \"string\",\n                      \"format\": \"uri\"\n                    },\n                    \"authorizationGrants\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"enum\": [\"code\", \"token\", \"owner\", \"credentials\"]\n                      }\n                    },\n                    \"scopes\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\"\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            {\n              \"type\": \"object\",\n              \"required\": [\"type\"],\n              \"properties\": {\n                \"type\": {\n                  \"oneOf\": [\n                    {\n                      \"enum\": [\"Basic Authentication\", \"Digest Authentication\"]\n                    },\n                    {\n                      \"type\": \"string\",\n                      \"pattern\": \"^x-\"\n                    }\n                  ]\n                }\n              }\n            }\n          ],\n          \"additionalProperties\": false\n        },\n        \"traits\": {\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^[\\\\w-]+$\": {\n              \"$ref\": \"#/definitions/trait\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"describedBy\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"description\": {\n              \"type\": \"string\"\n            },\n            \"queryParameters\": {\n              \"$ref\": \"#/definitions/namedParameters\"\n            },\n            \"headers\": {\n              \"$ref\": \"#/definitions/namedParameters\"\n            },\n            \"responses\": {\n              \"$ref\": \"#/definitions/responses\"\n            },\n            \"body\": {\n              \"$ref\": \"#/definitions/body\"\n            }\n          },\n          \"additionalProperties\": false,\n          \"description\": \"The describedBy attribute MAY be used to apply a trait-like structure to a security scheme mechanism so as to extend the mechanism, such as specifying response codes, HTTP headers or custom documentation.\"\n        },\n        \"trait\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"description\": {\n              \"type\": \"string\"\n            },\n            \"queryParameters\": {\n              \"$ref\": \"#/definitions/namedParameters\"\n            },\n            \"headers\": {\n              \"$ref\": \"#/definitions/namedParameters\"\n            },\n            \"responses\": {\n              \"$ref\": \"#/definitions/responses\"\n            },\n            \"body\": {\n              \"$ref\": \"#/definitions/body\"\n            },\n            \"securedBy\": {\n              \"$ref\": \"#/definitions/securedBy\"\n            }\n          },\n          \"additionalProperties\": false,\n          \"description\": \"A trait is a partial method definition that, like a method, can provide method-level properties such as description, headers, query string parameters, and responses. Methods that use one or more traits inherit those traits' properties.\"\n        },\n        \"resourceTypes\": {\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^[\\\\w-]+$\": {\n              \"$ref\": \"#/definitions/resourceType\"\n            }\n          }\n        },\n        \"resourceType\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"is\": {\n              \"$ref\": \"#/definitions/is\"\n            },\n            \"type\": {\n              \"$ref\": \"#/definitions/reference\"\n            }\n          },\n          \"patternProperties\": {\n            \"^(?:head|get|post|put|patch|delete|options|trace|connect)\\\\??$\": {\n              \"$ref\": \"#/definitions/method\"\n            }\n          },\n          \"additionalProperties\": false,\n          \"description\": \"A resource type is a partial resource definition that, like a resource, can specify a description and methods and their properties. Resources that use a resource type inherit its properties, such as its methods.\"\n        },\n        \"body\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"formParameters\": {\n              \"$ref\": \"#/definitions/namedParameters\"\n            },\n            \"application/x-www-form-urlencoded\": {\n              \"$ref\": \"#/definitions/formBody\"\n            },\n            \"multipart/form-data\": {\n              \"$ref\": \"#/definitions/formBody\"\n            },\n            \"application/json\": {\n              \"$ref\": \"#/definitions/schemaBody\"\n            },\n            \"text/xml\": {\n              \"$ref\": \"#/definitions/schemaBody\"\n            }\n          },\n          \"patternProperties\": {\n            \"^[a-zA-Z0-9!#$%^&*_\\\\-+{}|'.`~]+/[a-zA-Z0-9!#$%^&*_\\\\-+{}|'.`~]+$\": {\n              \"$ref\": \"#/definitions/standardResponseBody\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"formBody\": {\n          \"$ref\": \"#/definitions/responseBody\",\n          \"properties\": {\n            \"formParameters\": {\n              \"$ref\": \"#/definitions/namedParameters\"\n            }\n          },\n          \"additionalProperties\": false,\n          \"description\": \"Web forms REQUIRE special encoding and custom declaration.\"\n        },\n        \"schemaBody\": {\n          \"$ref\": \"#/definitions/responseBody\",\n          \"properties\": {\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          \"additionalProperties\": false,\n          \"description\": \"The structure of a request or response body MAY be further specified by the schema property under the appropriate media type.\"\n        },\n        \"standardResponseBody\": {\n          \"$ref\": \"#/definitions/responseBody\",\n          \"additionalProperties\": false\n        },\n        \"responseBody\": {\n          \"type\": [\"null\", \"object\"],\n          \"properties\": {\n            \"example\": {\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"responses\": {\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^\\\\d{3}$\": {\n              \"$ref\": \"#/definitions/response\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"response\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"description\": {\n              \"type\": \"string\"\n            },\n            \"headers\": {\n              \"$ref\": \"#/definitions/namedParameters\",\n              \"description\": \"An API's methods may support custom header values in responses. The custom, non-standard HTTP headers MUST be specified by the headers property.\"\n            },\n            \"body\": {\n              \"$ref\": \"#/definitions/body\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"securedBy\": {\n          \"$ref\": \"#/definitions/enum\",\n          \"items\": {\n            \"oneOf\": [\n              {\n                \"type\": \"null\"\n              },\n              {\n                \"$ref\": \"#/definitions/reference\"\n              }\n            ]\n          },\n          \"description\": \"A securityScheme may also be applied to a resource by using the securedBy key, which is equivalent to applying the securityScheme to all methods that may be declared, explicitly or implicitly, by defining the resourceTypes or traits property for that resource.\"\n        },\n        \"reference\": {\n          \"oneOf\": [\n            {\n              \"type\": \"string\",\n              \"pattern\": \"^[\\\\w-]+$\"\n            },\n            {\n              \"type\": \"object\",\n              \"minProperties\": 1,\n              \"maxProperties\": 1,\n              \"patternProperties\": {\n                \"^[\\\\w-]+$\": {\n                  \"type\": \"object\"\n                }\n              }\n            }\n          ]\n        },\n        \"documentation\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"title\": {\n                \"type\": \"string\"\n              },\n              \"content\": {\n                \"type\": \"string\"\n              }\n            },\n            \"additionalProperties\": false\n          },\n          \"description\": \"The API definition can include a variety of documents that serve as a user guides and reference documentation for the API. Such documents can clarify how the API works or provide business context.\"\n        },\n        \"rootResource\": {\n          \"type\": \"object\",\n          \"patternProperties\": {\n            \"^/\": {\n              \"$ref\": \"#/definitions/resource\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"resource\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"displayName\": {\n              \"type\": \"string\",\n              \"description\": \"The displayName attribute provides a friendly name to the resource and can be used by documentation generation tools. The displayName key is OPTIONAL. If the displayName attribute is not defined for a resource, documentation tools SHOULD refer to the resource by its property key (i.e. its relative URI, e.g., \\\"/jobs\\\"), which acts as the resource's name.\"\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"Each resource, whether top-level or nested, MAY contain a description property that briefly describes the resource. It is RECOMMENDED that all the API definition's resources includes the description property.\"\n            },\n            \"uriParameters\": {\n              \"$ref\": \"#/definitions/namedParameters\"\n            },\n            \"is\": {\n              \"$ref\": \"#/definitions/is\"\n            },\n            \"type\": {\n              \"$ref\": \"#/definitions/reference\"\n            }\n          },\n          \"patternProperties\": {\n            \"^(?:head|get|post|put|patch|delete|options|trace|connect)$\": {\n              \"$ref\": \"#/definitions/method\"\n            },\n            \"^/\": {\n              \"$ref\": \"#/definitions/resource\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"method\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"Each declared method MAY contain a description attribute that briefly describes what the method does to the resource. It is RECOMMENDED that all API definition methods include the description property.\"\n            },\n            \"queryParameters\": {\n              \"$ref\": \"#/definitions/namedParameters\",\n              \"description\": \"An API's resources MAY be filtered (to return a subset of results) or altered (such as transforming a response body from JSON to XML format) by the use of query strings. If the resource or its method supports a query string, the query string MUST be defined by the queryParameters property.\"\n            },\n            \"headers\": {\n              \"$ref\": \"#/definitions/namedParameters\",\n              \"description\": \"An API's methods MAY support or require non-standard HTTP headers. In the API definition, specify the non-standard HTTP headers by using the headers property.\"\n            },\n            \"protocols\": {\n              \"$ref\": \"#/definitions/protocols\",\n              \"description\": \"A method can override an API's protocols value for that single method by setting a different value for the fields.\"\n            },\n            \"responses\": {\n              \"$ref\": \"#/definitions/responses\",\n              \"description\": \"Resource methods MAY have one or more responses. Responses MAY be described using the description property, and MAY include example attributes or schema properties.\"\n            },\n            \"body\": {\n              \"$ref\": \"#/definitions/body\",\n              \"description\": \"Some method verbs expect the resource to be sent as a request body. For example, to create a resource, the request must include the details of the resource to create. Resources CAN have alternate representations. For example, an API might support both JSON and XML representations.\"\n            },\n            \"securedBy\": {\n              \"$ref\": \"#/definitions/securedBy\"\n            },\n            \"is\": {\n              \"$ref\": \"#/definitions/is\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"is\": {\n          \"$ref\": \"#/definitions/enum\",\n          \"items\": {\n            \"$ref\": \"#/definitions/reference\"\n          }\n        },\n        \"enum\": {\n          \"type\": \"array\",\n          \"minItems\": 1,\n          \"uniqueItems\": true\n        },\n        \"minInteger\": {\n          \"type\": \"integer\",\n          \"minimum\": 0\n        },\n        \"minIntegerDefault0\": {\n          \"allOf\": [\n            {\n              \"$ref\": \"#/definitions/minInteger\"\n            },\n            {\n              \"default\": 0\n            }\n          ]\n        },\n        \"booleanDefaultFalse\": {\n          \"type\": \"boolean\",\n          \"default\": false\n        },\n        \"date\": {\n          \"type\": \"string\",\n          \"pattern\": \"^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat), \\\\d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} GMT$\"\n        },\n        \"primitiveType\": {\n          \"type\": [\"boolean\", \"integer\", \"number\", \"string\"]\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"tests\": [\n      {\n        \"description\": \"empty object is invalid\",\n        \"data\": {},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/27_recursive_reference.json",
    "content": "[\n  {\n    \"description\": \"Recursive reference (#27)\",\n    \"schemas\": [\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"testrec_1\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"layout\": {\n            \"$id\": \"layout\",\n            \"type\": \"object\",\n            \"properties\": {\n              \"layout\": {\"type\": \"string\"},\n              \"panels\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"anyOf\": [{\"type\": \"string\"}, {\"$ref\": \"layout\"}]\n                }\n              }\n            },\n            \"required\": [\"layout\", \"panels\"]\n          }\n        }\n      },\n      {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"$id\": \"testrec_2\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"layout\": {\n            \"$id\": \"layout\",\n            \"type\": \"object\",\n            \"properties\": {\n              \"layout\": {\"type\": \"string\"},\n              \"panels\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"anyOf\": [{\"type\": \"string\"}, {\"$ref\": \"layout\"}]\n                }\n              }\n            },\n            \"required\": [\"layout\", \"panels\"]\n          }\n        }\n      }\n    ],\n    \"tests\": [\n      {\n        \"description\": \"empty object is valid\",\n        \"data\": {},\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid object\",\n        \"data\": {\n          \"layout\": {\n            \"layout\": \"test1\",\n            \"panels\": [\n              \"panel1\",\n              {\n                \"layout\": \"test2\",\n                \"panels\": [\n                  \"panel2\",\n                  {\n                    \"layout\": \"test3\",\n                    \"panels\": [\"panel3\"]\n                  }\n                ]\n              }\n            ]\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {\n          \"layout\": {\n            \"layout\": \"test1\",\n            \"panels\": [\n              \"panel1\",\n              {\n                \"layout\": \"test2\",\n                \"panels\": [\n                  \"panel2\",\n                  {\n                    \"layout\": \"test3\",\n                    \"panels\": [3]\n                  }\n                ]\n              }\n            ]\n          }\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/28_escaping_pattern_error.json",
    "content": "[\n  {\n    \"description\": \"escaping pattern error (#28)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"mediaType\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[a-zA-Z0-9!#$%^&*_\\\\-+{}|'.`~]+/[a-zA-Z0-9!#$%^&*_\\\\-+{}|'.`~]+$\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"empty object\",\n        \"data\": {},\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/2_root_ref_in_ref.json",
    "content": "[\n  {\n    \"description\": \"root ref in ref (#2)\",\n    \"schema\": {\n      \"definitions\": {\n        \"arr\": {\n          \"type\": \"array\",\n          \"items\": {\"$ref\": \"#\"}\n        }\n      },\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\"type\": \"string\"},\n        \"children\": {\"$ref\": \"#/definitions/arr\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"children\": [{\"name\": \"bar\"}, {\"name\": \"baz\"}]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"child numbers are invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"children\": [{\"name\": 1}, {\"name\": 2}]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"child arrays are invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"children\": [[], []]\n        },\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"root ref in ref with anyOf (#2)\",\n    \"schema\": {\n      \"definitions\": {\n        \"orNull\": {\n          \"anyOf\": [{\"type\": \"null\"}, {\"$ref\": \"#\"}]\n        }\n      },\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\"type\": \"string\"},\n        \"parent\": {\"$ref\": \"#/definitions/orNull\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"null parent is valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"parent\": null\n        },\n        \"valid\": true\n      },\n      {\n        \"skip\": false,\n        \"description\": \"object parent is valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"parent\": {\n            \"name\": \"bar\",\n            \"parent\": null\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"object parent is valid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"parent\": {\n            \"name\": \"bar\",\n            \"parent\": {\n              \"name\": \"baz\",\n              \"parent\": null\n            }\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"string parent is invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"parent\": \"buu\"\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"string subparent is invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"parent\": {\n            \"name\": \"bar\",\n            \"parent\": \"baz\"\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"string sub-subparent is invalid\",\n        \"data\": {\n          \"name\": \"foo\",\n          \"parent\": {\n            \"name\": \"bar\",\n            \"parent\": {\n              \"name\": \"baz\",\n              \"parent\": \"quux\"\n            }\n          }\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/311_quotes_in_refs.json",
    "content": "[\n  {\n    \"description\": \"quotes in refs (#311)\",\n    \"schema\": {\n      \"properties\": {\n        \"foo\\\"bar\": {\"$ref\": \"#/definitions/foo\\\"bar\"}\n      },\n      \"definitions\": {\n        \"foo\\\"bar\": {\"type\": \"number\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with all numbers is valid\",\n        \"data\": {\n          \"foo\\\"bar\": 1,\n          \"foo\\\\bar\": 1,\n          \"foo\\nbar\": 1,\n          \"foo\\rbar\": 1,\n          \"foo\\tbar\": 1,\n          \"foo\\fbar\": 1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"object with strings is invalid\",\n        \"data\": {\n          \"foo\\\"bar\": \"1\",\n          \"foo\\\\bar\": \"1\",\n          \"foo\\nbar\": \"1\",\n          \"foo\\rbar\": \"1\",\n          \"foo\\tbar\": \"1\",\n          \"foo\\fbar\": \"1\"\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/33_json_schema_latest.json",
    "content": "[\n  {\n    \"description\": \"use latest json schema as v4 (#33)\",\n    \"schema\": {\n      \"$schema\": \"http://json-schema.org/schema\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"username\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"empty object\",\n        \"data\": {},\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/413_dependencies_with_quote.json",
    "content": "[\n  {\n    \"description\": \"JSON with control characters - 'dependencies'\",\n    \"schema\": {\n      \"dependencies\": {\n        \"foo'bar\": {\n          \"not\": {\"required\": [\"bar\"]}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\n          \"foo'bar\": 1\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object\",\n        \"data\": {\n          \"foo'bar\": 1,\n          \"bar\": 2\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/490_integer_validation.json",
    "content": "[\n  {\n    \"description\": \"integer validation (#490)\",\n    \"schema\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid integer\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid integer\",\n        \"data\": -1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"non-integer number is invalid\",\n        \"data\": 1.1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"string is invalid\",\n        \"data\": \"foo\",\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/502_contains_empty_array_with_ref_in_another_property.json",
    "content": "[\n  {\n    \"description\": \"\\\"contains\\\" allows empty array when ref is used in sibling property (#502)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"str\": {\"$ref\": \"#/definitions/str\"},\n        \"arr\": {\n          \"type\": \"array\",\n          \"contains\": {\"type\": \"number\"}\n        }\n      },\n      \"definitions\": {\n        \"str\": {\"type\": \"string\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object 1\",\n        \"data\": {\n          \"str\": \"a\",\n          \"arr\": [1]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid object 2\",\n        \"data\": {\n          \"arr\": [1]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid object 1\",\n        \"data\": {\n          \"str\": \"a\",\n          \"arr\": [\"b\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid object 2\",\n        \"data\": {\n          \"arr\": [\"b\"]\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid object 3\",\n        \"data\": {\n          \"arr\": []\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid object 4 (fails in #502)\",\n        \"data\": {\n          \"str\": \"a\",\n          \"arr\": []\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/5_adding_dependency_after.json",
    "content": "[\n  {\n    \"description\": \"Adding dependency after dependent schema (#5)\",\n    \"schema\": \"http://localhost:1234/second.json\",\n    \"tests\": [\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"first\": \"foo\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"valid object\",\n        \"data\": {\"first\": 1},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/5_recursive_references.json",
    "content": "[\n  {\n    \"description\": \"Recursive references between schemas (#5)\",\n    \"schema\": \"http://localhost:1234/tree.json\",\n    \"tests\": [\n      {\n        \"description\": \"valid tree\",\n        \"data\": {\n          \"meta\": \"root\",\n          \"nodes\": [\n            {\n              \"value\": 1,\n              \"subtree\": {\n                \"meta\": \"child\",\n                \"nodes\": [{\"value\": 1.1}, {\"value\": 1.2}]\n              }\n            },\n            {\n              \"value\": 2,\n              \"subtree\": {\n                \"meta\": \"child\",\n                \"nodes\": [{\"value\": 2.1}, {\"value\": 2.2}]\n              }\n            }\n          ]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid tree\",\n        \"data\": {\n          \"meta\": \"root\",\n          \"nodes\": [\n            {\n              \"value\": 1,\n              \"subtree\": {\n                \"meta\": \"child\",\n                \"nodes\": [{\"value\": \"string is invalid\"}, {\"value\": 1.2}]\n              }\n            },\n            {\n              \"value\": 2,\n              \"subtree\": {\n                \"meta\": \"child\",\n                \"nodes\": [{\"value\": 2.1}, {\"value\": 2.2}]\n              }\n            }\n          ]\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/62_resolution_scope_change.json",
    "content": "[\n  {\n    \"description\": \"change resolution scope - change filename (#62)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"$ref\": \"http://localhost:1234/scope_foo.json#/definitions/bar\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"string is valid\",\n        \"data\": {\"title\": \"baz\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": {\"title\": 1},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"resolution scope change - change folder (#62)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"list\": {\n          \"$ref\": \"http://localhost:1234/scope_change.json#/definitions/baz\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"number is valid\",\n        \"data\": {\"list\": [1]},\n        \"valid\": true\n      },\n      {\n        \"description\": \"string is invalid\",\n        \"data\": {\"list\": [\"a\"]},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"resolution scope change - change folder in subschema (#62)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"list\": {\n          \"$ref\": \"http://localhost:1234/scope_change.json#/definitions/baz/bar\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"number is valid\",\n        \"data\": {\"list\": [1]},\n        \"valid\": true\n      },\n      {\n        \"description\": \"string is invalid\",\n        \"data\": {\"list\": [\"a\"]},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/63_id_property_not_in_schema.json",
    "content": "[\n  {\n    \"description\": \"id property in referenced schema in object that is not a schema (#63)\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/title\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"empty object is valid\",\n        \"data\": {},\n        \"valid\": true\n      },\n      {\n        \"description\": \"string is valid\",\n        \"data\": {\"title\": \"foo\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": {\"title\": 1},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/70_1_recursive_hash_ref_in_remote_ref.json",
    "content": "[\n  {\n    \"description\": \"hash ref inside hash ref in remote ref (#70, was passing)\",\n    \"schema\": {\n      \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n    },\n    \"tests\": [\n      {\"data\": 1, \"valid\": true, \"description\": \"positive integer is valid\"},\n      {\"data\": 0, \"valid\": true, \"description\": \"zero is valid\"},\n      {\"data\": -1, \"valid\": false, \"description\": \"negative integer is invalid\"}\n    ]\n  },\n  {\n    \"description\": \"hash ref inside hash ref in remote ref with id (#70, was passing)\",\n    \"schema\": {\n      \"$id\": \"http://example.com/my_schema_2.json\",\n      \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n    },\n    \"tests\": [\n      {\"data\": 1, \"valid\": true, \"description\": \"positive integer is valid\"},\n      {\"data\": 0, \"valid\": true, \"description\": \"zero is valid\"},\n      {\"data\": -1, \"valid\": false, \"description\": \"negative integer is invalid\"}\n    ]\n  },\n  {\n    \"description\": \"local hash ref with remote hash ref without inner hash ref (#70, was passing)\",\n    \"schema\": {\n      \"definitions\": {\n        \"a\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n        }\n      },\n      \"properties\": {\n        \"b\": {\"$ref\": \"#/definitions/a\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"data\": {\"b\": 1},\n        \"valid\": true,\n        \"description\": \"positive integer is valid\"\n      },\n      {\"data\": {\"b\": 0}, \"valid\": true, \"description\": \"zero is valid\"},\n      {\n        \"data\": {\"b\": -1},\n        \"valid\": false,\n        \"description\": \"negative integer is invalid\"\n      }\n    ]\n  },\n  {\n    \"description\": \"local hash ref with remote hash ref that has inner hash ref (#70)\",\n    \"schema\": {\n      \"definitions\": {\n        \"a\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n        }\n      },\n      \"properties\": {\n        \"b\": {\"$ref\": \"#/definitions/a\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"data\": {\"b\": 1},\n        \"valid\": true,\n        \"description\": \"positive integer is valid\"\n      },\n      {\"data\": {\"b\": 0}, \"valid\": true, \"description\": \"zero is valid\"},\n      {\n        \"data\": {\"b\": -1},\n        \"valid\": false,\n        \"description\": \"negative integer is invalid\"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/70_swagger_schema.json",
    "content": "[\n  {\n    \"description\": \"Swagger api schema does not compile (#70)\",\n    \"schema\": {\n      \"title\": \"A JSON Schema for Swagger 2.0 API.\",\n      \"$id\": \"http://swagger.io/v2/schema.json#\",\n      \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n      \"type\": \"object\",\n      \"required\": [\"swagger\", \"info\", \"paths\"],\n      \"additionalProperties\": false,\n      \"patternProperties\": {\n        \"^x-\": {\n          \"$ref\": \"#/definitions/vendorExtension\"\n        }\n      },\n      \"properties\": {\n        \"swagger\": {\n          \"type\": \"string\",\n          \"enum\": [\"2.0\"],\n          \"description\": \"The Swagger version of this document.\"\n        },\n        \"info\": {\n          \"$ref\": \"#/definitions/info\"\n        },\n        \"host\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[^{}/ :\\\\\\\\]+(?::\\\\d+)?$\",\n          \"description\": \"The host (name or ip) of the API. Example: 'swagger.io'\"\n        },\n        \"basePath\": {\n          \"type\": \"string\",\n          \"pattern\": \"^/\",\n          \"description\": \"The base path to the API. Example: '/api'.\"\n        },\n        \"schemes\": {\n          \"$ref\": \"#/definitions/schemesList\"\n        },\n        \"consumes\": {\n          \"description\": \"A list of MIME types accepted by the API.\",\n          \"$ref\": \"#/definitions/mediaTypeList\"\n        },\n        \"produces\": {\n          \"description\": \"A list of MIME types the API can produce.\",\n          \"$ref\": \"#/definitions/mediaTypeList\"\n        },\n        \"paths\": {\n          \"$ref\": \"#/definitions/paths\"\n        },\n        \"definitions\": {\n          \"$ref\": \"#/definitions/definitions\"\n        },\n        \"parameters\": {\n          \"$ref\": \"#/definitions/parameterDefinitions\"\n        },\n        \"responses\": {\n          \"$ref\": \"#/definitions/responseDefinitions\"\n        },\n        \"security\": {\n          \"$ref\": \"#/definitions/security\"\n        },\n        \"securityDefinitions\": {\n          \"$ref\": \"#/definitions/securityDefinitions\"\n        },\n        \"tags\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/tag\"\n          },\n          \"uniqueItems\": true\n        },\n        \"externalDocs\": {\n          \"$ref\": \"#/definitions/externalDocs\"\n        }\n      },\n      \"definitions\": {\n        \"info\": {\n          \"type\": \"object\",\n          \"description\": \"General information about the API.\",\n          \"required\": [\"version\", \"title\"],\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"title\": {\n              \"type\": \"string\",\n              \"description\": \"A unique and precise title of the API.\"\n            },\n            \"version\": {\n              \"type\": \"string\",\n              \"description\": \"A semantic version number of the API.\"\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"A longer description of the API. Should be different from the title.  GitHub Flavored Markdown is allowed.\"\n            },\n            \"termsOfService\": {\n              \"type\": \"string\",\n              \"description\": \"The terms of service for the API.\"\n            },\n            \"contact\": {\n              \"$ref\": \"#/definitions/contact\"\n            },\n            \"license\": {\n              \"$ref\": \"#/definitions/license\"\n            }\n          }\n        },\n        \"contact\": {\n          \"type\": \"object\",\n          \"description\": \"Contact information for the owners of the API.\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The identifying name of the contact person/organization.\"\n            },\n            \"url\": {\n              \"type\": \"string\",\n              \"description\": \"The URL pointing to the contact information.\",\n              \"format\": \"uri\"\n            },\n            \"email\": {\n              \"type\": \"string\",\n              \"description\": \"The email address of the contact person/organization.\",\n              \"format\": \"email\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"license\": {\n          \"type\": \"object\",\n          \"required\": [\"name\"],\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The name of the license type. It's encouraged to use an OSI compatible license.\"\n            },\n            \"url\": {\n              \"type\": \"string\",\n              \"description\": \"The URL pointing to the license.\",\n              \"format\": \"uri\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"paths\": {\n          \"type\": \"object\",\n          \"description\": \"Relative paths to the individual endpoints. They must be relative to the 'basePath'.\",\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            },\n            \"^/\": {\n              \"$ref\": \"#/definitions/pathItem\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"definitions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#/definitions/schema\"\n          },\n          \"description\": \"One or more JSON objects describing the schemas being consumed and produced by the API.\"\n        },\n        \"parameterDefinitions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#/definitions/parameter\"\n          },\n          \"description\": \"One or more JSON representations for parameters\"\n        },\n        \"responseDefinitions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#/definitions/response\"\n          },\n          \"description\": \"One or more JSON representations for parameters\"\n        },\n        \"externalDocs\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"description\": \"information about external documentation\",\n          \"required\": [\"url\"],\n          \"properties\": {\n            \"description\": {\n              \"type\": \"string\"\n            },\n            \"url\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"examples\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        },\n        \"mimeType\": {\n          \"type\": \"string\",\n          \"description\": \"The MIME type of the HTTP message.\"\n        },\n        \"operation\": {\n          \"type\": \"object\",\n          \"required\": [\"responses\"],\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"tags\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              },\n              \"uniqueItems\": true\n            },\n            \"summary\": {\n              \"type\": \"string\",\n              \"description\": \"A brief summary of the operation.\"\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"A longer description of the operation, GitHub Flavored Markdown is allowed.\"\n            },\n            \"externalDocs\": {\n              \"$ref\": \"#/definitions/externalDocs\"\n            },\n            \"operationId\": {\n              \"type\": \"string\",\n              \"description\": \"A unique identifier of the operation.\"\n            },\n            \"produces\": {\n              \"description\": \"A list of MIME types the API can produce.\",\n              \"$ref\": \"#/definitions/mediaTypeList\"\n            },\n            \"consumes\": {\n              \"description\": \"A list of MIME types the API can consume.\",\n              \"$ref\": \"#/definitions/mediaTypeList\"\n            },\n            \"parameters\": {\n              \"$ref\": \"#/definitions/parametersList\"\n            },\n            \"responses\": {\n              \"$ref\": \"#/definitions/responses\"\n            },\n            \"schemes\": {\n              \"$ref\": \"#/definitions/schemesList\"\n            },\n            \"deprecated\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"security\": {\n              \"$ref\": \"#/definitions/security\"\n            }\n          }\n        },\n        \"pathItem\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"$ref\": {\n              \"type\": \"string\"\n            },\n            \"get\": {\n              \"$ref\": \"#/definitions/operation\"\n            },\n            \"put\": {\n              \"$ref\": \"#/definitions/operation\"\n            },\n            \"post\": {\n              \"$ref\": \"#/definitions/operation\"\n            },\n            \"delete\": {\n              \"$ref\": \"#/definitions/operation\"\n            },\n            \"options\": {\n              \"$ref\": \"#/definitions/operation\"\n            },\n            \"head\": {\n              \"$ref\": \"#/definitions/operation\"\n            },\n            \"patch\": {\n              \"$ref\": \"#/definitions/operation\"\n            },\n            \"parameters\": {\n              \"$ref\": \"#/definitions/parametersList\"\n            }\n          }\n        },\n        \"responses\": {\n          \"type\": \"object\",\n          \"description\": \"Response objects names can either be any valid HTTP status code or 'default'.\",\n          \"minProperties\": 1,\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^([0-9]{3})$|^(default)$\": {\n              \"$ref\": \"#/definitions/responseValue\"\n            },\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"not\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"patternProperties\": {\n              \"^x-\": {\n                \"$ref\": \"#/definitions/vendorExtension\"\n              }\n            }\n          }\n        },\n        \"responseValue\": {\n          \"oneOf\": [\n            {\n              \"$ref\": \"#/definitions/response\"\n            },\n            {\n              \"$ref\": \"#/definitions/jsonReference\"\n            }\n          ]\n        },\n        \"response\": {\n          \"type\": \"object\",\n          \"required\": [\"description\"],\n          \"properties\": {\n            \"description\": {\n              \"type\": \"string\"\n            },\n            \"schema\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/definitions/schema\"\n                },\n                {\n                  \"$ref\": \"#/definitions/fileSchema\"\n                }\n              ]\n            },\n            \"headers\": {\n              \"$ref\": \"#/definitions/headers\"\n            },\n            \"examples\": {\n              \"$ref\": \"#/definitions/examples\"\n            }\n          },\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"headers\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#/definitions/header\"\n          }\n        },\n        \"header\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"type\"],\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"string\", \"number\", \"integer\", \"boolean\", \"array\"]\n            },\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"items\": {\n              \"$ref\": \"#/definitions/primitivesItems\"\n            },\n            \"collectionFormat\": {\n              \"$ref\": \"#/definitions/collectionFormat\"\n            },\n            \"default\": {\n              \"$ref\": \"#/definitions/default\"\n            },\n            \"maximum\": {\n              \"$ref\": \"#/definitions/maximum\"\n            },\n            \"exclusiveMaximum\": {\n              \"$ref\": \"#/definitions/exclusiveMaximum\"\n            },\n            \"minimum\": {\n              \"$ref\": \"#/definitions/minimum\"\n            },\n            \"exclusiveMinimum\": {\n              \"$ref\": \"#/definitions/exclusiveMinimum\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"#/definitions/maxLength\"\n            },\n            \"minLength\": {\n              \"$ref\": \"#/definitions/minLength\"\n            },\n            \"pattern\": {\n              \"$ref\": \"#/definitions/pattern\"\n            },\n            \"maxItems\": {\n              \"$ref\": \"#/definitions/maxItems\"\n            },\n            \"minItems\": {\n              \"$ref\": \"#/definitions/minItems\"\n            },\n            \"uniqueItems\": {\n              \"$ref\": \"#/definitions/uniqueItems\"\n            },\n            \"enum\": {\n              \"$ref\": \"#/definitions/enum\"\n            },\n            \"multipleOf\": {\n              \"$ref\": \"#/definitions/multipleOf\"\n            },\n            \"description\": {\n              \"type\": \"string\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"vendorExtension\": {\n          \"description\": \"Any property starting with x- is valid.\",\n          \"additionalProperties\": true,\n          \"additionalItems\": true\n        },\n        \"bodyParameter\": {\n          \"type\": \"object\",\n          \"required\": [\"name\", \"in\", \"schema\"],\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The name of the parameter.\"\n            },\n            \"in\": {\n              \"type\": \"string\",\n              \"description\": \"Determines the location of the parameter.\",\n              \"enum\": [\"body\"]\n            },\n            \"required\": {\n              \"type\": \"boolean\",\n              \"description\": \"Determines whether or not this parameter is required or optional.\",\n              \"default\": false\n            },\n            \"schema\": {\n              \"$ref\": \"#/definitions/schema\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"headerParameterSubSchema\": {\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"required\": {\n              \"type\": \"boolean\",\n              \"description\": \"Determines whether or not this parameter is required or optional.\",\n              \"default\": false\n            },\n            \"in\": {\n              \"type\": \"string\",\n              \"description\": \"Determines the location of the parameter.\",\n              \"enum\": [\"header\"]\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The name of the parameter.\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"string\", \"number\", \"boolean\", \"integer\", \"array\"]\n            },\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"items\": {\n              \"$ref\": \"#/definitions/primitivesItems\"\n            },\n            \"collectionFormat\": {\n              \"$ref\": \"#/definitions/collectionFormat\"\n            },\n            \"default\": {\n              \"$ref\": \"#/definitions/default\"\n            },\n            \"maximum\": {\n              \"$ref\": \"#/definitions/maximum\"\n            },\n            \"exclusiveMaximum\": {\n              \"$ref\": \"#/definitions/exclusiveMaximum\"\n            },\n            \"minimum\": {\n              \"$ref\": \"#/definitions/minimum\"\n            },\n            \"exclusiveMinimum\": {\n              \"$ref\": \"#/definitions/exclusiveMinimum\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"#/definitions/maxLength\"\n            },\n            \"minLength\": {\n              \"$ref\": \"#/definitions/minLength\"\n            },\n            \"pattern\": {\n              \"$ref\": \"#/definitions/pattern\"\n            },\n            \"maxItems\": {\n              \"$ref\": \"#/definitions/maxItems\"\n            },\n            \"minItems\": {\n              \"$ref\": \"#/definitions/minItems\"\n            },\n            \"uniqueItems\": {\n              \"$ref\": \"#/definitions/uniqueItems\"\n            },\n            \"enum\": {\n              \"$ref\": \"#/definitions/enum\"\n            },\n            \"multipleOf\": {\n              \"$ref\": \"#/definitions/multipleOf\"\n            }\n          }\n        },\n        \"queryParameterSubSchema\": {\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"required\": {\n              \"type\": \"boolean\",\n              \"description\": \"Determines whether or not this parameter is required or optional.\",\n              \"default\": false\n            },\n            \"in\": {\n              \"type\": \"string\",\n              \"description\": \"Determines the location of the parameter.\",\n              \"enum\": [\"query\"]\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The name of the parameter.\"\n            },\n            \"allowEmptyValue\": {\n              \"type\": \"boolean\",\n              \"default\": false,\n              \"description\": \"allows sending a parameter by name only or with an empty value.\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"string\", \"number\", \"boolean\", \"integer\", \"array\"]\n            },\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"items\": {\n              \"$ref\": \"#/definitions/primitivesItems\"\n            },\n            \"collectionFormat\": {\n              \"$ref\": \"#/definitions/collectionFormatWithMulti\"\n            },\n            \"default\": {\n              \"$ref\": \"#/definitions/default\"\n            },\n            \"maximum\": {\n              \"$ref\": \"#/definitions/maximum\"\n            },\n            \"exclusiveMaximum\": {\n              \"$ref\": \"#/definitions/exclusiveMaximum\"\n            },\n            \"minimum\": {\n              \"$ref\": \"#/definitions/minimum\"\n            },\n            \"exclusiveMinimum\": {\n              \"$ref\": \"#/definitions/exclusiveMinimum\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"#/definitions/maxLength\"\n            },\n            \"minLength\": {\n              \"$ref\": \"#/definitions/minLength\"\n            },\n            \"pattern\": {\n              \"$ref\": \"#/definitions/pattern\"\n            },\n            \"maxItems\": {\n              \"$ref\": \"#/definitions/maxItems\"\n            },\n            \"minItems\": {\n              \"$ref\": \"#/definitions/minItems\"\n            },\n            \"uniqueItems\": {\n              \"$ref\": \"#/definitions/uniqueItems\"\n            },\n            \"enum\": {\n              \"$ref\": \"#/definitions/enum\"\n            },\n            \"multipleOf\": {\n              \"$ref\": \"#/definitions/multipleOf\"\n            }\n          }\n        },\n        \"formDataParameterSubSchema\": {\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"required\": {\n              \"type\": \"boolean\",\n              \"description\": \"Determines whether or not this parameter is required or optional.\",\n              \"default\": false\n            },\n            \"in\": {\n              \"type\": \"string\",\n              \"description\": \"Determines the location of the parameter.\",\n              \"enum\": [\"formData\"]\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The name of the parameter.\"\n            },\n            \"allowEmptyValue\": {\n              \"type\": \"boolean\",\n              \"default\": false,\n              \"description\": \"allows sending a parameter by name only or with an empty value.\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"string\", \"number\", \"boolean\", \"integer\", \"array\", \"file\"]\n            },\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"items\": {\n              \"$ref\": \"#/definitions/primitivesItems\"\n            },\n            \"collectionFormat\": {\n              \"$ref\": \"#/definitions/collectionFormatWithMulti\"\n            },\n            \"default\": {\n              \"$ref\": \"#/definitions/default\"\n            },\n            \"maximum\": {\n              \"$ref\": \"#/definitions/maximum\"\n            },\n            \"exclusiveMaximum\": {\n              \"$ref\": \"#/definitions/exclusiveMaximum\"\n            },\n            \"minimum\": {\n              \"$ref\": \"#/definitions/minimum\"\n            },\n            \"exclusiveMinimum\": {\n              \"$ref\": \"#/definitions/exclusiveMinimum\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"#/definitions/maxLength\"\n            },\n            \"minLength\": {\n              \"$ref\": \"#/definitions/minLength\"\n            },\n            \"pattern\": {\n              \"$ref\": \"#/definitions/pattern\"\n            },\n            \"maxItems\": {\n              \"$ref\": \"#/definitions/maxItems\"\n            },\n            \"minItems\": {\n              \"$ref\": \"#/definitions/minItems\"\n            },\n            \"uniqueItems\": {\n              \"$ref\": \"#/definitions/uniqueItems\"\n            },\n            \"enum\": {\n              \"$ref\": \"#/definitions/enum\"\n            },\n            \"multipleOf\": {\n              \"$ref\": \"#/definitions/multipleOf\"\n            }\n          }\n        },\n        \"pathParameterSubSchema\": {\n          \"additionalProperties\": false,\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"required\": [\"required\"],\n          \"properties\": {\n            \"required\": {\n              \"type\": \"boolean\",\n              \"enum\": [true],\n              \"description\": \"Determines whether or not this parameter is required or optional.\"\n            },\n            \"in\": {\n              \"type\": \"string\",\n              \"description\": \"Determines the location of the parameter.\",\n              \"enum\": [\"path\"]\n            },\n            \"description\": {\n              \"type\": \"string\",\n              \"description\": \"A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The name of the parameter.\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"string\", \"number\", \"boolean\", \"integer\", \"array\"]\n            },\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"items\": {\n              \"$ref\": \"#/definitions/primitivesItems\"\n            },\n            \"collectionFormat\": {\n              \"$ref\": \"#/definitions/collectionFormat\"\n            },\n            \"default\": {\n              \"$ref\": \"#/definitions/default\"\n            },\n            \"maximum\": {\n              \"$ref\": \"#/definitions/maximum\"\n            },\n            \"exclusiveMaximum\": {\n              \"$ref\": \"#/definitions/exclusiveMaximum\"\n            },\n            \"minimum\": {\n              \"$ref\": \"#/definitions/minimum\"\n            },\n            \"exclusiveMinimum\": {\n              \"$ref\": \"#/definitions/exclusiveMinimum\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"#/definitions/maxLength\"\n            },\n            \"minLength\": {\n              \"$ref\": \"#/definitions/minLength\"\n            },\n            \"pattern\": {\n              \"$ref\": \"#/definitions/pattern\"\n            },\n            \"maxItems\": {\n              \"$ref\": \"#/definitions/maxItems\"\n            },\n            \"minItems\": {\n              \"$ref\": \"#/definitions/minItems\"\n            },\n            \"uniqueItems\": {\n              \"$ref\": \"#/definitions/uniqueItems\"\n            },\n            \"enum\": {\n              \"$ref\": \"#/definitions/enum\"\n            },\n            \"multipleOf\": {\n              \"$ref\": \"#/definitions/multipleOf\"\n            }\n          }\n        },\n        \"nonBodyParameter\": {\n          \"type\": \"object\",\n          \"required\": [\"name\", \"in\", \"type\"],\n          \"oneOf\": [\n            {\n              \"$ref\": \"#/definitions/headerParameterSubSchema\"\n            },\n            {\n              \"$ref\": \"#/definitions/formDataParameterSubSchema\"\n            },\n            {\n              \"$ref\": \"#/definitions/queryParameterSubSchema\"\n            },\n            {\n              \"$ref\": \"#/definitions/pathParameterSubSchema\"\n            }\n          ]\n        },\n        \"parameter\": {\n          \"oneOf\": [\n            {\n              \"$ref\": \"#/definitions/bodyParameter\"\n            },\n            {\n              \"$ref\": \"#/definitions/nonBodyParameter\"\n            }\n          ]\n        },\n        \"schema\": {\n          \"type\": \"object\",\n          \"description\": \"A deterministic version of a JSON Schema object.\",\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"properties\": {\n            \"$ref\": {\n              \"type\": \"string\"\n            },\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"title\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/title\"\n            },\n            \"description\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/description\"\n            },\n            \"default\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/default\"\n            },\n            \"multipleOf\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/multipleOf\"\n            },\n            \"maximum\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/maximum\"\n            },\n            \"exclusiveMaximum\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/exclusiveMaximum\"\n            },\n            \"minimum\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/minimum\"\n            },\n            \"exclusiveMinimum\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/exclusiveMinimum\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeInteger\"\n            },\n            \"minLength\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n            },\n            \"pattern\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/pattern\"\n            },\n            \"maxItems\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeInteger\"\n            },\n            \"minItems\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n            },\n            \"uniqueItems\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/uniqueItems\"\n            },\n            \"maxProperties\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeInteger\"\n            },\n            \"minProperties\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n            },\n            \"required\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/stringArray\"\n            },\n            \"enum\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/enum\"\n            },\n            \"additionalProperties\": {\n              \"anyOf\": [\n                {\n                  \"$ref\": \"#/definitions/schema\"\n                },\n                {\n                  \"type\": \"boolean\"\n                }\n              ],\n              \"default\": {}\n            },\n            \"type\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/type\"\n            },\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"$ref\": \"#/definitions/schema\"\n                },\n                {\n                  \"type\": \"array\",\n                  \"minItems\": 1,\n                  \"items\": {\n                    \"$ref\": \"#/definitions/schema\"\n                  }\n                }\n              ],\n              \"default\": {}\n            },\n            \"allOf\": {\n              \"type\": \"array\",\n              \"minItems\": 1,\n              \"items\": {\n                \"$ref\": \"#/definitions/schema\"\n              }\n            },\n            \"properties\": {\n              \"type\": \"object\",\n              \"additionalProperties\": {\n                \"$ref\": \"#/definitions/schema\"\n              },\n              \"default\": {}\n            },\n            \"discriminator\": {\n              \"type\": \"string\"\n            },\n            \"readOnly\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"xml\": {\n              \"$ref\": \"#/definitions/xml\"\n            },\n            \"externalDocs\": {\n              \"$ref\": \"#/definitions/externalDocs\"\n            },\n            \"example\": {}\n          },\n          \"additionalProperties\": false\n        },\n        \"fileSchema\": {\n          \"type\": \"object\",\n          \"description\": \"A deterministic version of a JSON Schema object.\",\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          },\n          \"required\": [\"type\"],\n          \"properties\": {\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"title\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/title\"\n            },\n            \"description\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/description\"\n            },\n            \"default\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/default\"\n            },\n            \"required\": {\n              \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/stringArray\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"file\"]\n            },\n            \"readOnly\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"externalDocs\": {\n              \"$ref\": \"#/definitions/externalDocs\"\n            },\n            \"example\": {}\n          },\n          \"additionalProperties\": false\n        },\n        \"primitivesItems\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"string\", \"number\", \"integer\", \"boolean\", \"array\"]\n            },\n            \"format\": {\n              \"type\": \"string\"\n            },\n            \"items\": {\n              \"$ref\": \"#/definitions/primitivesItems\"\n            },\n            \"collectionFormat\": {\n              \"$ref\": \"#/definitions/collectionFormat\"\n            },\n            \"default\": {\n              \"$ref\": \"#/definitions/default\"\n            },\n            \"maximum\": {\n              \"$ref\": \"#/definitions/maximum\"\n            },\n            \"exclusiveMaximum\": {\n              \"$ref\": \"#/definitions/exclusiveMaximum\"\n            },\n            \"minimum\": {\n              \"$ref\": \"#/definitions/minimum\"\n            },\n            \"exclusiveMinimum\": {\n              \"$ref\": \"#/definitions/exclusiveMinimum\"\n            },\n            \"maxLength\": {\n              \"$ref\": \"#/definitions/maxLength\"\n            },\n            \"minLength\": {\n              \"$ref\": \"#/definitions/minLength\"\n            },\n            \"pattern\": {\n              \"$ref\": \"#/definitions/pattern\"\n            },\n            \"maxItems\": {\n              \"$ref\": \"#/definitions/maxItems\"\n            },\n            \"minItems\": {\n              \"$ref\": \"#/definitions/minItems\"\n            },\n            \"uniqueItems\": {\n              \"$ref\": \"#/definitions/uniqueItems\"\n            },\n            \"enum\": {\n              \"$ref\": \"#/definitions/enum\"\n            },\n            \"multipleOf\": {\n              \"$ref\": \"#/definitions/multipleOf\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"security\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/securityRequirement\"\n          },\n          \"uniqueItems\": true\n        },\n        \"securityRequirement\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"uniqueItems\": true\n          }\n        },\n        \"xml\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"name\": {\n              \"type\": \"string\"\n            },\n            \"namespace\": {\n              \"type\": \"string\"\n            },\n            \"prefix\": {\n              \"type\": \"string\"\n            },\n            \"attribute\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            },\n            \"wrapped\": {\n              \"type\": \"boolean\",\n              \"default\": false\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"tag\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"name\"],\n          \"properties\": {\n            \"name\": {\n              \"type\": \"string\"\n            },\n            \"description\": {\n              \"type\": \"string\"\n            },\n            \"externalDocs\": {\n              \"$ref\": \"#/definitions/externalDocs\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"securityDefinitions\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"oneOf\": [\n              {\n                \"$ref\": \"#/definitions/basicAuthenticationSecurity\"\n              },\n              {\n                \"$ref\": \"#/definitions/apiKeySecurity\"\n              },\n              {\n                \"$ref\": \"#/definitions/oauth2ImplicitSecurity\"\n              },\n              {\n                \"$ref\": \"#/definitions/oauth2PasswordSecurity\"\n              },\n              {\n                \"$ref\": \"#/definitions/oauth2ApplicationSecurity\"\n              },\n              {\n                \"$ref\": \"#/definitions/oauth2AccessCodeSecurity\"\n              }\n            ]\n          }\n        },\n        \"basicAuthenticationSecurity\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"type\"],\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"basic\"]\n            },\n            \"description\": {\n              \"type\": \"string\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"apiKeySecurity\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"type\", \"name\", \"in\"],\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"apiKey\"]\n            },\n            \"name\": {\n              \"type\": \"string\"\n            },\n            \"in\": {\n              \"type\": \"string\",\n              \"enum\": [\"header\", \"query\"]\n            },\n            \"description\": {\n              \"type\": \"string\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"oauth2ImplicitSecurity\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"type\", \"flow\", \"authorizationUrl\"],\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"oauth2\"]\n            },\n            \"flow\": {\n              \"type\": \"string\",\n              \"enum\": [\"implicit\"]\n            },\n            \"scopes\": {\n              \"$ref\": \"#/definitions/oauth2Scopes\"\n            },\n            \"authorizationUrl\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"description\": {\n              \"type\": \"string\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"oauth2PasswordSecurity\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"type\", \"flow\", \"tokenUrl\"],\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"oauth2\"]\n            },\n            \"flow\": {\n              \"type\": \"string\",\n              \"enum\": [\"password\"]\n            },\n            \"scopes\": {\n              \"$ref\": \"#/definitions/oauth2Scopes\"\n            },\n            \"tokenUrl\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"description\": {\n              \"type\": \"string\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"oauth2ApplicationSecurity\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"type\", \"flow\", \"tokenUrl\"],\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"oauth2\"]\n            },\n            \"flow\": {\n              \"type\": \"string\",\n              \"enum\": [\"application\"]\n            },\n            \"scopes\": {\n              \"$ref\": \"#/definitions/oauth2Scopes\"\n            },\n            \"tokenUrl\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"description\": {\n              \"type\": \"string\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"oauth2AccessCodeSecurity\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"type\", \"flow\", \"authorizationUrl\", \"tokenUrl\"],\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"oauth2\"]\n            },\n            \"flow\": {\n              \"type\": \"string\",\n              \"enum\": [\"accessCode\"]\n            },\n            \"scopes\": {\n              \"$ref\": \"#/definitions/oauth2Scopes\"\n            },\n            \"authorizationUrl\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"tokenUrl\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"description\": {\n              \"type\": \"string\"\n            }\n          },\n          \"patternProperties\": {\n            \"^x-\": {\n              \"$ref\": \"#/definitions/vendorExtension\"\n            }\n          }\n        },\n        \"oauth2Scopes\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"mediaTypeList\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/mimeType\"\n          },\n          \"uniqueItems\": true\n        },\n        \"parametersList\": {\n          \"type\": \"array\",\n          \"description\": \"The parameters needed to send a valid API call.\",\n          \"additionalItems\": false,\n          \"items\": {\n            \"oneOf\": [\n              {\n                \"$ref\": \"#/definitions/parameter\"\n              },\n              {\n                \"$ref\": \"#/definitions/jsonReference\"\n              }\n            ]\n          },\n          \"uniqueItems\": true\n        },\n        \"schemesList\": {\n          \"type\": \"array\",\n          \"description\": \"The transfer protocol of the API.\",\n          \"items\": {\n            \"type\": \"string\",\n            \"enum\": [\"http\", \"https\", \"ws\", \"wss\"]\n          },\n          \"uniqueItems\": true\n        },\n        \"collectionFormat\": {\n          \"type\": \"string\",\n          \"enum\": [\"csv\", \"ssv\", \"tsv\", \"pipes\"],\n          \"default\": \"csv\"\n        },\n        \"collectionFormatWithMulti\": {\n          \"type\": \"string\",\n          \"enum\": [\"csv\", \"ssv\", \"tsv\", \"pipes\", \"multi\"],\n          \"default\": \"csv\"\n        },\n        \"title\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/title\"\n        },\n        \"description\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/description\"\n        },\n        \"default\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/default\"\n        },\n        \"multipleOf\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/multipleOf\"\n        },\n        \"maximum\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/maximum\"\n        },\n        \"exclusiveMaximum\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/exclusiveMaximum\"\n        },\n        \"minimum\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/minimum\"\n        },\n        \"exclusiveMinimum\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/exclusiveMinimum\"\n        },\n        \"maxLength\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeInteger\"\n        },\n        \"minLength\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n        },\n        \"pattern\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/pattern\"\n        },\n        \"maxItems\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeInteger\"\n        },\n        \"minItems\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/definitions/nonNegativeIntegerDefault0\"\n        },\n        \"uniqueItems\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/uniqueItems\"\n        },\n        \"enum\": {\n          \"$ref\": \"http://json-schema.org/draft-07/schema#/properties/enum\"\n        },\n        \"jsonReference\": {\n          \"type\": \"object\",\n          \"required\": [\"$ref\"],\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"$ref\": {\n              \"type\": \"string\"\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"empty object is invalid\",\n        \"data\": {},\n        \"valid\": false\n      },\n      {\n        \"description\": \"minimal valid object\",\n        \"data\": {\n          \"swagger\": \"2.0\",\n          \"info\": {\n            \"title\": \"sample api definition\",\n            \"version\": \"0.1\"\n          },\n          \"paths\": {}\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/861_empty_propertynames.json",
    "content": "[\n  {\n    \"description\": \"propertyNames with empty schema (#861)\",\n    \"schema\": {\n      \"properties\": {\n        \"foo\": {\"type\": \"string\"}\n      },\n      \"propertyNames\": {}\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": {\"foo\": \"bar\"},\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/87_$_property.json",
    "content": "[\n  {\n    \"description\": \"$ in properties (#87)\",\n    \"schema\": {\n      \"properties\": {\n        \"$\": {\"type\": \"string\"}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid\",\n        \"data\": {\"$\": \"foo\"},\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/issues/94_dependencies_fail.json",
    "content": "[\n  {\n    \"description\": \"second dependency is not checked (#94)\",\n    \"schema\": {\n      \"dependencies\": {\n        \"bar\": [\"baz\"],\n        \"foo\": [\"bar\"]\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with only foo is invalid (bar is missing)\",\n        \"data\": {\"foo\": 1},\n        \"valid\": false\n      },\n      {\n        \"description\": \"object with foo and bar is invalid (baz is missing)\",\n        \"data\": {\"foo\": 1, \"bar\": 2},\n        \"valid\": false\n      },\n      {\n        \"description\": \"object with foo, bar and baz is valid\",\n        \"data\": {\"foo\": 1, \"bar\": 2, \"baz\": 3},\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"second dependency is checked when order is changed\",\n    \"schema\": {\n      \"dependencies\": {\n        \"foo\": [\"bar\"],\n        \"bar\": [\"baz\"]\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with only foo is invalid (bar is missing)\",\n        \"data\": {\"foo\": 1},\n        \"valid\": false\n      },\n      {\n        \"description\": \"object with foo and bar is invalid (baz is missing)\",\n        \"data\": {\"foo\": 1, \"bar\": 2},\n        \"valid\": false\n      },\n      {\n        \"description\": \"object with foo, bar and baz is valid\",\n        \"data\": {\"foo\": 1, \"bar\": 2, \"baz\": 3},\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/allOf.json",
    "content": "[\n  {\n    \"description\": \"allOf with one empty schema\",\n    \"schema\": {\n      \"allOf\": [{}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"any data is valid\",\n        \"data\": 1,\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"allOf with two empty schemas\",\n    \"schema\": {\n      \"allOf\": [{}, {}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"any data is valid\",\n        \"data\": 1,\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"allOf with two schemas, the first is empty\",\n    \"schema\": {\n      \"allOf\": [{}, {\"type\": \"number\"}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"number is valid\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"string is invalid\",\n        \"data\": \"foo\",\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"allOf with two schemas, the second is empty\",\n    \"schema\": {\n      \"allOf\": [{\"type\": \"number\"}, {}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"number is valid\",\n        \"data\": 1,\n        \"valid\": true\n      },\n      {\n        \"description\": \"string is invalid\",\n        \"data\": \"foo\",\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/anyOf.json",
    "content": "[\n  {\n    \"description\": \"anyOf with one of schemas empty\",\n    \"schema\": {\n      \"anyOf\": [{\"type\": \"number\"}, {}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"string is valid\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"number is valid\",\n        \"data\": 123,\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/comment.json",
    "content": "[\n  {\n    \"description\": \"$comment keyword\",\n    \"schema\": {\n      \"$comment\": \"test\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"any value is valid\",\n        \"data\": 1,\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"$comment keyword in subschemas\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"foo\": {\n          \"$comment\": \"test\"\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"empty object is valid\",\n        \"data\": {},\n        \"valid\": true\n      },\n      {\n        \"description\": \"any value of property foo is valid object is valid\",\n        \"data\": {\n          \"foo\": 1\n        },\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/dependencies.json",
    "content": "[\n  {\n    \"description\": \"dependencies keyword with empty array\",\n    \"schema\": {\n      \"dependencies\": {\n        \"foo\": []\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with property is valid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": true\n      },\n      {\n        \"description\": \"empty object is valid\",\n        \"data\": {},\n        \"valid\": true\n      },\n      {\n        \"description\": \"non-object is valid\",\n        \"data\": 1,\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/format.json",
    "content": "[\n  {\n    \"description\": \"allowed unknown format is valid\",\n    \"schema\": {\n      \"format\": \"allowedUnknown\"\n    },\n    \"tests\": [\n      {\n        \"description\": \"any string is valid\",\n        \"data\": \"any value\",\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/if.json",
    "content": "[\n  {\n    \"description\": \"if/then keyword validation\",\n    \"schema\": {\n      \"if\": {\"minimum\": 10},\n      \"then\": {\"multipleOf\": 2}\n    },\n    \"tests\": [\n      {\n        \"description\": \">= 10 and even is valid\",\n        \"data\": 12,\n        \"valid\": true\n      },\n      {\n        \"description\": \">= 10 and odd is invalid\",\n        \"data\": 11,\n        \"valid\": false\n      },\n      {\n        \"description\": \"< 10 is valid\",\n        \"data\": 9,\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"if/then/else keyword validation\",\n    \"schema\": {\n      \"if\": {\"maximum\": 10},\n      \"then\": {\"multipleOf\": 2},\n      \"else\": {\"multipleOf\": 5}\n    },\n    \"tests\": [\n      {\n        \"description\": \"<=10 and even is valid\",\n        \"data\": 8,\n        \"valid\": true\n      },\n      {\n        \"description\": \"<=10 and odd is invalid\",\n        \"data\": 7,\n        \"valid\": false\n      },\n      {\n        \"description\": \">10 and mulitple of 5 is valid\",\n        \"data\": 15,\n        \"valid\": true\n      },\n      {\n        \"description\": \">10 and not mulitple of 5 is invalid\",\n        \"data\": 17,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"if keyword with id in sibling subschema\",\n    \"schema\": {\n      \"$id\": \"http://example.com/base_if\",\n      \"if\": {\n        \"$id\": \"http://example.com/if\",\n        \"minimum\": 10\n      },\n      \"then\": {\"$ref\": \"#/definitions/def\"},\n      \"definitions\": {\n        \"def\": {\"multipleOf\": 2}\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \">= 10 and even is valid\",\n        \"data\": 12,\n        \"valid\": true\n      },\n      {\n        \"description\": \">= 10 and odd is invalid\",\n        \"data\": 11,\n        \"valid\": false\n      },\n      {\n        \"description\": \"< 10 is valid\",\n        \"data\": 9,\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"then/else without if should be ignored\",\n    \"schema\": {\n      \"then\": {\"multipleOf\": 2},\n      \"else\": {\"multipleOf\": 5}\n    },\n    \"tests\": [\n      {\n        \"description\": \"even is valid\",\n        \"data\": 8,\n        \"valid\": true\n      },\n      {\n        \"description\": \"odd is valid\",\n        \"data\": 7,\n        \"valid\": true\n      },\n      {\n        \"description\": \"mulitple of 5 is valid\",\n        \"data\": 15,\n        \"valid\": true\n      },\n      {\n        \"description\": \"not mulitple of 5 is valid\",\n        \"data\": 17,\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"if without then/else should be ignored\",\n    \"schema\": {\n      \"if\": {\"maximum\": 10}\n    },\n    \"tests\": [\n      {\n        \"description\": \"<=10 is valid\",\n        \"data\": 8,\n        \"valid\": true\n      },\n      {\n        \"description\": \">10 is valid\",\n        \"data\": 15,\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/items.json",
    "content": "[\n  {\n    \"description\": \"items with empty schema\",\n    \"schema\": {\n      \"items\": [{}],\n      \"additionalItems\": {\"type\": \"string\"}\n    },\n    \"tests\": [\n      {\n        \"description\": \"array with second string is valid\",\n        \"data\": [1, \"a\"],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array with second number is invalid\",\n        \"data\": [1, 2],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"items with subitems\",\n    \"schema\": {\n      \"definitions\": {\n        \"child\": {\n          \"type\": \"array\",\n          \"additionalItems\": false,\n          \"items\": [{\"$ref\": \"#/definitions/sub-child\"}, {\"$ref\": \"#/definitions/sub-child\"}]\n        },\n        \"sub-child\": {\n          \"type\": \"object\",\n          \"properties\": {\"foo\": {}},\n          \"required\": [\"foo\"],\n          \"additionalProperties\": false\n        }\n      },\n      \"type\": \"array\",\n      \"additionalItems\": false,\n      \"items\": [\n        {\"$ref\": \"#/definitions/child\"},\n        {\"$ref\": \"#/definitions/child\"},\n        {\"$ref\": \"#/definitions/child\"}\n      ]\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid items\",\n        \"data\": [\n          [{\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}]\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"too many children\",\n        \"data\": [\n          [{\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}]\n        ],\n        \"valid\": false\n      },\n      {\n        \"description\": \"too many sub-children\",\n        \"data\": [\n          [{\"foo\": null}, {\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}]\n        ],\n        \"valid\": false\n      },\n      {\n        \"description\": \"wrong child\",\n        \"data\": [{\"foo\": null}, [{\"foo\": null}, {\"foo\": null}], [{\"foo\": null}, {\"foo\": null}]],\n        \"valid\": false\n      },\n      {\n        \"description\": \"wrong sub-child\",\n        \"data\": [\n          [{\"bar\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}],\n          [{\"foo\": null}, {\"foo\": null}]\n        ],\n        \"valid\": false\n      },\n      {\n        \"description\": \"fewer children is valid\",\n        \"data\": [[{\"foo\": null}], [{\"foo\": null}]],\n        \"valid\": true\n      }\n    ]\n  },\n  {\n    \"description\": \"deeply nested items\",\n    \"schema\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"number\"\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid nested array\",\n        \"data\": [[[[1]], [[2], [3]]], [[[4], [5], [6]]]],\n        \"valid\": true\n      },\n      {\n        \"description\": \"nested array with invalid type\",\n        \"data\": [[[[\"1\"]], [[2], [3]]], [[[4], [5], [6]]]],\n        \"valid\": false\n      },\n      {\n        \"description\": \"not deep enough\",\n        \"data\": [\n          [[1], [2], [3]],\n          [[4], [5], [6]]\n        ],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/oneOf.json",
    "content": "[\n  {\n    \"description\": \"oneOf with one of schemas empty\",\n    \"schema\": {\n      \"oneOf\": [{\"type\": \"number\"}, {}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"string is valid\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": 123,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"oneOf with required\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"oneOf\": [{\"required\": [\"foo\", \"bar\"]}, {\"required\": [\"foo\", \"baz\"]}]\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with foo and bar is valid\",\n        \"data\": {\"foo\": 1, \"bar\": 2},\n        \"valid\": true\n      },\n      {\n        \"description\": \"object with foo and baz is valid\",\n        \"data\": {\"foo\": 1, \"baz\": 3},\n        \"valid\": true\n      },\n      {\n        \"description\": \"object with foo, bar and baz is invalid\",\n        \"data\": {\"foo\": 1, \"bar\": 2, \"baz\": 3},\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"oneOf with required with 20+ properties\",\n    \"schema\": {\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\"required\": [\"foo\", \"bar\"]},\n        {\n          \"required\": [\n            \"a\",\n            \"b\",\n            \"c\",\n            \"d\",\n            \"e\",\n            \"f\",\n            \"g\",\n            \"h\",\n            \"i\",\n            \"j\",\n            \"k\",\n            \"l\",\n            \"m\",\n            \"n\",\n            \"o\",\n            \"p\",\n            \"q\",\n            \"r\",\n            \"s\",\n            \"t\",\n            \"u\",\n            \"v\",\n            \"w\",\n            \"x\",\n            \"y\",\n            \"z\"\n          ]\n        }\n      ]\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with foo and bar is valid\",\n        \"data\": {\"foo\": 1, \"bar\": 2},\n        \"valid\": true\n      },\n      {\n        \"description\": \"object with a, b, c, ... properties is valid\",\n        \"data\": {\n          \"a\": 0,\n          \"b\": 0,\n          \"c\": 0,\n          \"d\": 0,\n          \"e\": 0,\n          \"f\": 0,\n          \"g\": 0,\n          \"h\": 0,\n          \"i\": 0,\n          \"j\": 0,\n          \"k\": 0,\n          \"l\": 0,\n          \"m\": 0,\n          \"n\": 0,\n          \"o\": 0,\n          \"p\": 0,\n          \"q\": 0,\n          \"r\": 0,\n          \"s\": 0,\n          \"t\": 0,\n          \"u\": 0,\n          \"v\": 0,\n          \"w\": 0,\n          \"x\": 0,\n          \"y\": 0,\n          \"z\": 0\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"object with foo, bar and a, b, c ... is invalid\",\n        \"data\": {\n          \"a\": 0,\n          \"b\": 0,\n          \"c\": 0,\n          \"d\": 0,\n          \"e\": 0,\n          \"f\": 0,\n          \"g\": 0,\n          \"h\": 0,\n          \"i\": 0,\n          \"j\": 0,\n          \"k\": 0,\n          \"l\": 0,\n          \"m\": 0,\n          \"n\": 0,\n          \"o\": 0,\n          \"p\": 0,\n          \"q\": 0,\n          \"r\": 0,\n          \"s\": 0,\n          \"t\": 0,\n          \"u\": 0,\n          \"v\": 0,\n          \"w\": 0,\n          \"x\": 0,\n          \"y\": 0,\n          \"z\": 0,\n          \"foo\": 1,\n          \"bar\": 2\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/required.json",
    "content": "[\n  {\n    \"description\": \"required keyword with empty array\",\n    \"schema\": {\n      \"required\": []\n    },\n    \"tests\": [\n      {\n        \"description\": \"object with property is valid\",\n        \"data\": {\"foo\": 1},\n        \"valid\": true\n      },\n      {\n        \"description\": \"empty object is valid\",\n        \"data\": {},\n        \"valid\": true\n      },\n      {\n        \"description\": \"non-object is valid\",\n        \"data\": 1,\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/type.json",
    "content": "[\n  {\n    \"description\": \"type as array with one item\",\n    \"schema\": {\n      \"type\": [\"string\"]\n    },\n    \"tests\": [\n      {\n        \"description\": \"string is valid\",\n        \"data\": \"foo\",\n        \"valid\": true\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": 123,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"type: array or object\",\n    \"schema\": {\n      \"type\": [\"array\", \"object\"]\n    },\n    \"tests\": [\n      {\n        \"description\": \"array is valid\",\n        \"data\": [1, 2, 3],\n        \"valid\": true\n      },\n      {\n        \"description\": \"object is valid\",\n        \"data\": {\"foo\": 123},\n        \"valid\": true\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": 123,\n        \"valid\": false\n      },\n      {\n        \"description\": \"string is invalid\",\n        \"data\": \"foo\",\n        \"valid\": false\n      },\n      {\n        \"description\": \"null is invalid\",\n        \"data\": null,\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"type: array, object or null\",\n    \"schema\": {\n      \"type\": [\"array\", \"object\", \"null\"]\n    },\n    \"tests\": [\n      {\n        \"description\": \"array is valid\",\n        \"data\": [1, 2, 3],\n        \"valid\": true\n      },\n      {\n        \"description\": \"object is valid\",\n        \"data\": {\"foo\": 123},\n        \"valid\": true\n      },\n      {\n        \"description\": \"null is valid\",\n        \"data\": null,\n        \"valid\": true\n      },\n      {\n        \"description\": \"number is invalid\",\n        \"data\": 123,\n        \"valid\": false\n      },\n      {\n        \"description\": \"string is invalid\",\n        \"data\": \"foo\",\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/rules/uniqueItems.json",
    "content": "[\n  {\n    \"description\": \"uniqueItems with algorithm using hash\",\n    \"schema\": {\n      \"items\": {\"type\": \"string\"},\n      \"uniqueItems\": true\n    },\n    \"tests\": [\n      {\n        \"description\": \"array of unique strings is valid\",\n        \"data\": [\"foo\", \"bar\", \"baz\"],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array of unique items with strings that are properties of hash is valid\",\n        \"data\": [\"toString\", \"foo\"],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array of non-unique strings is invalid\",\n        \"data\": [\"foo\", \"bar\", \"bar\"],\n        \"valid\": false\n      },\n      {\n        \"description\": \"array with non-strings is invalid\",\n        \"data\": [\"1\", 2],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"uniqueItems with multiple types when the list of types includes array\",\n    \"schema\": {\n      \"items\": {\"type\": [\"array\", \"string\"]},\n      \"uniqueItems\": true\n    },\n    \"tests\": [\n      {\n        \"description\": \"array of unique items is valid\",\n        \"data\": [[1], [2], \"foo\"],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array of non-unique items is invalid\",\n        \"data\": [[1], [1], \"foo\"],\n        \"valid\": false\n      },\n      {\n        \"description\": \"array with incorrect type is invalid\",\n        \"data\": [{}, 1, 2],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"uniqueItems with multiple types when the list of types includes object\",\n    \"schema\": {\n      \"items\": {\"type\": [\"object\", \"string\"]},\n      \"uniqueItems\": true\n    },\n    \"tests\": [\n      {\n        \"description\": \"array of unique items is valid\",\n        \"data\": [{\"a\": 1}, {\"b\": 2}, \"foo\"],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array of non-unique items is invalid\",\n        \"data\": [{\"a\": 1}, {\"a\": 1}, \"foo\"],\n        \"valid\": false\n      },\n      {\n        \"description\": \"array with incorrect type is invalid\",\n        \"data\": [[], 1, 2],\n        \"valid\": false\n      }\n    ]\n  },\n  {\n    \"description\": \"uniqueItems with multiple types when all types are scalar\",\n    \"schema\": {\n      \"items\": {\"type\": [\"number\", \"string\", \"boolean\", \"null\"]},\n      \"uniqueItems\": true\n    },\n    \"tests\": [\n      {\n        \"description\": \"array of unique items is valid (string/number)\",\n        \"data\": [\"1\", 1, 2],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array of unique items is valid (string/boolean)\",\n        \"data\": [\"true\", true, false],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array of unique items is valid (string/null)\",\n        \"data\": [\"null\", null, 0],\n        \"valid\": true\n      },\n      {\n        \"description\": \"array of non-unique items is invalid\",\n        \"data\": [1, 1, 2],\n        \"valid\": false\n      },\n      {\n        \"description\": \"array with incorrect type is invalid\",\n        \"data\": [[], 1, 2],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/schemas/advanced.json",
    "content": "[\n  {\n    \"description\": \"advanced schema from z-schema benchmark (https://github.com/zaggino/z-schema)\",\n    \"schema\": {\n      \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"/\": {\"$ref\": \"#/definitions/entry\"}\n      },\n      \"patternProperties\": {\n        \"^(/[^/]+)+$\": {\"$ref\": \"#/definitions/entry\"}\n      },\n      \"additionalProperties\": false,\n      \"required\": [\"/\"],\n      \"definitions\": {\n        \"entry\": {\n          \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n          \"description\": \"schema for an fstab entry\",\n          \"type\": \"object\",\n          \"required\": [\"storage\"],\n          \"properties\": {\n            \"storage\": {\n              \"type\": \"object\",\n              \"oneOf\": [\n                {\"$ref\": \"#/definitions/entry/definitions/diskDevice\"},\n                {\"$ref\": \"#/definitions/entry/definitions/diskUUID\"},\n                {\"$ref\": \"#/definitions/entry/definitions/nfs\"},\n                {\"$ref\": \"#/definitions/entry/definitions/tmpfs\"}\n              ]\n            },\n            \"fstype\": {\n              \"enum\": [\"ext3\", \"ext4\", \"btrfs\"]\n            },\n            \"options\": {\n              \"type\": \"array\",\n              \"minItems\": 1,\n              \"items\": {\"type\": \"string\"},\n              \"uniqueItems\": true\n            },\n            \"readonly\": {\"type\": \"boolean\"}\n          },\n          \"definitions\": {\n            \"diskDevice\": {\n              \"properties\": {\n                \"type\": {\"enum\": [\"disk\"]},\n                \"device\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^/dev/[^/]+(/[^/]+)*$\"\n                }\n              },\n              \"required\": [\"type\", \"device\"],\n              \"additionalProperties\": false\n            },\n            \"diskUUID\": {\n              \"properties\": {\n                \"type\": {\"enum\": [\"disk\"]},\n                \"label\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$\"\n                }\n              },\n              \"required\": [\"type\", \"label\"],\n              \"additionalProperties\": false\n            },\n            \"nfs\": {\n              \"properties\": {\n                \"type\": {\"enum\": [\"nfs\"]},\n                \"remotePath\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^(/[^/]+)+$\"\n                },\n                \"server\": {\n                  \"type\": \"string\",\n                  \"anyOf\": [{\"format\": \"hostname\"}, {\"format\": \"ipv4\"}, {\"format\": \"ipv6\"}]\n                }\n              },\n              \"required\": [\"type\", \"server\", \"remotePath\"],\n              \"additionalProperties\": false\n            },\n            \"tmpfs\": {\n              \"properties\": {\n                \"type\": {\"enum\": [\"tmpfs\"]},\n                \"sizeInMB\": {\n                  \"type\": \"integer\",\n                  \"minimum\": 16,\n                  \"maximum\": 512\n                }\n              },\n              \"required\": [\"type\", \"sizeInMB\"],\n              \"additionalProperties\": false\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object from z-schema benchmark\",\n        \"data\": {\n          \"/\": {\n            \"storage\": {\n              \"type\": \"disk\",\n              \"device\": \"/dev/sda1\"\n            },\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          },\n          \"/var\": {\n            \"storage\": {\n              \"type\": \"disk\",\n              \"label\": \"8f3ba6f4-5c70-46ec-83af-0d5434953e5f\"\n            },\n            \"fstype\": \"ext4\",\n            \"options\": [\"nosuid\"]\n          },\n          \"/tmp\": {\n            \"storage\": {\n              \"type\": \"tmpfs\",\n              \"sizeInMB\": 64\n            }\n          },\n          \"/var/www\": {\n            \"storage\": {\n              \"type\": \"nfs\",\n              \"server\": \"my.nfs.server\",\n              \"remotePath\": \"/exports/mypath\"\n            }\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"not object\",\n        \"data\": 1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"root only is valid\",\n        \"data\": {\n          \"/\": {\n            \"storage\": {\n              \"type\": \"disk\",\n              \"device\": \"/dev/sda1\"\n            },\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"missing root entry\",\n        \"data\": {\n          \"no root/\": {\n            \"storage\": {\n              \"type\": \"disk\",\n              \"device\": \"/dev/sda1\"\n            },\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"invalid entry key\",\n        \"data\": {\n          \"/\": {\n            \"storage\": {\n              \"type\": \"disk\",\n              \"device\": \"/dev/sda1\"\n            },\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          },\n          \"invalid/var\": {\n            \"storage\": {\n              \"type\": \"disk\",\n              \"label\": \"8f3ba6f4-5c70-46ec-83af-0d5434953e5f\"\n            },\n            \"fstype\": \"ext4\",\n            \"options\": [\"nosuid\"]\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"missing storage in entry\",\n        \"data\": {\n          \"/\": {\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"missing storage type\",\n        \"data\": {\n          \"/\": {\n            \"storage\": {\n              \"device\": \"/dev/sda1\"\n            },\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"storage type should be a string\",\n        \"data\": {\n          \"/\": {\n            \"storage\": {\n              \"type\": null,\n              \"device\": \"/dev/sda1\"\n            },\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          }\n        },\n        \"valid\": false\n      },\n      {\n        \"description\": \"storage device should match pattern\",\n        \"data\": {\n          \"/\": {\n            \"storage\": {\n              \"type\": null,\n              \"device\": \"invalid/dev/sda1\"\n            },\n            \"fstype\": \"btrfs\",\n            \"readonly\": true\n          }\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/schemas/basic.json",
    "content": "[\n  {\n    \"description\": \"basic schema from z-schema benchmark (https://github.com/zaggino/z-schema)\",\n    \"schema\": {\n      \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n      \"title\": \"Product set\",\n      \"type\": \"array\",\n      \"items\": {\n        \"title\": \"Product\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"The unique identifier for a product\",\n            \"type\": \"number\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"price\": {\n            \"type\": \"number\",\n            \"exclusiveMinimum\": 0\n          },\n          \"tags\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"minItems\": 1,\n            \"uniqueItems\": true\n          },\n          \"dimensions\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"length\": {\"type\": \"number\"},\n              \"width\": {\"type\": \"number\"},\n              \"height\": {\"type\": \"number\"}\n            },\n            \"required\": [\"length\", \"width\", \"height\"]\n          },\n          \"warehouseLocation\": {\n            \"description\": \"Coordinates of the warehouse with the product\"\n          }\n        },\n        \"required\": [\"id\", \"name\", \"price\"]\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array from z-schema benchmark\",\n        \"data\": [\n          {\n            \"id\": 2,\n            \"name\": \"An ice sculpture\",\n            \"price\": 12.5,\n            \"tags\": [\"cold\", \"ice\"],\n            \"dimensions\": {\n              \"length\": 7.0,\n              \"width\": 12.0,\n              \"height\": 9.5\n            },\n            \"warehouseLocation\": {\n              \"latitude\": -78.75,\n              \"longitude\": 20.4\n            }\n          },\n          {\n            \"id\": 3,\n            \"name\": \"A blue mouse\",\n            \"price\": 25.5,\n            \"dimensions\": {\n              \"length\": 3.1,\n              \"width\": 1.0,\n              \"height\": 1.0\n            },\n            \"warehouseLocation\": {\n              \"latitude\": 54.4,\n              \"longitude\": -32.7\n            }\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"not array\",\n        \"data\": 1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"array of not onjects\",\n        \"data\": [1, 2, 3],\n        \"valid\": false\n      },\n      {\n        \"description\": \"missing required properties\",\n        \"data\": [{}],\n        \"valid\": false\n      },\n      {\n        \"description\": \"required property of wrong type\",\n        \"data\": [{\"id\": 1, \"name\": \"product\", \"price\": \"not valid\"}],\n        \"valid\": false\n      },\n      {\n        \"description\": \"smallest valid product\",\n        \"data\": [{\"id\": 1, \"name\": \"product\", \"price\": 100}],\n        \"valid\": true\n      },\n      {\n        \"description\": \"tags should be array\",\n        \"data\": [{\"tags\": {}, \"id\": 1, \"name\": \"product\", \"price\": 100}],\n        \"valid\": false\n      },\n      {\n        \"description\": \"dimensions should be object\",\n        \"data\": [{\"dimensions\": [], \"id\": 1, \"name\": \"product\", \"price\": 100}],\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid product with tag\",\n        \"data\": [{\"tags\": [\"product\"], \"id\": 1, \"name\": \"product\", \"price\": 100}],\n        \"valid\": true\n      },\n      {\n        \"description\": \"dimensions miss required properties\",\n        \"data\": [\n          {\n            \"dimensions\": {},\n            \"tags\": [\"product\"],\n            \"id\": 1,\n            \"name\": \"product\",\n            \"price\": 100\n          }\n        ],\n        \"valid\": false\n      },\n      {\n        \"description\": \"valid product with tag and dimensions\",\n        \"data\": [\n          {\n            \"dimensions\": {\"length\": 7, \"width\": 12, \"height\": 9.5},\n            \"tags\": [\"product\"],\n            \"id\": 1,\n            \"name\": \"product\",\n            \"price\": 100\n          }\n        ],\n        \"valid\": true\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/schemas/complex.json",
    "content": "[\n  {\n    \"description\": \"complex schema from jsck benchmark (https://github.com/pandastrike/jsck)\",\n    \"schema\": {\n      \"type\": \"array\",\n      \"items\": {\"$ref\": \"#transaction\"},\n      \"minItems\": 1,\n      \"definitions\": {\n        \"base58\": {\n          \"$id\": \"#base58\",\n          \"type\": \"string\",\n          \"pattern\": \"^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$\"\n        },\n        \"hex\": {\n          \"$id\": \"#hex\",\n          \"type\": \"string\",\n          \"pattern\": \"^[0123456789A-Fa-f]+$\"\n        },\n        \"tx_id\": {\n          \"$id\": \"#tx_id\",\n          \"allOf\": [\n            {\"$ref\": \"#hex\"},\n            {\n              \"minLength\": 64,\n              \"maxLength\": 64\n            }\n          ]\n        },\n        \"address\": {\n          \"$id\": \"#address\",\n          \"allOf\": [\n            {\"$ref\": \"#base58\"},\n            {\n              \"minLength\": 34,\n              \"maxLength\": 34\n            }\n          ]\n        },\n        \"signature\": {\n          \"$id\": \"#signature\",\n          \"allOf\": [\n            {\"$ref\": \"#hex\"},\n            {\n              \"minLength\": 128,\n              \"maxLength\": 128\n            }\n          ]\n        },\n        \"transaction\": {\n          \"$id\": \"#transaction\",\n          \"additionalProperties\": false,\n          \"required\": [\"metadata\", \"hash\", \"inputs\", \"outputs\"],\n          \"properties\": {\n            \"metadata\": {\n              \"type\": \"object\",\n              \"required\": [\"amount\", \"fee\"],\n              \"properties\": {\n                \"amount\": {\n                  \"type\": \"integer\"\n                },\n                \"fee\": {\n                  \"type\": \"integer\",\n                  \"multipleOf\": 10000\n                },\n                \"status\": {\n                  \"type\": \"string\",\n                  \"enum\": [\"unsigned\", \"unconfirmed\", \"confirmed\", \"invalid\"]\n                },\n                \"confirmations\": {\n                  \"type\": \"integer\",\n                  \"minimum\": 0\n                },\n                \"block_time\": {\n                  \"type\": \"integer\"\n                }\n              }\n            },\n            \"version\": {\n              \"type\": \"integer\"\n            },\n            \"lock_time\": {\n              \"type\": \"integer\"\n            },\n            \"hash\": {\"$ref\": \"#tx_id\"},\n            \"inputs\": {\n              \"type\": \"array\",\n              \"items\": {\"$ref\": \"#input\"},\n              \"minItems\": 1\n            },\n            \"outputs\": {\n              \"type\": \"array\",\n              \"items\": {\"$ref\": \"#output\"},\n              \"minItems\": 1\n            }\n          }\n        },\n        \"input\": {\n          \"$id\": \"#input\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"index\", \"output\", \"script_sig\"],\n          \"properties\": {\n            \"index\": {\n              \"type\": \"integer\",\n              \"minimum\": 0\n            },\n            \"output\": {\"$ref\": \"#output\"},\n            \"sig_hash\": {\"$ref\": \"#hex\"},\n            \"script_sig\": {\"$ref\": \"#hex\"},\n            \"signatures\": {\n              \"type\": \"object\",\n              \"description\": \"A dictionary of signatures.  Keys represent keypair names\",\n              \"minProperties\": 1,\n              \"maxProperties\": 3,\n              \"additionalProperties\": {\"$ref\": \"#signature\"}\n            }\n          }\n        },\n        \"output\": {\n          \"$id\": \"#output\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"hash\", \"index\", \"value\", \"script\"],\n          \"properties\": {\n            \"hash\": {\"$ref\": \"#tx_id\"},\n            \"index\": {\n              \"type\": \"integer\",\n              \"minimum\": 0\n            },\n            \"value\": {\n              \"type\": \"integer\"\n            },\n            \"script\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"type\": {\n                  \"type\": \"string\",\n                  \"enum\": [\"standard\", \"p2sh\"]\n                },\n                \"asm\": {\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"address\": {\"$ref\": \"#address\"},\n            \"metadata\": {\n              \"type\": \"object\",\n              \"dependencies\": {\n                \"wallet_path\": [\"public_seeds\"]\n              },\n              \"properties\": {\n                \"wallet_path\": {\n                  \"type\": \"string\"\n                },\n                \"public_seeds\": {\n                  \"type\": \"object\",\n                  \"minProperties\": 1,\n                  \"maxProperties\": 3,\n                  \"additionalProperties\": {\n                    \"anyOf\": [{\"$ref\": \"#base58\"}, {\"$ref\": \"#hex\"}]\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array from jsck benchmark\",\n        \"data\": [\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"confirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"signatures\": {\n                  \"primary\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a7\",\n                  \"cosigner\": \"a2ad5ebf16dadf9d357ef2867cb9b1de682b336db000b6e0012200ebda7c8802f7c5ea2afd97439840a191c756be6528521b214487d5fc79796eb00122064037\"\n                },\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\",\n                  \"wallet_path\": \"m/44/0/1/356\",\n                  \"public_seeds\": {\n                    \"primary\": \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n                    \"cosigner\": \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\"\n                  }\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          },\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          },\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"not array\",\n        \"data\": 1,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/schemas/complex2.json",
    "content": "[\n  {\n    \"description\": \"complex schema from jsck benchmark without IDs in definitions\",\n    \"schema\": {\n      \"type\": \"array\",\n      \"items\": {\"$ref\": \"#/definitions/transaction\"},\n      \"minItems\": 1,\n      \"definitions\": {\n        \"base58\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$\"\n        },\n        \"hex\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[0123456789A-Fa-f]+$\"\n        },\n        \"tx_id\": {\n          \"allOf\": [\n            {\"$ref\": \"#/definitions/hex\"},\n            {\n              \"minLength\": 64,\n              \"maxLength\": 64\n            }\n          ]\n        },\n        \"address\": {\n          \"allOf\": [\n            {\"$ref\": \"#/definitions/base58\"},\n            {\n              \"minLength\": 34,\n              \"maxLength\": 34\n            }\n          ]\n        },\n        \"signature\": {\n          \"allOf\": [\n            {\"$ref\": \"#/definitions/hex\"},\n            {\n              \"minLength\": 128,\n              \"maxLength\": 128\n            }\n          ]\n        },\n        \"transaction\": {\n          \"additionalProperties\": false,\n          \"required\": [\"metadata\", \"hash\", \"inputs\", \"outputs\"],\n          \"properties\": {\n            \"metadata\": {\n              \"type\": \"object\",\n              \"required\": [\"amount\", \"fee\"],\n              \"properties\": {\n                \"amount\": {\n                  \"type\": \"integer\"\n                },\n                \"fee\": {\n                  \"type\": \"integer\",\n                  \"multipleOf\": 10000\n                },\n                \"status\": {\n                  \"type\": \"string\",\n                  \"enum\": [\"unsigned\", \"unconfirmed\", \"confirmed\", \"invalid\"]\n                },\n                \"confirmations\": {\n                  \"type\": \"integer\",\n                  \"minimum\": 0\n                },\n                \"block_time\": {\n                  \"type\": \"integer\"\n                }\n              }\n            },\n            \"version\": {\n              \"type\": \"integer\"\n            },\n            \"lock_time\": {\n              \"type\": \"integer\"\n            },\n            \"hash\": {\"$ref\": \"#/definitions/tx_id\"},\n            \"inputs\": {\n              \"type\": \"array\",\n              \"items\": {\"$ref\": \"#/definitions/input\"},\n              \"minItems\": 1\n            },\n            \"outputs\": {\n              \"type\": \"array\",\n              \"items\": {\"$ref\": \"#/definitions/output\"},\n              \"minItems\": 1\n            }\n          }\n        },\n        \"input\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"index\", \"output\", \"script_sig\"],\n          \"properties\": {\n            \"index\": {\n              \"type\": \"integer\",\n              \"minimum\": 0\n            },\n            \"output\": {\"$ref\": \"#/definitions/output\"},\n            \"sig_hash\": {\"$ref\": \"#/definitions/hex\"},\n            \"script_sig\": {\"$ref\": \"#/definitions/hex\"},\n            \"signatures\": {\n              \"type\": \"object\",\n              \"description\": \"A dictionary of signatures.  Keys represent keypair names\",\n              \"minProperties\": 1,\n              \"maxProperties\": 3,\n              \"additionalProperties\": {\"$ref\": \"#/definitions/signature\"}\n            }\n          }\n        },\n        \"output\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"hash\", \"index\", \"value\", \"script\"],\n          \"properties\": {\n            \"hash\": {\"$ref\": \"#/definitions/tx_id\"},\n            \"index\": {\n              \"type\": \"integer\",\n              \"minimum\": 0\n            },\n            \"value\": {\n              \"type\": \"integer\"\n            },\n            \"script\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"type\": {\n                  \"type\": \"string\",\n                  \"enum\": [\"standard\", \"p2sh\"]\n                },\n                \"asm\": {\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"address\": {\"$ref\": \"#/definitions/address\"},\n            \"metadata\": {\n              \"type\": \"object\",\n              \"dependencies\": {\n                \"wallet_path\": [\"public_seeds\"]\n              },\n              \"properties\": {\n                \"wallet_path\": {\n                  \"type\": \"string\"\n                },\n                \"public_seeds\": {\n                  \"type\": \"object\",\n                  \"minProperties\": 1,\n                  \"maxProperties\": 3,\n                  \"additionalProperties\": {\n                    \"anyOf\": [{\"$ref\": \"#/definitions/base58\"}, {\"$ref\": \"#/definitions/hex\"}]\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array from jsck benchmark\",\n        \"data\": [\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"confirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"signatures\": {\n                  \"primary\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a7\",\n                  \"cosigner\": \"a2ad5ebf16dadf9d357ef2867cb9b1de682b336db000b6e0012200ebda7c8802f7c5ea2afd97439840a191c756be6528521b214487d5fc79796eb00122064037\"\n                },\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\",\n                  \"wallet_path\": \"m/44/0/1/356\",\n                  \"public_seeds\": {\n                    \"primary\": \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n                    \"cosigner\": \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\"\n                  }\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          },\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          },\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"not array\",\n        \"data\": 1,\n        \"valid\": false\n      },\n      {\n        \"description\": \"one valid item\",\n        \"data\": [\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"one invalid item\",\n        \"data\": [\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"$_is_invalid\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          }\n        ],\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/schemas/complex3.json",
    "content": "[\n  {\n    \"description\": \"complex schema from jsck benchmark (https://github.com/pandastrike/jsck)\",\n    \"schema\": {\n      \"$id\": \"http://example.com/complex3.json\",\n      \"type\": \"array\",\n      \"items\": {\"$ref\": \"#transaction\"},\n      \"minItems\": 1,\n      \"definitions\": {\n        \"base58\": {\n          \"$id\": \"#base58\",\n          \"type\": \"string\",\n          \"pattern\": \"^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$\"\n        },\n        \"hex\": {\n          \"$id\": \"#hex\",\n          \"type\": \"string\",\n          \"pattern\": \"^[0123456789A-Fa-f]+$\"\n        },\n        \"tx_id\": {\n          \"$id\": \"#tx_id\",\n          \"allOf\": [\n            {\"$ref\": \"#hex\"},\n            {\n              \"minLength\": 64,\n              \"maxLength\": 64\n            }\n          ]\n        },\n        \"address\": {\n          \"$id\": \"#address\",\n          \"allOf\": [\n            {\"$ref\": \"#base58\"},\n            {\n              \"minLength\": 34,\n              \"maxLength\": 34\n            }\n          ]\n        },\n        \"signature\": {\n          \"$id\": \"#signature\",\n          \"allOf\": [\n            {\"$ref\": \"#hex\"},\n            {\n              \"minLength\": 128,\n              \"maxLength\": 128\n            }\n          ]\n        },\n        \"transaction\": {\n          \"$id\": \"#transaction\",\n          \"additionalProperties\": false,\n          \"required\": [\"metadata\", \"hash\", \"inputs\", \"outputs\"],\n          \"properties\": {\n            \"metadata\": {\n              \"type\": \"object\",\n              \"required\": [\"amount\", \"fee\"],\n              \"properties\": {\n                \"amount\": {\n                  \"type\": \"integer\"\n                },\n                \"fee\": {\n                  \"type\": \"integer\",\n                  \"multipleOf\": 10000\n                },\n                \"status\": {\n                  \"type\": \"string\",\n                  \"enum\": [\"unsigned\", \"unconfirmed\", \"confirmed\", \"invalid\"]\n                },\n                \"confirmations\": {\n                  \"type\": \"integer\",\n                  \"minimum\": 0\n                },\n                \"block_time\": {\n                  \"type\": \"integer\"\n                }\n              }\n            },\n            \"version\": {\n              \"type\": \"integer\"\n            },\n            \"lock_time\": {\n              \"type\": \"integer\"\n            },\n            \"hash\": {\"$ref\": \"#tx_id\"},\n            \"inputs\": {\n              \"type\": \"array\",\n              \"items\": {\"$ref\": \"#input\"},\n              \"minItems\": 1\n            },\n            \"outputs\": {\n              \"type\": \"array\",\n              \"items\": {\"$ref\": \"#output\"},\n              \"minItems\": 1\n            }\n          }\n        },\n        \"input\": {\n          \"$id\": \"#input\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"index\", \"output\", \"script_sig\"],\n          \"properties\": {\n            \"index\": {\n              \"type\": \"integer\",\n              \"minimum\": 0\n            },\n            \"output\": {\"$ref\": \"#output\"},\n            \"sig_hash\": {\"$ref\": \"#hex\"},\n            \"script_sig\": {\"$ref\": \"#hex\"},\n            \"signatures\": {\n              \"type\": \"object\",\n              \"description\": \"A dictionary of signatures.  Keys represent keypair names\",\n              \"minProperties\": 1,\n              \"maxProperties\": 3,\n              \"additionalProperties\": {\"$ref\": \"#signature\"}\n            }\n          }\n        },\n        \"output\": {\n          \"$id\": \"#output\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"hash\", \"index\", \"value\", \"script\"],\n          \"properties\": {\n            \"hash\": {\"$ref\": \"#tx_id\"},\n            \"index\": {\n              \"type\": \"integer\",\n              \"minimum\": 0\n            },\n            \"value\": {\n              \"type\": \"integer\"\n            },\n            \"script\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"type\": {\n                  \"type\": \"string\",\n                  \"enum\": [\"standard\", \"p2sh\"]\n                },\n                \"asm\": {\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"address\": {\"$ref\": \"#address\"},\n            \"metadata\": {\n              \"type\": \"object\",\n              \"dependencies\": {\n                \"wallet_path\": [\"public_seeds\"]\n              },\n              \"properties\": {\n                \"wallet_path\": {\n                  \"type\": \"string\"\n                },\n                \"public_seeds\": {\n                  \"type\": \"object\",\n                  \"minProperties\": 1,\n                  \"maxProperties\": 3,\n                  \"additionalProperties\": {\n                    \"anyOf\": [{\"$ref\": \"#base58\"}, {\"$ref\": \"#hex\"}]\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid array from jsck benchmark\",\n        \"data\": [\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"confirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"signatures\": {\n                  \"primary\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a7\",\n                  \"cosigner\": \"a2ad5ebf16dadf9d357ef2867cb9b1de682b336db000b6e0012200ebda7c8802f7c5ea2afd97439840a191c756be6528521b214487d5fc79796eb00122064037\"\n                },\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\",\n                  \"wallet_path\": \"m/44/0/1/356\",\n                  \"public_seeds\": {\n                    \"primary\": \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n                    \"cosigner\": \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\"\n                  }\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          },\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          },\n          {\n            \"metadata\": {\n              \"amount\": 38043749285,\n              \"fee\": 20000,\n              \"status\": \"unconfirmed\",\n              \"confirmations\": 73,\n              \"block_time\": 1415993584376\n            },\n            \"version\": 1,\n            \"lock_time\": 0,\n            \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n            \"inputs\": [\n              {\n                \"index\": 0,\n                \"script_sig\": \"3046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f01\",\n                \"output\": {\n                  \"hash\": \"6b040cd7a4676b5c7b11f144e73c1958c177fcd79e934f6be8ce02c8cd12546d\",\n                  \"index\": 1,\n                  \"value\": 38043749285,\n                  \"script\": {\n                    \"type\": \"standard\",\n                    \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                  }\n                }\n              }\n            ],\n            \"outputs\": [\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 0,\n                \"value\": 38042249285,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 7d4e6d55e1dffb0df85f509343451d170d147551 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"1CRZRBwfuwUaVSPJtd6DBuezbm7XPBHLa1\",\n                \"metadata\": {\n                  \"type\": \"change\"\n                }\n              },\n              {\n                \"hash\": \"60c1f1a3160042152114e2bba45600a5045711c3a8a458016248acec59653471\",\n                \"index\": 1,\n                \"value\": 1500000,\n                \"script\": {\n                  \"type\": \"standard\",\n                  \"asm\": \"OP_DUP OP_HASH160 3bc576e6960a9d45201ba5087e39224d0a05a079 OP_EQUALVERIFY OP_CHECKSIG\"\n                },\n                \"address\": \"16T3RPZLmxtXQCgWi1S8kef5Ca6jqXhoeT\"\n              }\n            ]\n          }\n        ],\n        \"valid\": true\n      },\n      {\n        \"description\": \"not array\",\n        \"data\": 1,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/schemas/cosmicrealms.json",
    "content": "[\n  {\n    \"description\": \"schema from cosmicrealms benchmark\",\n    \"schema\": {\n      \"name\": \"test\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"fullName\",\n        \"age\",\n        \"zip\",\n        \"married\",\n        \"dozen\",\n        \"dozenOrBakersDozen\",\n        \"favoriteEvenNumber\",\n        \"topThreeFavoriteColors\",\n        \"favoriteSingleDigitWholeNumbers\",\n        \"favoriteFiveLetterWord\",\n        \"emailAddresses\",\n        \"ipAddresses\"\n      ],\n      \"properties\": {\n        \"fullName\": {\"type\": \"string\"},\n        \"age\": {\"type\": \"integer\", \"minimum\": 0},\n        \"optionalItem\": {\"type\": \"string\"},\n        \"state\": {\"type\": \"string\"},\n        \"city\": {\"type\": \"string\"},\n        \"zip\": {\"type\": \"integer\", \"minimum\": 0, \"maximum\": 99999},\n        \"married\": {\"type\": \"boolean\"},\n        \"dozen\": {\"type\": \"integer\", \"minimum\": 12, \"maximum\": 12},\n        \"dozenOrBakersDozen\": {\"type\": \"integer\", \"minimum\": 12, \"maximum\": 13},\n        \"favoriteEvenNumber\": {\"type\": \"integer\", \"multipleOf\": 2},\n        \"topThreeFavoriteColors\": {\n          \"type\": \"array\",\n          \"minItems\": 3,\n          \"maxItems\": 3,\n          \"uniqueItems\": true,\n          \"items\": {\"type\": \"string\"}\n        },\n        \"favoriteSingleDigitWholeNumbers\": {\n          \"type\": \"array\",\n          \"minItems\": 1,\n          \"maxItems\": 10,\n          \"uniqueItems\": true,\n          \"items\": {\"type\": \"integer\", \"minimum\": 0, \"maximum\": 9}\n        },\n        \"favoriteFiveLetterWord\": {\n          \"type\": \"string\",\n          \"minLength\": 5,\n          \"maxLength\": 5\n        },\n        \"emailAddresses\": {\n          \"type\": \"array\",\n          \"minItems\": 1,\n          \"uniqueItems\": true,\n          \"items\": {\"type\": \"string\", \"format\": \"email\"}\n        },\n        \"ipAddresses\": {\n          \"type\": \"array\",\n          \"uniqueItems\": true,\n          \"items\": {\"type\": \"string\", \"format\": \"ipv4\"}\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid data from cosmicrealms benchmark\",\n        \"data\": {\n          \"fullName\": \"John Smith\",\n          \"state\": \"CA\",\n          \"city\": \"Los Angeles\",\n          \"favoriteFiveLetterWord\": \"hello\",\n          \"emailAddresses\": [\n            \"NRorsfCYtvB5bKAf1jZMu1GAJzAhhg5lEvh@inTqnn.net\",\n            \"6tjWtYxjaan2Ivm5QZVhKxImKawRCA6gcqtMEwV1@bB01pCtIBY0F.org\",\n            \"j68UnHfrHiKwpAm8iYokoMuRTpWUj8bfxspusNFK@COoWeMZL.edu\",\n            \"qlnrIsYSWCGUQW6f8HL@UBOqUYQQzugVL.uk\"\n          ],\n          \"dozen\": 12,\n          \"dozenOrBakersDozen\": 13,\n          \"favoriteEvenNumber\": 24,\n          \"married\": true,\n          \"age\": 17,\n          \"zip\": 65794,\n          \"topThreeFavoriteColors\": [\"blue\", \"black\", \"yellow\"],\n          \"favoriteSingleDigitWholeNumbers\": [2, 1, 3, 9],\n          \"ipAddresses\": [\"225.234.40.3\", \"96.216.243.54\", \"18.126.145.83\", \"196.17.191.239\"]\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"invalid data\",\n        \"data\": {\n          \"state\": null,\n          \"city\": 90912,\n          \"zip\": [null],\n          \"married\": \"married\",\n          \"dozen\": 90912,\n          \"dozenOrBakersDozen\": null,\n          \"favoriteEvenNumber\": -1294145,\n          \"emailAddresses\": [],\n          \"topThreeFavoriteColors\": [\n            null,\n            null,\n            0.7925170068027211,\n            1.2478632478632479,\n            1.173913043478261,\n            0.4472049689440994\n          ],\n          \"favoriteSingleDigitWholeNumbers\": [],\n          \"favoriteFiveLetterWord\": \"more than five letters\",\n          \"ipAddresses\": [\n            \"55.335.74.758\",\n            \"191.266.92.805\",\n            \"193.388.390.250\",\n            \"269.375.318.49\",\n            \"120.268.59.140\"\n          ]\n        },\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tests/schemas/medium.json",
    "content": "[\n  {\n    \"description\": \"medium schema from jsck benchmark (https://github.com/pandastrike/jsck)\",\n    \"schema\": {\n      \"description\": \"A moderately complex schema with some nesting and value constraints\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"api_server\", \"transport\", \"storage\", \"chain\"],\n      \"properties\": {\n        \"api_server\": {\n          \"description\": \"Settings for the HTTP API server\",\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"url\", \"host\", \"port\"],\n          \"properties\": {\n            \"url\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"host\": {\n              \"type\": \"string\"\n            },\n            \"port\": {\n              \"type\": \"integer\",\n              \"minimum\": 1000\n            }\n          }\n        },\n        \"transport\": {\n          \"description\": \"Settings for the Redis tranport\",\n          \"additionalProperties\": false,\n          \"required\": [\"server\"],\n          \"properties\": {\n            \"server\": {\n              \"type\": \"string\"\n            },\n            \"options\": {\n              \"type\": \"object\"\n            },\n            \"queues\": {\n              \"properties\": {\n                \"blocking_timeout\": {\n                  \"type\": \"integer\",\n                  \"minimum\": 0\n                }\n              }\n            }\n          }\n        },\n        \"storage\": {\n          \"description\": \"Settings for the PostgreSQL storage\",\n          \"required\": [\"server\", \"database\", \"user\"],\n          \"properties\": {\n            \"server\": {\n              \"type\": \"string\"\n            },\n            \"database\": {\n              \"type\": \"string\"\n            },\n            \"user\": {\n              \"type\": \"string\"\n            },\n            \"options\": {\n              \"type\": \"object\"\n            }\n          }\n        },\n        \"chain\": {\n          \"description\": \"Settings for the Chain.com client\",\n          \"required\": [\"api_key_id\", \"api_key_secret\"],\n          \"properties\": {\n            \"api_key_id\": {\n              \"type\": \"string\"\n            },\n            \"api_key_secret\": {\n              \"type\": \"string\"\n            }\n          }\n        }\n      }\n    },\n    \"tests\": [\n      {\n        \"description\": \"valid object from jsck benchmark\",\n        \"data\": {\n          \"api_server\": {\n            \"url\": \"http://example.com:8998\",\n            \"host\": \"example.com\",\n            \"port\": 8998\n          },\n          \"transport\": {\n            \"server\": \"127.0.0.1:6381\",\n            \"queues\": {\n              \"blocking_timeout\": 0\n            }\n          },\n          \"storage\": {\n            \"server\": \"127.0.0.1:5432\",\n            \"database\": \"thingy-test\",\n            \"user\": \"thingy-test\",\n            \"password\": \"password\"\n          },\n          \"chain\": {\n            \"api_key_id\": \"cafebabe\",\n            \"api_key_secret\": \"babecafe\"\n          }\n        },\n        \"valid\": true\n      },\n      {\n        \"description\": \"not object\",\n        \"data\": 1,\n        \"valid\": false\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "spec/tsconfig.json",
    "content": "{\n  \"extends\": \"..\",\n  \"include\": [\".\"],\n  \"compilerOptions\": {\n    \"types\": [\"node\", \"mocha\"],\n    \"noImplicitAny\": false\n  }\n}\n"
  },
  {
    "path": "spec/types/async-validate.spec.ts",
    "content": "import type {AnySchemaObject, SchemaObject, AsyncSchema} from \"../..\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ninterface Foo {\n  foo: number\n}\n\ndescribe(\"$async validation and type guards\", () => {\n  const ajv = new _Ajv({strictTypes: false})\n\n  describe(\"$async: undefined\", () => {\n    it(\"should have result type boolean 1\", () => {\n      const validate = ajv.compile<Foo>({\n        type: \"object\",\n        properties: {foo: {type: \"number\"}},\n      })\n      const data: unknown = {foo: 1}\n      let result: boolean\n      if ((result = validate(data))) {\n        data.foo.should.equal(1)\n      }\n      result.should.equal(true)\n    })\n\n    it(\"should have result type boolean 2\", () => {\n      const schema: SchemaObject = {\n        type: \"object\",\n        properties: {foo: {type: \"number\"}},\n      }\n      const validate = ajv.compile<Foo>(schema)\n      const data: unknown = {foo: 1}\n      let result: boolean\n      if ((result = validate(data))) {\n        data.foo.should.equal(1)\n      }\n      result.should.equal(true)\n    })\n\n    it(\"should have result type boolean 3\", () => {\n      const schema: AnySchemaObject = {\n        type: \"object\",\n        properties: {foo: {type: \"number\"}},\n      }\n      const validate = ajv.compile<Foo>(schema)\n      const data: unknown = {foo: 1}\n      let result: boolean\n      if ((result = validate(data))) {\n        data.foo.should.equal(1)\n      }\n      result.should.equal(true)\n    })\n  })\n\n  describe(\"$async: false\", () => {\n    it(\"should have result type boolean 1\", () => {\n      const validate = ajv.compile({$async: false})\n      const result: boolean = validate({})\n      should.exist(result)\n    })\n\n    it(\"should have result type boolean 2\", () => {\n      const schema: SchemaObject = {$async: false}\n      const validate = ajv.compile(schema)\n      const result: boolean = validate({})\n      should.exist(result)\n    })\n\n    it(\"should have result type boolean 3\", () => {\n      const schema: AnySchemaObject = {$async: false}\n      const validate = ajv.compile(schema)\n      const result: boolean = validate({})\n      should.exist(result)\n    })\n  })\n\n  describe(\"$async: true\", () => {\n    it(\"should have result type promise 1\", async () => {\n      const validate = ajv.compile<Foo>({\n        $async: true,\n        type: \"object\",\n        properties: {foo: {type: \"number\"}},\n      })\n      const result: Promise<Foo> = validate({foo: 1})\n      await result.then((data) => data.should.exist)\n    })\n\n    it(\"should have result type promise 2\", async () => {\n      const schema: AsyncSchema = {\n        $async: true,\n        type: \"object\",\n        properties: {foo: {type: \"number\"}},\n      }\n      const validate = ajv.compile<Foo>(schema)\n      const result: Promise<Foo> = validate({foo: 1})\n      await result.then((data) => data.foo.should.equal(1))\n    })\n  })\n\n  describe(\"$async: boolean\", () => {\n    it(\"should have result type boolean | promise 1\", async () => {\n      const schema = {\n        $async: true,\n        type: \"object\",\n        properties: {foo: {type: \"number\"}},\n      }\n      const validate = ajv.compile<Foo>(schema)\n      const data: unknown = {foo: 1}\n      let result: boolean | Promise<Foo>\n      if ((result = validate(data))) {\n        if (result instanceof Promise) {\n          await result.then((_data) => _data.foo.should.equal(1))\n        } else {\n          should.fail()\n        }\n      } else {\n        should.fail()\n      }\n    })\n\n    it(\"should have result type boolean | promise 2\", async () => {\n      const schema = {$async: false}\n      const validate = ajv.compile<any>(schema)\n      const result = validate({})\n      if (typeof result === \"boolean\") {\n        should.exist(result)\n      } else {\n        await result.then((data) => data.should.exist)\n      }\n    })\n  })\n\n  describe(\"$async: unknown\", () => {\n    const schema: Record<string, unknown> = {\n      type: \"object\",\n      properties: {foo: {type: \"number\"}},\n    }\n    const validate = ajv.compile<Foo>(schema)\n\n    it(\"should have result type boolean\", () => {\n      const data = {foo: 1}\n      let result: boolean\n      if ((result = validate(data))) {\n        data.foo.should.equal(1)\n      }\n      result.should.equal(true)\n    })\n  })\n\n  describe(\"schema: any\", () => {\n    const schema: any = {}\n    const validate = ajv.compile(schema)\n    it(\"should have result type boolean | promise\", () => {\n      const result: boolean = validate({})\n      result.should.equal(true)\n    })\n  })\n})\n"
  },
  {
    "path": "spec/types/error-parameters.spec.ts",
    "content": "import {DefinedError} from \"../..\"\nimport _Ajv from \"../ajv\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ndescribe(\"error object parameters type\", () => {\n  const ajv = new _Ajv({allErrors: true})\n\n  it(\"should be determined by the keyword\", () => {\n    const validate = ajv.compile({type: \"number\", minimum: 0, multipleOf: 2})\n    const valid = validate(-1)\n    valid.should.equal(false)\n    const errs = validate.errors\n    if (errs) {\n      errs.length.should.equal(2)\n      for (const err of errs as DefinedError[]) {\n        switch (err.keyword) {\n          case \"minimum\":\n            err.params.limit.should.equal(0)\n            err.params.comparison.should.equal(\">=\")\n            break\n          case \"multipleOf\":\n            err.params.multipleOf.should.equal(2)\n            break\n          default:\n            should.fail()\n        }\n      }\n    }\n  })\n})\n"
  },
  {
    "path": "spec/types/json-schema.spec.ts",
    "content": "import _Ajv from \"../ajv\"\nimport type {JSONSchemaType} from \"../..\"\nimport type {SchemaObject} from \"../..\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\ninterface MyData {\n  foo: string\n  bar?: number // \"boo\" should be present if \"bar\" is present\n  baz: {\n    quux: \"quux\"\n    [x: string]: string\n  }\n  boo?: true\n  tuple?: readonly [number, string]\n  arr: {id: number}[]\n  map: {[K in string]?: number}\n  notBoo?: string // should not be present if \"boo\" is present\n  negativeIfBoo?: number // should be negative if \"boo\" is present\n}\n\nconst arrSchema: JSONSchemaType<MyData[\"arr\"]> = {\n  type: \"array\",\n  items: {\n    type: \"object\",\n    properties: {\n      id: {\n        type: \"integer\",\n      },\n    },\n    additionalProperties: false,\n    required: [\"id\"],\n  },\n  uniqueItems: true,\n} as const\n\nconst mySchema: JSONSchemaType<MyData> & {\n  definitions: {\n    baz: JSONSchemaType<MyData[\"baz\"]>\n    tuple: JSONSchemaType<MyData[\"tuple\"]>\n  }\n} = {\n  type: \"object\",\n  definitions: {\n    baz: {\n      // schema type is checked here ...\n      type: \"object\",\n      properties: {\n        quux: {type: \"string\", const: \"quux\"},\n      },\n      patternProperties: {\n        abc: {type: \"string\"},\n      },\n      additionalProperties: false,\n      required: [],\n    },\n    tuple: {\n      // ... and here ...\n      type: \"array\",\n      items: [{type: \"number\"}, {type: \"string\"}],\n      minItems: 2,\n      additionalItems: false,\n      nullable: true,\n    },\n  },\n  dependencies: {\n    bar: [\"boo\"],\n    boo: {\n      not: {required: [\"notBoo\"]}, // optional properties can be cheched in \"required\" in PartialSchema\n      required: [\"negativeIfBoo\"],\n      properties: {\n        // partial properties can be used in partial schemas\n        negativeIfBoo: {type: \"number\", nullable: true, exclusiveMaximum: 0},\n      },\n    },\n  },\n  properties: {\n    foo: {type: \"string\"},\n    bar: {type: \"number\", nullable: true},\n    baz: {$ref: \"#/definitions/baz\"}, // ... but it does not check type here, ...\n    boo: {\n      type: \"boolean\",\n      nullable: true,\n      enum: [true, null],\n    },\n    tuple: {$ref: \"#/definitions/tuple\"}, // ... nor here.\n    arr: arrSchema, // ... The alternative is to define it externally - here it checks type\n    map: {\n      type: \"object\",\n      required: [],\n      additionalProperties: {type: \"number\"},\n    },\n    notBoo: {type: \"string\", nullable: true},\n    negativeIfBoo: {type: \"number\", nullable: true},\n  },\n  additionalProperties: false,\n  required: [\"foo\", \"baz\", \"arr\", \"map\"], // any other property added here won't typecheck\n} as const\n\ntype MyUnionData = {a: boolean} | string | number\n\nconst myUnionSchema: JSONSchemaType<MyUnionData> = {\n  anyOf: [\n    {\n      type: \"object\",\n      properties: {\n        a: {type: \"boolean\"},\n      },\n      required: [\"a\"],\n    },\n    {\n      type: [\"string\", \"number\"],\n      // can specify properties for either type\n      minimum: 0,\n      minLength: 1,\n    },\n  ],\n} as const\n\n// because of the current definition, you can do this nested recusion\nconst myNestedUnionSchema: JSONSchemaType<MyUnionData> = {\n  anyOf: [\n    {\n      oneOf: [\n        {\n          type: \"object\",\n          properties: {\n            a: {type: \"boolean\"},\n          },\n          required: [\"a\"],\n        },\n        {\n          type: \"string\",\n        },\n      ],\n    },\n    {\n      type: \"number\",\n    },\n  ],\n} as const\n\n// allowing union types necessarily allows this to pass :/\nconst emptyType: JSONSchemaType<MyData> = {\n  type: [],\n} as const\n\ntype MyEnumRecord = Record<\"a\" | \"b\" | \"c\" | \"d\", number | undefined>\n\ndescribe(\"JSONSchemaType type and validation as a type guard\", () => {\n  const ajv = new _Ajv({allowUnionTypes: true})\n\n  const validData: unknown = {\n    foo: \"foo\",\n    bar: 1,\n    baz: {\n      quux: \"quux\",\n      abc: \"abc\",\n    },\n    boo: true,\n    arr: [{id: 1}, {id: 2}],\n    tuple: [1, \"abc\"],\n    map: {\n      a: 1,\n      b: 2,\n    },\n    negativeIfBoo: -1,\n  }\n\n  describe(\"schema has type JSONSchemaType<MyData>\", () => {\n    it(\"should prove the type of validated data\", () => {\n      const validate = ajv.compile(mySchema)\n      if (validate(validData)) {\n        validData.foo.should.equal(\"foo\")\n      }\n      should.not.exist(validate.errors)\n\n      if (ajv.validate(mySchema, validData)) {\n        validData.foo.should.equal(\"foo\")\n      }\n      should.not.exist(ajv.errors)\n    })\n  })\n\n  const validUnionData: unknown = {\n    a: true,\n  }\n\n  describe(\"schema has type JSONSchemaType<MyUnionData>\", () => {\n    it(\"should prove the type of validated data\", () => {\n      const validate = ajv.compile(myUnionSchema)\n      if (validate(validUnionData)) {\n        if (typeof validUnionData === \"string\") {\n          should.fail(\"not a string\")\n        } else if (typeof validUnionData === \"number\") {\n          should.fail(\"not a number\")\n        } else {\n          validUnionData.a.should.equal(true)\n        }\n      } else {\n        should.fail(\"is valid\")\n      }\n      should.not.exist(validate.errors)\n\n      if (ajv.validate(myUnionSchema, validUnionData)) {\n        if (typeof validUnionData === \"string\") {\n          should.fail(\"not a string\")\n        } else if (typeof validUnionData === \"number\") {\n          should.fail(\"not a number\")\n        } else {\n          validUnionData.a.should.equal(true)\n        }\n      } else {\n        should.fail(\"is valid\")\n      }\n      should.not.exist(ajv.errors)\n    })\n\n    it(\"should prove the type of validated nested data\", () => {\n      const validate = ajv.compile(myNestedUnionSchema)\n      if (validate(validUnionData)) {\n        if (typeof validUnionData === \"string\") {\n          should.fail(\"not a string\")\n        } else if (typeof validUnionData === \"number\") {\n          should.fail(\"not a number\")\n        } else {\n          validUnionData.a.should.equal(true)\n        }\n      } else {\n        should.fail(\"is valid\")\n      }\n      should.not.exist(validate.errors)\n\n      if (ajv.validate(myNestedUnionSchema, validUnionData)) {\n        if (typeof validUnionData === \"string\") {\n          should.fail(\"not a string\")\n        } else if (typeof validUnionData === \"number\") {\n          should.fail(\"not a number\")\n        } else {\n          validUnionData.a.should.equal(true)\n        }\n      } else {\n        should.fail(\"is valid\")\n      }\n      should.not.exist(ajv.errors)\n    })\n\n    it(\"should fail for invalid unions\", () => {\n      // @ts-expect-error extra type\n      const extraSchema: JSONSchemaType<string | number> = {\n        type: [\"string\", \"number\", \"boolean\"],\n      } as const\n\n      // @ts-expect-error extra properties\n      const extraProps: JSONSchemaType<string, boolean> = {\n        type: [\"string\", \"boolean\"],\n        maximum: 5, // number property\n      } as const\n\n      // eslint-disable-next-line no-void\n      void [extraSchema, extraProps]\n    })\n  })\n\n  describe(\"schema has type SchemaObject\", () => {\n    it(\"should prove the type of validated data\", () => {\n      const schema = mySchema as SchemaObject\n      const validate = ajv.compile<MyData>(schema)\n      if (validate(validData)) {\n        validData.foo.should.equal(\"foo\")\n      }\n      should.not.exist(validate.errors)\n\n      if (ajv.validate<MyData>(schema, validData)) {\n        validData.foo.should.equal(\"foo\")\n      }\n      should.not.exist(ajv.errors)\n    })\n  })\n\n  describe(\"schema should be simple for record types\", () => {\n    it(\"typechecks a valid type without required\", () => {\n      const myEnumRecordSchema: JSONSchemaType<MyEnumRecord> = {\n        type: \"object\",\n        propertyNames: {enum: [\"a\", \"b\", \"c\", \"d\"]},\n        additionalProperty: {type: \"number\"},\n      }\n      // eslint-disable-next-line no-void\n      void myEnumRecordSchema\n    })\n\n    it(\"requires required for non-optional types\", () => {\n      // @ts-expect-error missing required\n      const requiredSchema: JSONSchemaType<{a: number}> = {\n        type: \"object\",\n      }\n      // eslint-disable-next-line no-void\n      void requiredSchema\n    })\n\n    it(\"doesn't require required for optional types\", () => {\n      const optionalSchema: JSONSchemaType<{a?: number}> = {\n        type: \"object\",\n      }\n\n      // eslint-disable-next-line no-void\n      void optionalSchema\n    })\n\n    it(\"won't accept nullable for non-null types\", () => {\n      // @ts-expect-error can't set nullable\n      const nonNullSchema: JSONSchemaType<{a: number}> = {\n        type: \"object\",\n        properties: {\n          a: {\n            type: \"number\",\n            nullable: true,\n          },\n        },\n        required: [],\n      }\n\n      // eslint-disable-next-line no-void\n      void nonNullSchema\n    })\n  })\n\n  describe(\"schema works for primitives\", () => {\n    it(\"allows partial boolean sub schemas\", () => {\n      // this schema doesn't have much meaning, but it wasn't allowed before\n      const trueSchema: JSONSchemaType<true> = {\n        type: \"boolean\",\n        not: {const: false},\n      } as const\n\n      // eslint-disable-next-line no-void\n      void trueSchema\n    })\n\n    it(\"validates simple null\", () => {\n      const nullSchema: JSONSchemaType<null> = {\n        type: \"null\",\n        nullable: true,\n        const: null,\n        enum: [null],\n      } as const\n      const validate = ajv.compile(nullSchema)\n      // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n      validate(null).should.be.true\n    })\n  })\n})\n\n// eslint-disable-next-line no-void\nvoid emptyType\n"
  },
  {
    "path": "spec/types/jtd-schema.spec.ts",
    "content": "/* eslint-disable @typescript-eslint/no-empty-interface,no-void,@typescript-eslint/ban-types */\nimport _Ajv from \"../ajv_jtd\"\nimport type {JTDSchemaType, SomeJTDSchemaType, JTDDataType} from \"../../dist/jtd\"\nimport chai from \"../chai\"\nconst should = chai.should()\n\n/** type is true if T is identically E */\ntype TypeEquality<T, E> = [T] extends [E] ? ([E] extends [T] ? true : false) : false\n\ninterface A {\n  type: \"a\"\n  a: number\n}\n\ninterface B {\n  type: \"b\"\n  b?: string\n}\n\ninterface C {\n  type: \"c\"\n}\n\ntype MyData = A | B\n\ntype Missing = A | C\n\ninterface LinkedList {\n  val: number\n  next?: LinkedList\n}\n\nconst mySchema: JTDSchemaType<MyData> = {\n  discriminator: \"type\",\n  mapping: {\n    a: {properties: {a: {type: \"float64\"}}},\n    b: {optionalProperties: {b: {type: \"string\"}}},\n  },\n}\n\nconst missingSchema: JTDSchemaType<Missing> = {\n  discriminator: \"type\",\n  mapping: {\n    a: {properties: {a: {type: \"float64\"}}},\n    c: {properties: {}},\n  },\n}\n\ndescribe(\"JTDSchemaType\", () => {\n  it(\"validation should prove the data type\", () => {\n    const ajv = new _Ajv()\n    const validate = ajv.compile(mySchema)\n    const validData: unknown = {type: \"a\", a: 1}\n    if (validate(validData) && validData.type === \"a\") {\n      validData.a.should.equal(1)\n    }\n    should.not.exist(validate.errors)\n\n    if (ajv.validate(mySchema, validData) && validData.type === \"a\") {\n      validData.a.should.equal(1)\n    }\n    should.not.exist(ajv.errors)\n  })\n\n  it(\"parser should return correct data type\", () => {\n    const ajv = new _Ajv()\n    const parse = ajv.compileParser(mySchema)\n    const validJson = '{\"type\": \"a\", \"a\": 1}'\n    const data = parse(validJson)\n    if (data !== undefined && data.type === \"a\") {\n      data.a.should.equal(1)\n    }\n    should.not.exist(parse.message)\n  })\n\n  it(\"serializer should only accept correct data type\", () => {\n    const ajv = new _Ajv()\n    const serialize = ajv.compileSerializer(mySchema)\n    const validData = {type: \"a\" as const, a: 1}\n    serialize(validData).should.equal('{\"type\":\"a\",\"a\":1}')\n    const invalidData = {type: \"a\" as const, b: \"test\"}\n    // @ts-expect-error\n    serialize(invalidData)\n  })\n\n  it(\"validation should prove the data type for missingSchema\", () => {\n    const ajv = new _Ajv()\n    const validate = ajv.compile(missingSchema)\n    const validData: unknown = {type: \"c\"}\n\n    if (validate(validData)) {\n      validData.type.should.equal(\"c\")\n    }\n    should.not.exist(validate.errors)\n\n    if (ajv.validate(missingSchema, validData)) {\n      validData.type.should.equal(\"c\")\n    }\n    should.not.exist(validate.errors)\n  })\n\n  it(\"should typecheck number schemas\", () => {\n    const numf: JTDSchemaType<number> = {type: \"float64\"}\n    const numi: JTDSchemaType<number> = {type: \"int32\"}\n    // @ts-expect-error\n    const numl: JTDSchemaType<number> = {type: \"int64\"}\n    // number literals don't work\n    // @ts-expect-error\n    const nums: JTDSchemaType<1 | 2 | 3> = {type: \"int32\"}\n    const numNull: JTDSchemaType<number | null> = {type: \"int32\", nullable: true}\n    // @ts-expect-error\n    const numNotNull: JTDSchemaType<number | null> = {type: \"float32\"}\n\n    void [numf, numi, numl, nums, numNull, numNotNull]\n  })\n\n  it(\"should typecheck boolean schemas\", () => {\n    const bool: JTDSchemaType<boolean> = {type: \"boolean\"}\n    // boolean literals don't\n    // @ts-expect-error\n    const boolTrue: JTDSchemaType<true> = {type: \"boolean\"}\n    const boolNull: JTDSchemaType<boolean | null> = {type: \"boolean\", nullable: true}\n\n    void [bool, boolTrue, boolNull]\n  })\n\n  it(\"should typecheck string schemas\", () => {\n    const str: JTDSchemaType<string> = {type: \"string\"}\n    const time: JTDSchemaType<string> = {type: \"timestamp\"}\n    const strNull: JTDSchemaType<string | null> = {type: \"string\", nullable: true}\n\n    void [str, time, strNull]\n  })\n\n  it(\"should typecheck dates\", () => {\n    const time: JTDSchemaType<Date> = {type: \"timestamp\"}\n    const timeNull: JTDSchemaType<Date | null> = {type: \"timestamp\", nullable: true}\n\n    void [time, timeNull]\n  })\n\n  it(\"should typecheck enumeration schemas\", () => {\n    const enumerate: JTDSchemaType<\"a\" | \"b\"> = {enum: [\"a\", \"b\"]}\n    // don't need to specify everything\n    const enumerateMissing: JTDSchemaType<\"a\" | \"b\" | \"c\"> = {enum: [\"a\", \"b\"]}\n    // must all be string literals\n    // @ts-expect-error\n    const enumerateNumber: JTDSchemaType<\"a\" | \"b\" | 5> = {enum: [\"a\", \"b\"]}\n    // can't overgeneralize in schema\n    // @ts-expect-error\n    const enumerateString: JTDSchemaType<\"a\" | \"b\"> = {type: \"string\"}\n    const enumerateNull: JTDSchemaType<\"a\" | \"b\" | null> = {enum: [\"a\", \"b\"], nullable: true}\n\n    void [enumerate, enumerateMissing, enumerateNumber, enumerateString, enumerateNull]\n  })\n\n  it(\"should typecheck elements schemas\", () => {\n    const elements: JTDSchemaType<number[]> = {elements: {type: \"float64\"}}\n    const readonlyElements: JTDSchemaType<readonly number[]> = {elements: {type: \"float64\"}}\n    // tuples don't work\n    // @ts-expect-error\n    const tupleHomo: JTDSchemaType<[number, number]> = {elements: {type: \"float64\"}}\n    // @ts-expect-error\n    const tupleHeteroNum: JTDSchemaType<[number, string]> = {\n      elements: {type: \"float64\"},\n    }\n    // @ts-expect-error\n    const tupleHeteroString: JTDSchemaType<[number, string]> = {\n      elements: {type: \"string\"},\n    }\n    const elemNull: JTDSchemaType<number[] | null> = {elements: {type: \"float64\"}, nullable: true}\n\n    // can typecheck an array of unions\n    const unionElem: TypeEquality<JTDSchemaType<(A | B)[]>, never> = false\n    // can't typecheck a union of arrays\n    const elemUnion: TypeEquality<JTDSchemaType<A[] | B[]>, never> = true\n\n    void [\n      elements,\n      readonlyElements,\n      tupleHomo,\n      tupleHeteroNum,\n      tupleHeteroString,\n      elemNull,\n      unionElem,\n      elemUnion,\n    ]\n  })\n\n  it(\"should typecheck values schemas\", () => {\n    const values: JTDSchemaType<Record<string, number>> = {values: {type: \"float64\"}}\n    const readonlyValues: JTDSchemaType<Readonly<Record<string, number>>> = {\n      values: {type: \"float64\"},\n    }\n    // values must be a whole mapping\n    // @ts-expect-error\n    const valuesDefined: JTDSchemaType<{prop: number}> = {values: {type: \"float64\"}}\n    const valuesNull: JTDSchemaType<Record<string, number> | null> = {\n      values: {type: \"float64\"},\n      nullable: true,\n    }\n\n    // can typecheck a values of unions\n    const unionValues: TypeEquality<JTDSchemaType<Record<string, A | B>>, never> = false\n    // can't typecheck a union of values\n    const valuesUnion: TypeEquality<\n      JTDSchemaType<Record<string, A> | Record<string, B>>,\n      never\n    > = true\n\n    void [values, readonlyValues, valuesDefined, valuesNull, unionValues, valuesUnion]\n  })\n\n  it(\"should typecheck properties schemas\", () => {\n    const properties: JTDSchemaType<{a: number; b: string}> = {\n      properties: {a: {type: \"float64\"}, b: {type: \"string\"}},\n    }\n    const optionalProperties: JTDSchemaType<{a?: number; b?: string}> = {\n      optionalProperties: {a: {type: \"float64\"}, b: {type: \"string\"}},\n      additionalProperties: false,\n    }\n    const mixedProperties: JTDSchemaType<{a: number; b?: string}> = {\n      properties: {a: {type: \"float64\"}},\n      optionalProperties: {b: {type: \"string\"}},\n      additionalProperties: true,\n    }\n    const fewerProperties: JTDSchemaType<{a: number; b: string}> = {\n      // @ts-expect-error\n      properties: {a: {type: \"float64\"}},\n    }\n    const propertiesNull: JTDSchemaType<{a: number; b: string} | null> = {\n      properties: {a: {type: \"float64\"}, b: {type: \"string\"}},\n      nullable: true,\n    }\n\n    void [properties, optionalProperties, mixedProperties, fewerProperties, propertiesNull]\n  })\n\n  it(\"should typecheck discriminator schemas\", () => {\n    const union: JTDSchemaType<A | B> = {\n      discriminator: \"type\",\n      mapping: {\n        a: {properties: {a: {type: \"float64\"}}},\n        b: {\n          optionalProperties: {b: {type: \"string\"}},\n        },\n      },\n    }\n    // can't mess up, e.g. value type isn't a union\n    const unionDuplicate: JTDSchemaType<A | B> = {\n      discriminator: \"type\",\n      mapping: {\n        a: {properties: {a: {type: \"float64\"}}},\n        // @ts-expect-error\n        b: {properties: {a: {type: \"float64\"}}},\n      },\n    }\n    // must specify everything\n    const unionMissing: JTDSchemaType<A | B> = {\n      discriminator: \"type\",\n      // @ts-expect-error\n      mapping: {\n        a: {properties: {a: {type: \"float64\"}}},\n      },\n    }\n    // can use any valid discrinimator\n    type Mult = JTDSchemaType<(A & {typ: \"alpha\"}) | (B & {typ: \"beta\"})>\n    const multOne: Mult = {\n      discriminator: \"type\",\n      mapping: {\n        a: {properties: {a: {type: \"float64\"}, typ: {enum: [\"alpha\"]}}},\n        b: {\n          properties: {typ: {enum: [\"beta\"]}},\n          optionalProperties: {b: {type: \"string\"}},\n        },\n      },\n    }\n    const multTwo: Mult = {\n      discriminator: \"typ\",\n      mapping: {\n        alpha: {properties: {a: {type: \"float64\"}, type: {enum: [\"a\"]}}},\n        beta: {\n          properties: {type: {enum: [\"b\"]}},\n          optionalProperties: {b: {type: \"string\"}},\n        },\n      },\n    }\n    const unionNull: JTDSchemaType<A | B | null> = {\n      discriminator: \"type\",\n      mapping: {\n        a: {properties: {a: {type: \"float64\"}}},\n        b: {\n          optionalProperties: {b: {type: \"string\"}},\n        },\n      },\n      nullable: true,\n    }\n\n    // properties must have common key\n    const noCommon: TypeEquality<\n      JTDSchemaType<{key1: \"a\"; a: number} | {key2: \"b\"; b: string}>,\n      never\n    > = true\n\n    void [union, unionDuplicate, unionMissing, multOne, multTwo, unionNull, noCommon]\n  })\n\n  it(\"should typecheck empty schemas\", () => {\n    const empty: JTDSchemaType<unknown> = {}\n    // unknown can be null\n    const emptyUnknown: JTDSchemaType<unknown> = {nullable: true}\n    // somewhat unintuitively, it can still have nullable: false even though it can be null\n    const falseUnknown: JTDSchemaType<unknown> = {nullable: false}\n    // can only use empty for empty and null\n    // @ts-expect-error\n    const emptyButFull: JTDSchemaType<{a: string}> = {}\n    const emptyMeta: JTDSchemaType<unknown> = {metadata: {}}\n\n    // constant null representable as nullable empty object\n    const emptyNull: TypeEquality<JTDSchemaType<null>, never> = true\n\n    void [empty, emptyUnknown, falseUnknown, emptyButFull, emptyMeta, emptyNull]\n  })\n\n  it(\"should typecheck empty records\", () => {\n    // empty record variants\n    const emptyPro: JTDSchemaType<{}> = {properties: {}}\n    const emptyOpt: JTDSchemaType<{}> = {optionalProperties: {}}\n    const emptyBoth: JTDSchemaType<{}> = {properties: {}, optionalProperties: {}}\n    const emptyRecord: JTDSchemaType<Record<string, never>> = {properties: {}}\n    const notNullable: JTDSchemaType<{}> = {properties: {}, nullable: false}\n\n    // can't be null\n    // @ts-expect-error\n    const nullable: JTDSchemaType<{}> = {properties: {}, nullable: true}\n\n    const emptyNullUnion: JTDSchemaType<null | {}> = {properties: {}, nullable: true}\n    const emptyNullRecord: JTDSchemaType<null | Record<string, never>> = {\n      properties: {},\n      nullable: true,\n    }\n\n    void [\n      emptyPro,\n      emptyOpt,\n      emptyBoth,\n      emptyRecord,\n      notNullable,\n      nullable,\n      emptyNullUnion,\n      emptyNullRecord,\n    ]\n  })\n\n  it(\"should typecheck ref schemas\", () => {\n    const refs: JTDSchemaType<number[], {num: number}> = {\n      definitions: {\n        num: {type: \"float64\"},\n      },\n      elements: {ref: \"num\"},\n    }\n    const missingDef: JTDSchemaType<number[], {num: number}> = {\n      // @ts-expect-error\n      definitions: {},\n      elements: {ref: \"num\"},\n    }\n    const missingType: JTDSchemaType<number[]> = {\n      definitions: {},\n      // @ts-expect-error\n      elements: {ref: \"num\"},\n    }\n    const nullRefs: JTDSchemaType<number | null, {num: number}> = {\n      definitions: {\n        num: {type: \"float64\"},\n      },\n      ref: \"num\",\n      nullable: true,\n    }\n    const refsNullOne: JTDSchemaType<number | null, {num: number | null}> = {\n      definitions: {\n        num: {type: \"float64\", nullable: true},\n      },\n      ref: \"num\",\n    }\n    const refsNullTwo: JTDSchemaType<number | null, {num: number | null}> = {\n      definitions: {\n        num: {type: \"float64\", nullable: true},\n      },\n      ref: \"num\",\n      nullable: true,\n    }\n\n    void [refs, missingDef, missingType, nullRefs, refsNullOne, refsNullTwo]\n  })\n\n  it(\"should typecheck metadata schemas\", () => {\n    const meta: JTDSchemaType<number> = {type: \"float32\", metadata: {key: \"val\"}}\n    const emptyMeta: JTDSchemaType<unknown> = {metadata: {key: \"val\"}}\n    const unknownMeta: JTDSchemaType<unknown> = {nullable: true, metadata: {key: \"val\"}}\n\n    void [meta, emptyMeta, unknownMeta]\n  })\n})\n\ndescribe(\"JTDDataType\", () => {\n  it(\"validation should prove the data type\", () => {\n    const ajv = new _Ajv()\n    const mySchema1 = {\n      discriminator: \"type\",\n      mapping: {\n        a: {properties: {a: {type: \"float64\"}}},\n        b: {optionalProperties: {b: {type: \"string\"}}},\n      },\n    } as const\n\n    const validate = ajv.compile(mySchema1)\n    const validData: unknown = {type: \"a\", a: 1}\n    if (validate(validData) && validData.type === \"a\") {\n      validData.a.should.equal(1)\n    }\n    should.not.exist(validate.errors)\n\n    if (ajv.validate(mySchema1, validData) && validData.type === \"a\") {\n      validData.a.should.equal(1)\n    }\n    should.not.exist(ajv.errors)\n  })\n\n  it(\"should typecheck number schemas\", () => {\n    const numSchema = {type: \"float64\"} as const\n    const num: TypeEquality<JTDDataType<typeof numSchema>, number> = true\n\n    void [num]\n  })\n\n  it(\"should typecheck boolean schemas\", () => {\n    const booleanSchema = {type: \"boolean\"} as const\n    const bool: TypeEquality<JTDDataType<typeof booleanSchema>, boolean> = true\n\n    void [bool]\n  })\n\n  it(\"should typecheck string schemas\", () => {\n    const strSchema = {type: \"string\"} as const\n    const str: TypeEquality<JTDDataType<typeof strSchema>, string> = true\n\n    void [str]\n  })\n\n  it(\"should typecheck timestamp schemas\", () => {\n    const timeSchema = {type: \"timestamp\"} as const\n    const time: TypeEquality<JTDDataType<typeof timeSchema>, string | Date> = true\n\n    void [time]\n  })\n\n  it(\"should typecheck enum schemas\", () => {\n    const enumSchema = {enum: [\"a\", \"b\"]} as const\n    const enumerated: TypeEquality<JTDDataType<typeof enumSchema>, \"a\" | \"b\"> = true\n\n    // if you forget const on an enum it will error\n    const enumStringSchema = {enum: [\"a\", \"b\"]}\n    const enumString: TypeEquality<JTDDataType<typeof enumStringSchema>, never> = true\n    // also if not a string\n    const enumNumSchema = {enum: [3]} as const\n    const enumNum: TypeEquality<JTDDataType<typeof enumNumSchema>, never> = true\n\n    void [enumerated, enumString, enumNum]\n  })\n\n  it(\"should typecheck elements schemas\", () => {\n    const elementsSchema = {elements: {type: \"float64\"}} as const\n    const elem: TypeEquality<JTDDataType<typeof elementsSchema>, number[]> = true\n\n    void [elem]\n  })\n\n  it(\"should typecheck properties schemas\", () => {\n    const bothPropsSchema = {\n      properties: {a: {type: \"float64\"}},\n      optionalProperties: {b: {type: \"string\"}},\n    } as const\n    const both: TypeEquality<JTDDataType<typeof bothPropsSchema>, {a: number; b?: string}> = true\n\n    const reqPropsSchema = {properties: {a: {type: \"float64\"}}} as const\n    const req: TypeEquality<JTDDataType<typeof reqPropsSchema>, {a: number}> = true\n\n    const optPropsSchema = {optionalProperties: {b: {type: \"string\"}}} as const\n    const opt: TypeEquality<JTDDataType<typeof optPropsSchema>, {b?: string}> = true\n\n    const noAddSchema = {\n      optionalProperties: {b: {type: \"string\"}},\n      additionalProperties: false,\n    } as const\n    const noAdd: TypeEquality<JTDDataType<typeof noAddSchema>, {b?: string}> = true\n\n    const addSchema = {\n      optionalProperties: {b: {type: \"string\"}},\n      additionalProperties: true,\n    } as const\n    const add: TypeEquality<\n      JTDDataType<typeof addSchema>,\n      {b?: string; [key: string]: unknown}\n    > = true\n    const addVal: JTDDataType<typeof addSchema> = {b: \"b\", additional: 6}\n\n    void [both, req, opt, noAdd, add, addVal]\n  })\n\n  it(\"should typecheck values schemas\", () => {\n    const valuesSchema = {values: {type: \"float64\"}} as const\n    const values: TypeEquality<JTDDataType<typeof valuesSchema>, Record<string, number>> = true\n\n    void [values]\n  })\n\n  it(\"should typecheck discriminator schemas\", () => {\n    const discriminatorSchema = {\n      discriminator: \"type\",\n      mapping: {\n        a: {properties: {a: {type: \"float64\"}}},\n        b: {optionalProperties: {b: {type: \"string\"}}},\n      },\n    } as const\n    const disc: TypeEquality<JTDDataType<typeof discriminatorSchema>, A | B> = true\n\n    void [disc]\n  })\n\n  it(\"should typecheck ref schemas\", () => {\n    const refSchema = {\n      definitions: {num: {type: \"float64\", nullable: true}},\n      ref: \"num\",\n      nullable: true,\n    } as const\n    const ref: TypeEquality<JTDDataType<typeof refSchema>, number | null> = true\n\n    // works for recursive schemas\n    const llSchema = {\n      definitions: {\n        node: {\n          properties: {val: {type: \"float64\"}},\n          optionalProperties: {next: {ref: \"node\"}},\n        },\n      },\n      ref: \"node\",\n    } as const\n    const list: TypeEquality<JTDDataType<typeof llSchema>, LinkedList> = true\n\n    void [ref, list]\n  })\n\n  it(\"should typecheck empty schemas\", () => {\n    const emptySchema = {metadata: {}} as const\n    const empty: TypeEquality<JTDDataType<typeof emptySchema>, unknown> = true\n\n    void [empty]\n  })\n})\n\ndescribe(\"SomeJTDSchemaType\", () => {\n  it(\"should allow setting unknowns\", () => {\n    // This test is basically here to assert that we should be using `{}` in\n    // SomeJTDSchemaType\n    const schema: SomeJTDSchemaType = {}\n\n    void [schema]\n  })\n})\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"@ajv-validator/config\",\n  \"include\": [\"lib\"],\n  \"compilerOptions\": {\n    \"outDir\": \"dist\",\n    \"lib\": [\"ES2018\", \"DOM\"],\n    \"types\": [\"node\"],\n    \"allowJs\": true,\n    \"target\": \"ES2018\",\n    \"resolveJsonModule\": true\n  }\n}\n"
  }
]